Консультация № 178743
30.05.2010, 10:17
35.77 руб.
0 11 2
Уважаемые эксперты, подскажите в следующем:
Как правило, папка автозагрузки документов Word находится по следующему ад-ресу:
C:\Documents and Settings\<ИмяПользователя>\Application Data\Microsoft\Word\Startup\
или
C:\Program Files\Microsoft Office\Office11\Startup\
Узнать точное местонахождение папки Startup на своём компьютере Вы можете через диалоговое окно Параметры (меню Сервис – команда Параметры – вклад-ка Расположение – тип файлов: автозагружаемые).
Как это узнать программно при помощи ВБА???
Для того что-бы что-то изменять в макросах программно, нужно ставить птич-ку(ключ в реестре) разрешающую это делать - может не быть прав, следовательно не везде получится.
Как дойти до этого места вручную, можно ли это сделать при помощи ВБА???
Эндрю

Обсуждение

давно
Модератор
137394
1850
30.05.2010, 11:55
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Узнать точное местонахождение папки Startup на своём компьютере Вы можете через диалоговое окно Параметры (меню Сервис – команда Параметры – вклад-ка Расположение – тип файлов: автозагружаемые).
Или:

MsgBox Application.StartupPath

5
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
30.05.2010, 12:41
общий
Осталась вторая часть вопроса:
Для того что-бы что-то изменять в макросах программно, нужно ставить птич-ку(ключ в реестре) разрешающую это делать - может не быть прав, следовательно не везде получится.
Как дойти до этого места вручную, можно ли это сделать при помощи ВБА???
Эндрю
давно
Модератор
137394
1850
30.05.2010, 15:25
общий
Ципихович Эндрю:
Конкретнее, о какой птичке идёт речь, в какой ветке реестра, или это Ваши предположения? И, еще лучше, что Вы предполагаете сделать? Как программно Вы намереваетесь это осуществить?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
30.05.2010, 18:07
общий
Megaloman:
Честно сказать я не знаю о какой птичке идёт речь, поэтому и спрашиваю, эту информацию нашёл в сети сейчас переспрошу. Что я хочу сделать, например удалить макрос А, как програмно ну по логике дожно быть так Application.макрос А.Delete. Я понимаю может это выглядет не серьёзно, но почему бы и не так, не вижу препятствий, главное не удалить сук на котором сидишь, остальное всё можно.
Неизвестный
30.05.2010, 19:44
общий
это ответ
Здравствуйте, Ципихович Эндрю.

Чтобы включить доступ к проектам Visual Basic, выполните следующие действия.

  • В меню Сервис выделите пункт Макрос и выберите команду Безопасность.
  • На вкладке Надежные источники установите флажок Доверять доступ к Visual Basic Project.

При помощи VBA этого сделать нельзя, ведь какой толк от защиты програмного изменения макросов, если ее можно убрать из макроса?

Вот примеры создания и удаления модуля
Код:
Sub Создание_модуля()
With ThisDocument.VBProject.VBComponents.Add(vbext_ct_StdModule)
.Name = "new_module"
.CodeModule.InsertLines 1, "Sub One()"
.CodeModule.InsertLines 2, "MsgBox ""Меня создали автоматически с помощью VBA"""
.CodeModule.InsertLines 3, "End Sub"
End With
End Sub

Sub Удаление_модуля()
Dim Rm As VBComponent
For Each Rm In ThisDocument.VBProject.VBComponents
If Rm.Name = "new_module" Then
ThisDocument.VBProject.VBComponents.Remove Rm
Exit For
End If
Next Rm
End Sub

5
Неизвестный
30.05.2010, 20:12
общий
Измалков Эдуард Леонидович:
Даже не ожидал, что можна добавлять макросы, респект. Мне известно, что можно добавить например кнопку в документ.
Но теперь получается что и код для неё можно записать в документ програмно вместе с её добавлением, так?
Если да то как?
Неизвестный
30.05.2010, 20:21
общий
Ципихович Эндрю:
Пусть есть кнопка "CommandButton1", тогда так
Код:
Sub Добавление_кода_кнопки()
With ThisDocument.VBProject.VBComponents("ThisDocument").CodeModule ' код добавляется в ThisDocument
Dim Имя_кнопки As String, Имя_процедуры As String
Имя_кнопки = "CommandButton1" ' здесь нужно будет поменять для другой кнопки
Имя_процедуры = Имя_кнопки & "_Click"
If .Find(Target:=Имя_процедуры, startline:=1, startcolumn:=1, endline:=-1, endcolumn:=-1, WholeWord:=True, MatchCase:=False) Then ' поиск, если есть уже такая процедура (-1 указывает на последнюю строку и последний столбец в модуле)
.DeleteLines .ProcStartLine(Имя_процедуры, vbext_pk_Proc), .ProcCountLines(Имя_процедуры, vbext_pk_Proc) ' удаляются строки от первой строки процедуры в количестве строк сколько эта процедура их содержит
End If
.InsertLines 1, "Private Sub " & Имя_процедуры & "()" ' добавление новой процедуры
.InsertLines 2, "MsgBox ""Press another key"""
.InsertLines 3, "End Sub"
End With
End Sub
Неизвестный
30.05.2010, 20:43
общий
Измалков Эдуард Леонидович:
Я протестировал Ваш код в указанном месте указанное сделал
(В меню Сервис выделите пункт Макрос и выберите команду Безопасность.
На вкладке Надежные источники установите флажок Доверять доступ к Visual Basic Project.)

На строке
With ThisDocument.VBProject.VBComponents.Add(vbext_ct_StdModule) получил ошибку 440
Method Add of object _VBCoponents failed, если игнорировать ошибку, поставить переменную Текст_ошибки = Err.Description, тогда ей присваивается Automation Error
Почему они не совпадают и главное макрос то не записался
Этой строкой: .Name = "new_module"
Вы ещё и модуль добавляете??
Или надо чтобы он был уже, если чтобы уже чтобы был как их все проверить чтобы не попасть впросак
Неизвестный
30.05.2010, 20:52
общий
Ципихович Эндрю:
Зайдите в Tools-References, там найдите Microsoft Visual Basic for Applications Extensibility и поставьте напротив них галочку. У меня, при наборе этой строки, VBA ругнулся, что они не подключены и предложил подключить их самому. Может это особенность появилась с каким-либо обновлением, а может и нет, поэтому попробуйте тоже набрать эту строку самому, может предложит. Если же нет, тогда поставьте галочку вручную.
Модуль я создаю и в дальнейшем даю ему имя. Чтобы не попасть в просак можно в процессе создания модуля удалить уже существующий модуль с этим именем. Т.е.
Sub Создание_модуля()
Удаление_модуля()
.
.
дальше без изменений
.
.
Неизвестный
30.05.2010, 20:57
общий
Измалков Эдуард Леонидович:
По кнопке на строке:
.DeleteLines .ProcStartLine(Имя_процедуры, vbext_pk_Proc), .ProcCountLines(Имя_процедуры, vbext_pk_Proc)
получаю такую же ошибку 440 Method Add of object _VBCoponents failed, но чтобы до неё добраться, увидеть первый раз мне открылись взоры кнопки Continue
Неизвестный
30.05.2010, 20:59
общий
Измалков Эдуард Леонидович:
Сообщение Выше писал не видя Вашего может оно решает проблему, подождите не пишите
Форма ответа