Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/27: Рейтинг темы: голосов - 27, средняя оценка - 4.96
 Аватар для Корректор
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 5

Как в программу VB вставить код записанный из VBA Excel?

13.02.2010, 01:00. Показов 5244. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброе время суток. Я начинаю изучать программирование на Visual Basic, и столкнулся с таким вопросом, каким образом код макроса, записанный в Microsoft Excel можно вставить в программу. Задача следующая: программа запускает файл (*.xls), через каждые две минуты повторяет ряд действий с возможностью остановки таймера. При закрытии программы книга Excel сохраняется и закрывается. Также хочется, чтоб программа работала только на моем рабочем компьютере, для чего необходимо произвести проверку системы. Код и саму программу прилагаю. Всем буду благодарен за помощь.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Option Explicit
Dim Ex As Excel.Application
Dim Tr As Long
Private Sub Command1_Click()
On Error Resume Next
Screen.MousePointer = vbHourglass
'Провера пользователя в общих свойствах системы
'например номер 17929-723-5873987-55698
'После чего программа работает дальше
'В противном случае закрывается
   Ex.Workbooks.Open App.Path & "\ME.xls"
   If Ex Is Nothing Then
    Set Ex = CreateObject("Excel.Application") 'Запускаем Excel
    Ex.Workbooks.Open App.Path & "\ME.xls"
   End If
 Ex.WindowState = xlMinimized
 Ex.Visible = True
  Command2.Enabled = True
  Command4.Enabled = True
  Command1.Enabled = False
Screen.MousePointer = vbDefault
End Sub
Private Sub Command2_Click() 'Включает таймер
Timer1.Interval = 1000
Tr = Val(2) * 60
  Command3.Enabled = True
  Command2.Enabled = False
End Sub
Private Sub Timer1_Timer()
'If Tr = 0 Then Cop
'Tr = Tr - 1
End Sub
Private Sub Command3_Click()
'Выключает таймер и выполнение "макроса"
  Command2.Enabled = True
  Command3.Enabled = False
End Sub
Private Sub Command4_Click() 'Сохранение и закрыттие Excel, выход из программы
Screen.MousePointer = vbHourglass
 Ex.Workbooks(1).Save
 Ex.Application.Quit
 Set Ex = Nothing
  Command1.Enabled = True
  Command2.Enabled = False
  Command3.Enabled = False
  Command4.Enabled = False
Screen.MousePointer = vbDefault
End
End Sub
Private Sub Cop()
'-----------------------------------------
'Как правильно написать код из макроса VBA
'-----------------------------------------
Screen.MousePointer = vbHourglass
    'Windows("ME.xls").Activate
    'Range("B2").Select
    'Selection.Copy
    'Range("B1").Select
    'ActiveSheet.Paste
    'Range("B3").Select
    'Application.CutCopyMode = False
    'Selection.Copy
    'Range("B2").Select
    'ActiveSheet.Paste
    'Range("B4").Select
    'Application.CutCopyMode = False
    'Selection.Copy
    'Range("B3").Select
    'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    '    :=False, Transpose:=False
    'Range("C1").Select
    'Application.CutCopyMode = False
Screen.MousePointer = vbDefault
End Sub
Excel.rar
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2010, 01:00
Ответы с готовыми решениями:

Как значение из VBA вставить в формули Excel
Помогите значение из ТЕXT.BOX ВСТАВИТЬ в формулу Excel,чтобы получилось что-то типа =А2*'Text.Box'.

Как на UserForm вставить Лист1 Excel? В VB это возможно, а в VBA?
Как на UserForm вставить Лист1 Excel? В VB это возможно, а в VBA?

Пользовательская функция на VBA для Excel - как вставить данные на лист?
Привет. Что-то я туплю - у меня функция возвращает массив из двух значений. Но на лист выкладывает одно. Не могу сообразить, как оба...

12
73 / 40 / 3
Регистрация: 07.02.2010
Сообщений: 72
14.02.2010, 20:21
Лучший ответ Сообщение было отмечено как решение

Решение

