С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
1

Добавить кнопку с кодом

24.03.2011, 16:06. Просмотров 3622. Ответов 13
Метки нет (Все метки)

Уважаемые, подскажите код в ВБА следующего:
в активном документе в первой таблице в первой строке в третьей ячейке добавить кнопку, которая добавляется в документе следующим образом: Элементы управления => Кнопка со свойствами заголовок Кнопка1, Height 20, Width 40, Font Times New Roman, Size 14, код для выполнения действий по её нажатию: Beep. Точно знаю, что положительный ответ на этот вопрос есть, была у меня ранее ссылка, потерялась. Соль вопроса имено в добавлении кода Beep. Спасибо Эндрю
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2011, 16:06
Ответы с готовыми решениями:

Как добавить кнопку на лист
Подскажите пожалуйста, как сделать в EXCEL кнопку чтобы при ее нажатии...

Добавить кнопку на панель инструментов
Добавить кнопку на панель инструментов. Имя кнопки Почта FaceID 45...

Как добавить свою кнопку в Excel?
Собственно суть вопроса: в Word-е есть папка STARTUP (...application...

При нажатие кнопку все данные добавить на лист
Привет уважаемые, Как мне сделать так чтобы при нажатие кнопку все данные были...

Как добавить кнопку на Excel Ribbon на вкладке Home через макрос?
Мне нужно добавить кнопку на панель экселя, но чтобы она появилась НЕ на...

13
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
24.03.2011, 17:41 2
Кнопку сам добавишь, ниже даю код по добавлению в книгу нового стандартного модуля, именование этого модуля и вставка процедурки с Beep. Доступ к проектам VBA в настройках безопасности у тебя должен быть включен.
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub t_7()
    Dim vbc As VBComponent
    
    Set vbc = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
    vbc.Name = "MyModule"
    
    vbc.CodeModule.AddFromString "Sub MyButton()" & vbCrLf & "    Beep" & vbCrLf & "End Sub"
    
    Set vbc = Nothing
End Sub
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
24.03.2011, 17:45  [ТС] 3
Цитата Сообщение от mc-black Посмотреть сообщение
"Sub MyButton()" & vbCrLf & " Beep" & vbCrLf & "End Sub"
всё понял, спасибо, а если этих строчек в макросе, который нужно добавить штук сто???
0
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
24.03.2011, 18:08 4
Можно добавлять из файла
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub t_7()
    Dim vbc As VBComponent
    
    Set vbc = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
    vbc.Name = "MyModule"
    
    'vbc.CodeModule.AddFromString "Sub MyButton()" & vbCrLf & "    Beep" & vbCrLf & "End Sub"
    vbc.CodeModule.AddFromFile "C:\VBA\MyMacro.bas"
    
    Set vbc = Nothing
End Sub
Можно добавлять в существующий модуль. Можно проверять в существующем модуле, нет ли там случайно уже макроса с таким именем.

Кто-нибудь знает, как можно программно включить доступ к проектам VBA?
Есть мысль по созданию собственного VBA-протектора в виде native dll с зашифрованным & сжатым кодом VBA в секции ресурсов.
1
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
25.03.2011, 10:43  [ТС] 5
Кто-нибудь знает, как можно программно включить доступ к проектам VBA?
Есть мысль по созданию собственного VBA-протектора в виде native dll с зашифрованным & сжатым кодом VBA в секции ресурсов.


Никто не знает??, я тоже, спрошу на другом форуме

Добавлено через 2 часа 28 минут
Вот ответ:
Через Shell, внеся изменения в Реест. Приложение Excel должно быть в этот момент закрыто.

PureBasic
1
2
3
Set objShell = CreateObject("WScript.Shell")
objShell.RegWrite _
 "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security\AccessVBOM", 1, "REG_DWORD"
Вместо 12.0 - необходимая версия Excel. Это если про Excel речь. Если про другое приложение - то просто смотрим в реестре нужную ветку и применяем её.
ЗЫ:Мне нужно для Ворда
0
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
25.03.2011, 10:45 6
Узнал насчет включения галочки "Доверять доступ к Visual Basic Project". Надо установить ключ реестра AccessVBOM в единицу. Например, можно сделать слияние с реестром вот такого .reg-файла:

Код
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security]
"AccessVBOM"=dword:00000001
Остаются небольшие грабельки с закрытием всех экземпляров Excel в системе перед тем, как вносить это изменение в реестр, так как Excel при закрытии затирает значение реестра из переменной, которую он инициализирует при закгрузке. И на тот неприятный случай, если включен быстрый запуск приложений офис, не прокатит и этот вариант, так как при закрытии Excel эта программа остается не выгруженной. А вот если бы сделать это в рантайм-режиме путем правки переменной в области памяти процесса Excel, было бы совсем здорово.

