#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)
Ответ №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 и программно добавить к нему код.