Как я понял, твой макрос не написан, а сгенерирован Excel. Лично я так не делаю(в целях универсальности и переноса скрипта в другие документы). Для твоего случая (я так понял тебе необходимо выполнить какие-то действия с документом Excel из внешнего приложения) - создаешь объект Excel (dim Exc as object : set Exc = createobject("excel")), далее с помощью него открываешь нужный документ... пардон в твоем куске кода это уже есть, обращаешься не к регионам по буквенно-цифровому адресу("B1"), а обращайся к объекту sheet(или activeSheet).cells(row,col) , тебе не придется использовать буфер обмена(как в твоем примере макроса), ты сможешь считать значения нужной ячейки в переменную (ну или напрямую в другую ячейку). Дальше можешь творить с данными все, что душе угодно(можешь вычисления произвести, рассортировать, выгрузить в конце-концов в БД что-ли). Прошу извинения за сумбур в ответе...

Добавлено через 7 минут
А по поводу запуска только на твоем компе есть пример получения имени компьютера(потом сравни полученое имя с оригиналом и если не сойдется программу заверши, таким образом твоя программа будет привязана к компу с определенным именем)

Примервзял где-то давно, источник не помню, но работает как часы)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Const MAX_COMPUTERNAME_LENGTH As Long = 31
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Sub Form_Load()
    Dim dwLen As Long
    Dim strString As String
    'создаем буфер
    dwLen = MAX_COMPUTERNAME_LENGTH + 1
    strString = String(dwLen, "X")
    'получаем имя компьютера
    GetComputerName strString, dwLen
    'get only the actual data
    strString = Left(strString, dwLen)
    'показываем имя компьютера
    MsgBox strString
End Sub
4
 Аватар для Корректор
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 5
15.02.2010, 21:49  [ТС]
Цитата Сообщение от kres Посмотреть сообщение
пример получения имени компьютера
Благодарю за пример, проверил действительно работает
А вот по этому совету:
Цитата Сообщение от kres Посмотреть сообщение
обращаешься не к регионам по буквенно-цифровому адресу("B1"), а обращайся к объекту sheet(или activeSheet).cells(row,col)
составил следующий код, и почему то не работает

Visual Basic
1
2
3
Private Sub Command2_Click()
ActiveWorkbook.Sheets("Лист3").Activate
ActiveSheet.Cells(2, 2).Cut Destination:=Cells(1, 2)
И как запустить таймер на непрерывное выполнение задачи, с возможностью механической остановки кнопкой "Private Sub Command3_Click()"
0
73 / 40 / 3
Регистрация: 07.02.2010
Сообщений: 72
15.02.2010, 22:34
Для начала:
Visual Basic
1
2
3
4
Private Sub Command2_Click()
ActiveWorkbook.Sheets("Лист3").Activate
 
ActiveSheet.Cells(1, 2)=ActiveSheet.Cells(2, 2)
и все, никаких обращений к буферу обмена

если содержимое ячейки нужно именно как бы вырезать (очистить) то:

ActiveSheet.Cells(2, 2)=""

и все

Добавлено через 11 минут
Насчет таймера:

Размещаешь где хочешь(на любой твоей форме), свойство interval = милисекунд, свойство enabled=true, в обработке события Timer1_timer() пишешь нужный код, но.... в коде размещаешь оператор обработки прерываний DoEvents. В этом месте система будет ожидать событий, а наша задача его подсунуть скажем в событие KeyDown формы (если код клавиши равен... можно с шифтом, то Timer1.interval=0, Timer1.Enable=False и вывалиться из программы например).
1
 Аватар для Корректор
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 5
15.02.2010, 22:42  [ТС]
Спасибо с замещением ячеек все понятно только при запуске приложения выкидывает ошибку





как с ней быть?
0
73 / 40 / 3
Регистрация: 07.02.2010
Сообщений: 72
15.02.2010, 22:58
Понял, прозевал моментик

Visual Basic
1
ActiveWorkbook.Sheets("Лист3").Activate
исправь на ActiveWorkbook.Sheets("Лист3").selected

Добавлено через 6 минут
и еще перед этим всем нужно получить экземпляры обьектов директивой Set

Visual Basic
1
2
3
4
5
6
Set Ex = CreateObject("Excel.Application") 'Запускаем Excel
    Ex.Workbooks.Open App.Path & "\ME.xls"
    with ex
           .ActiveWorkbook.Sheets("Лист3").selected 
           
    end with
Добавлено через 8 минут
Вот для примера куски моего кода на схожую тему, думаю разберешься:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Dim mExcel As Object
Dim mapWorkBookOut As Object
Dim mWorkSheet As Object
 
 
 
Sub AddPriceToXLS()
On Error Resume Next
Dim i As Long
 
Set mExcel = CreateObject("Excel.Application")
после add в скобках путь к файлу или пустая строка ""
Set mapWorkBookOut = mExcel.Workbooks.Add(App.Path & "\Data\blanc_new.xlt") 'blanc.xlt
 
  'создание обьекта листа книги
  Set mWorkSheet = mapWorkBookOut.Sheets.Item(1) 
  mWorkSheet.Select
 
With frmZakaz.gridPozCena
For i = 0 To .Rows - 1
  If i < 13 Then
    mWorkSheet.Cells(i + 8, 2) = .TextMatrix(i, 0) 'íàçâàíèå ïîçèöèè
    mWorkSheet.Cells(i + 8, 4) = .TextMatrix(i, 1) 'ïðèçíàê ïðàâ.-ëåâ.
    mWorkSheet.Cells(i + 8, 6) = .TextMatrix(i, 2) 'êîëè÷åñòâî
    mWorkSheet.Cells(i + 8, 8) = .TextMatrix(i, 3) 'öåíà
    'mWorkSheet.Cells(i + 8, 9)=.TextMatrix(i,4)'ñóììà(ñ÷èòàåòñÿ øàáëîíîì ïî ôîðìóëå)
  ElseIf i >= 13 Then
    mWorkSheet.Cells(i + 8 - 13, 12) = .TextMatrix(i, 0) 'тут данные разных типов
    mWorkSheet.Cells(i + 8 - 13, 15) = .TextMatrix(i, 1) 'ïðèçíàê ïðàâ.-ëåâ.
    mWorkSheet.Cells(i + 8 - 13, 19) = .TextMatrix(i, 2) 'êîëè÷åñòâî
    mWorkSheet.Cells(i + 8 - 13, 25) = .TextMatrix(i, 3) 'öåíà
    'mWorkSheet.Cells(i + 8-13, 29)=.TextMatrix(i,4)'ñóììà(ñ÷èòàåòñÿ øàáëîíîì ïî ôîðìóëå)
  End If
Next i
End With
 
End Sub
это из рабочей проги, выплевывает данные в Excel, но принцип тот же (без разницы где брать данные и куда их писать)
1
 Аватар для Корректор
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 5
16.02.2010, 21:35  [ТС]
файл "\ME.xls" запущен
Цитата Сообщение от kres Посмотреть сообщение
исправь на ActiveWorkbook.Sheets("Лист3").selected
исправил но все равно выдает туже ошибку.


И прошу пояснить для чего необходим оператор выполнения последовательности команд "with...end with" и какие экземпляры обьектов нужно получить директивой Set
0
73 / 40 / 3
Регистрация: 07.02.2010
Сообщений: 72
16.02.2010, 22:08
Операционные скобки With ..... End With служат для сокращения записи. К примеру чтоб не набивать в каждой строчке Form1.Picture1 при обращении к свойствам Picture1(если их скажем кучу сразу поменять захотелось) пишем:
Visual Basic
1
2
3
4
5
6
7
With Form1.Picture1
  .left=1
  .top=1
  .height=300
  .width=300
  .picture=loadpicture("")
End With
согласись так попроще и буков меньше.

Добавлено через 8 минут
по поводу ошибки:

на скрине VB ругается на обьект которого нет, в данном случае это и ActiveWorkBook и ActiveWorkBook.Sheets

Сделай так:
Visual Basic
1
2
3
4
5
6
   Set mExcel = CreateObject("Excel.Application")
   Set mapWorkBookOut = mExcel.Workbooks.Add(тут путь к твоему файлу excel) 
 
  'создание обьекта листа книги
  Set mWorkSheet = mapWorkBookOut.Sheets.Item(1)'тут выделяется лист книги по индексу, можно и по имени(навскидку не помню что-то типа .Sheets.Name("Имя листа")) 
  mWorkSheet.Select