P.S. Эндрю, извиняюсь, что поднимаю вопросы в твоей теме. Если ты против - создам в отдельной теме.
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
25.03.2011, 10:48  [ТС] 7
Цитата Сообщение от mc-black Посмотреть сообщение
P.S. Эндрю, извиняюсь, что поднимаю вопросы в твоей теме. Если ты против - создам в отдельной теме.
Нет не против, так Вы моё сообщение читали?
0
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
25.03.2011, 11:47 8
Нет, не читал. Я в это время искал ответ и писал. Так-то все ясно.
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
25.03.2011, 12:14  [ТС] 9
поделитесь, мне не ясно
0
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
25.03.2011, 13:25 10
Ну идея проста. Либо реестр надо править, когда Excel не запущен (а это в любом случае не сделать из Excel VBA), либо все-таки найдется способ отыскать в памяти тот самый заветный DWORD в адресном пространстве Excel, в котором хранится значение 0 или 1, в зависимости от настроек.

Многие возможно знают, что есть такая программка ArtMoney, позволяющая делать подобное с параметрами Игр, отвечающими за отображение количества ресурсов, баллов, уровня игры и т.п. Так вот, в принципе подобрать и найти эту переменную за несколько итераций в Excel возможно. Но дело в том, что прокатит это лишь на 1 сеанс, так как нет гарантии, что переменная всегда будет по одному адресу или смещению. Мне хочется получить программу, которая бы находила эту ячейку в адресном пространстве, записывала бы в эту переменную значение 1. Если повезет, уже только это позволит VBE работать, если нет - Excel по крайней мере не будет затирать значение переменной при закрытии, то есть можно будет попросить пользователя перезапустить Excel, но можно будет обойтись одним VBA. Знать бы ещё, как это можно сделать...)
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
25.03.2011, 14:07  [ТС] 11
как насчёт код в 5 сообщении
засунуть в файл vbs и выполнить его прям как bat-файл ???
0
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
25.03.2011, 15:05 12
Не подходит. Вот ты простой пользователь, неискушенный в VBA, тебе приходит по почте архив, в котором 2 файла: долгожданный супер-пупер файл с расчетами на VBA, который ты заказывал и с нетерпением ждал и еще какой-то непонятный файл с хрен знает чем. Ты какой файл первым откроешь? Я бы открыл .xls ... а потом тут же бы возмутился - ничего не работает, вылазят какие-то непонятные окна с предупреждениями об ОШИБКАХ!!!, может программист криворукий и все как попало сделал или это файл зараженный пришел с ВИРУСАМИ!!! Короче паника и нервы, до тех пор, пока не прочитают, что ты в письме дописал, мол сначала запустите vbs (или bat), а только потом открывайте рабочую книгу. Короче идея в том, чтобы все всегда работало безотказно как автомат, при этом предельно просто и с "защитой от дурака" и все в одном файле. Хочется самим макросом VBA сделать все "от и до".
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
25.03.2011, 17:41  [ТС] 13
так я понял, что этот батник надо один раз сделать, запустить и всё и речь идёт о себе, чтобы у меня работало, разве не так. Про остальных потом подумаю, я обычно им свой Нормал.дот даю, чтобы поставили на время

Добавлено через 14 минут
я, извините не могу понять, что нужно, но у меня для изменения реестра есть только один макрос
макрос:

PureBasic
1
2
3
4
5
6
7
8
9
Set WS = CreateObject("WScript.Shell")
'пытаемся удалить раздел
On Error Resume Next
WS.RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Security\"
 
If Err.Number <> 0 Then 'условие, если удалить не удалось, значит, раздела не было, тогда создаём его
WS.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Security\UFIControls", 1, "REG_DWORD"
End If
On Error GoTo 0
может это что то Вам подскажет
Макрос служит для: 'Изменение параметров реестра таким образом, чтобы UFIControls = 1

Добавлено через 56 минут
до этого я скрипт не пробовал, стал пробовать, странно:
PureBasic
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
'указываем с каким объектом работаем - Tables(1).Rows(1).Cells(3)
With ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes
Количество = ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Count
'удалим все существующие кнопки в объекте ...
Do While Количество > 0 'строго от конца к началу надо идти
ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Item(Количество).Delete
Количество = Количество - 1
Loop
        With .AddOLEControl("Forms.CommandButton.1")
            .Height = 20
            .Width = 40
            With .OLEFormat.Object
            .Caption = "Кнопка1"
            .Name = "MyButton"
                With .Font
                    .Name = "Times New Roman"
                    .Size = 14
                End With
            End With
        End With
    End With
 
 
Dim vbc As VBComponent 'функция не определена????
Set vbc = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
vbc.Name = "MyModule"
vbc.CodeModule.AddFromString "Sub MyButton()" & vbCrLf & "    Beep" & vbCrLf & "End Sub"
Set vbc = Nothing
Количество уменьшается верно но сами кнопки не удаляются из ячейки таблицы Ворда ????
и
Dim vbc As VBComponent 'функция не определена, библиотека?, какая? ????

Добавлено через 55 минут
кстати, мне в Ворде надо, строку:
Set vbc = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
так вероятно надо
Set vbc = ActiveDocument.VBProject.VBComponents.Add(vbext_ct_StdModule)
но всё равно: Dim vbc As VBComponent 'функция не определена, библиотека?, какая? ????
0
Ципихович Эндрю
1411 / 321 / 28
Регистрация: 10.04.2009
Сообщений: 5,042
28.03.2011, 13:23  [ТС] 14
PureBasic
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
'1 вариант
'указываем с каким объектом работаем - Tables(1).Rows(1).Cells(3)
With ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes
Количество = ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Count
'удалим все существующие кнопки в объекте ...
Do While Количество > 0 'строго от конца к началу надо идти
ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Item(Количество).Delete
Количество = Количество - 1
Loop
 
'2 вариант
'удаляем все кнопки в ... ячейке таблицы Ворд
Количество_кнопок = ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Count
Dim X As InlineShape
For Each X In ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes
If X.Type = wdInlineShapeOLEControlObject Then X.Delete
'или для более детального определения
'If X.OLEFormat.Object...
Next
Количество_кнопок_1 = ActiveDocument.Tables(1).Rows(1).Cells(3).Range.InlineShapes.Count
If Количество_кнопок = Количество_кнопок_1 Then Beep
'3 вариант , железный
ActiveDocument.Tables(1).Rows(1).Cells(3).Range.Text = ""
 
        With .AddOLEControl("Forms.CommandButton.1")
            .Height = 20
            .Width = 40
            With .OLEFormat.Object
            .Caption = "Кнопка1"
            .Name = "MyButton"
                With .Font
                    .Name = "Times New Roman"
                    .Size = 14
                End With
            End With
        End With
        End With
 
Dim vbc As VBComponent 'функция не определена????
Set vbc = ActiveDocument.VBProject.VBComponents.Add(vbext_ct_StdModule)
vbc.Name = "MyModule"
vbc.CodeModule.AddFromString "Sub MyButton()" & vbCrLf & "    Beep" & vbCrLf & "End Sub"
Set vbc = Nothing
То есть код по удалению всех кнопок из ячейки таблицы никому не известен?
Ладно выйду с положения проще, вариант номер 3, не выход но всё же, зато и плюс есть одной строкой всё решаем
Вопрос то сейчас, в строке
Dim vbc As VBComponent 'функция не определена, почему, что надо изменить????
0
28.03.2011, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2011, 13:23

Кнопку ОК связать с клавишей [Enter], кнопку Отмена – с клавишей [Escape]
Подскажите, пожалуйста как делается: Кнопку ОК связать с клавишей , кнопку...

Проблемы с кодом
Цель: добиться того чтобы нажимая нажимая на кнопку &quot;Выполнить расчет&quot;...

разобраться с кодом
Помогите разобраться с кодом. Я идиот в VB и нифига не знаю)) за прогу...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru