Как обратиться к VBProject в другой рабочей книге xlsm?

#vba #excel

#vba #excel

Вопрос:

Мне нужно написать макрос, который создаст новую книгу test.xlsm и назначит vb код ее первому листу (Sheet1).

  Sub AddCode()
        Dim wb As Workbook
        Set wb = Workbooks.Add
        Dim ws As Worksheet
        Set ws = wb.Worksheets(1)

        Dim code As String
        code = "Sub test()" amp; vbCrLf amp; MsgBox "Test" amp; vbCrLf amp; "End Sub"
        Dim lineCount As Integer

        With wb.VBProject.VBComponents(ws.Name).CodeModule
            lineCount = .CountOfLines
            If lineCount > 0 Then
                .DeleteLines 1, lineCount
            End If
            .AddFromString code
        End With

      wb.Save FileName:="C:UsersOwnerDesktoptest.xlsm", FileFormat:=52
      wb.Close
    End Sub
  

Я получаю subscript out of range ошибку. Я предполагаю, что я имею в виду неправильный проект vb

(PS: под «присвоением кода первому листу» я подразумеваю следующее: Right Click on the Sheet1 -> View Code -> Paste my code to the Module )

Комментарии:

1. wb.VBProject.VBComponents(ws.Name) — у вас действительно есть лист с кодовым именем Sheet1 в test2.xlsm?

2. Да, у меня есть этот лист. Я не уверен, что это кодовое имя, но там написано «Sheet1»

3. У меня там только один лист, поэтому я попытался указать на него как Worksheets(1)

4. ozgrid.com/VBA/excel-vba-sheet-names.htm

Ответ №1:

Вы можете сохранить свою книгу как надстройку, а затем загрузить ее в Excel. Затем вы можете добавить ссылку на надстройку из редактора VBE и получить доступ к функциям / подразделениям.

Вы можете погуглить руководства Чипа Пирсона и другие подобные материалы для подобных вещей. Здесь он объясняет, как вы можете управлять редактором Visual Basic для программного добавления кода и т.д. Возможно, полезно в вашем случае.

Ссылка:http://www.cpearson.com/Excel/VBE.aspx

Просто для удобства использования (все с вышеупомянутого веб-сайта Чипа Пирсона)

Добавление модуля в проект:

 Sub AddModuleToProject()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents.Add(vbext_ct_StdModule)
    VBComp.Name = "NewModule"
End Sub
  

и самое главное, добавление Подпрограммы в модуль:

  Sub AddProcedureToModule()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents("Module1")
    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CountOfLines   1
        .InsertLines LineNum, "Public Sub SayHello()"
        LineNum = LineNum   1
        .InsertLines LineNum, "    MsgBox " amp; DQUOTE amp; "Hello World" amp; DQUOTE
        LineNum = LineNum   1
        .InsertLines LineNum, "End Sub"
    End With
End Sub
  

Другой способ — просто выполнить следующее

 Dim FileNameStr as String, Path as String
' Set these two to the correct strings
Dim wb as Workbook

set wb = workbooks.open(Path amp; "" amp; FileNameString)
Application.Run (wb.Name amp; "!NameOfYourMacro")
  

Таким образом, вы можете запустить макрос без аргументов


Конечно, это всего лишь ядро кода. После этого вам все равно нужно все убрать, закрыть рабочие книги, возможно, установить их как доступные только для чтения при открытии и т.д. Но вы уловили суть.

Комментарии:

1. итак, было ли это полезно в вашем случае?

2. 1 Спасибо. Но у меня был другой вопрос. Мне нужно было добавить VB во вторую книгу

3. Я ссылался на путь к решению … а именно. Пирсон. Взгляните сюда cpearson.com/Excel/VBE.aspx

4. В нем также показано, как создать новый модуль в новом файле Excel и программно добавить к нему код.