теперь твой рабочий лист mWorkSheet

дальше по примеру
Visual Basic
1
2
mWorkSheet.cells(1,2)=mWorkSheet.cells(2,2)
mWorkSheet.cells(2,2)=""
Добавлено через 4 минуты
Про обьекты забыл написать
mExcel - экземпляр Excel, как бы базовый обьект, он создает/открывает книгу - mapWorkBookOut в которой есть лист - mWorkSheet с которым мы в данный момент работаем.

Таким образом тебе нужны три обьекта, создаем их директивой Set.

Добавлено через 4 минуты
Еще пунктик!!! после работы с обьектами их обязательно нужно зачистить, иначе может даже процесс в памяти остаться навсегда.

Visual Basic
1
2
3
4
5
'разрешаем документу вывестись на экран
  mExcel.Application.Visible = True
   'зачистка памяти от обьектов
   Set mExcel = Nothing
   Set mapWorkBookOut = Nothing
1
 Аватар для Корректор
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 5
16.02.2010, 22:40  [ТС]
Огромное спасибо за разъяснения.
Теперь буду весь раздел собирать в первоначальный код "задачу"
Еще раз благодарю kres, будут вопросики задам.
0
 Аватар для Kir@
90 / 58 / 7
Регистрация: 07.02.2010
Сообщений: 732
26.12.2010, 07:48
Здрям! Продолжу тему:

Сгенерировал в Экселе код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Макрос1()
 
    Workbooks.Open Filename:="C:\temp\3.xls"
    Workbooks.Open Filename:="C:\temp\1.xls"
    Cells.Select
    Range("R1").Activate
    Selection.Copy
    ActiveSheet.Paste
    Rows("1:2").Select
    Selection.Delete Shift:=xlUp
    Windows("3.xls").Activate
    ActiveWorkbook.Close False
 
ля-ля-ля
ля-ля-ля
ля-ля-ля
   
    ActiveWorkbook.SaveAs Filename:="C:\temp\!ТОП" & "_" & Date & ".csv", FileFormat:=xlCSV, CreateBackup:= _
        False
End Sub
Покажите пожалуйста, как его вставить в VB.
Мой с ним бой рождает только дополнительные ошибки.

Добавлено через 18 минут
P.S. После таки импорта этого кода в VB (предполагаю, что очень некорректного ) выдает сообщение, что Range, Row, Columns не определены.
0
 Аватар для Kir@
90 / 58 / 7
Регистрация: 07.02.2010
Сообщений: 732
14.01.2011, 19:02
Вот как нерадивым студентам задачки решать, так это вообще без базара, а как что посерьезнее, так тишина гробовая.

Подскажите тогда, пожалуйста, пару хороших книг по данному вопросу.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
14.01.2011, 21:27
Kir@,
т.е. нужно работать через VB в Excel?
Библиотеку Excel надо подключить. Как это сделать, сейчас не знаю.
1
 Аватар для Kir@
90 / 58 / 7
Регистрация: 07.02.2010
Сообщений: 732
15.01.2011, 16:11
PureBasic
1
2
set acApp= CreateObject("Excel.Application")
acApp.Workbooks.Open "P:\IT\tmp.xls"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2011, 16:11
Помогаю со студенческими работами здесь

Excel+VBA как программно вставить и сохранить на листе картинку из внешнего файла?
Здравствуйте! Вопрос следующий: есть лист Excel и картинка, которая лежит в одной из папок. Мне необходимо считать ее из файла и...

Как защитить VBA код в EXCEL?
Сделать нередактируемым или еще лучше - спрятать?

Как составить короткий код VBA (Excel) для задачи?
Здравствуйте! Интересно, какой будет самый короткий код VBA для детской задачи ниже. Условия. Три велосипедиста должны проехать из...

Вставить в код VBA код на другом языке
Доброго времени суток, форумчане! Скажите пожалуйста, как в при написании кода VBA, в него вставить участок кода на другом языке, допустим...

Вставить строку на VBA Excel
Здраствуйте!!) Помогите пожалуйста! Что то явно не так делаю в общем у меня в Книге в Excel две кнопочки, им соответствуют два макроса....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru