Я пытаюсь создать новый элемент управления ActiveX CommandButton с помощью Excel VBA. У меня есть цикл VBA, который работал в прошлом, theFile1.1.xlsm имеет главный список книг. Мне нужно добавить CommandButton в ~ 3200 книг, поэтому я буду использовать макрос Do-Loop. Вот код цикла для справки.
Sub Macro2()
Application.ScreenUpdating = False
Dim sFile As String
Dim wb As Workbook
Dim FileName1 As String
Dim FileName2 As String
Dim wksSource As Worksheet
Const scWkbSourceName As String = "theFILE 1.1.xlsm"
Set wkbSource = Workbooks(scWkbSourceName)
Set wksSource = wkbSource.Sheets("Sheet1") ' Replace 'Sheet1' w/ sheet name of SourceSheet
Const wsOriginalBook As String = "theFILE 1.1.xlsm"
Const sPath As String = "E:\ExampleFolder\"
SourceRow = 5
Do While Cells(SourceRow, "D").Value <> ""
Sheets("Sheet1").Select
FileName1 = wksSource.Range("A" & SourceRow).Value
FileName2 = wksSource.Range("K" & SourceRow).Value
sFile = sPath & FileName1 & "\" & FileName2 & ".xlsm"
Set wb = Workbooks.Open(sFile)
''insert code for loop operation
'''CLOSE WORKBOOK W/O BEFORE SAVE
Application.EnableEvents = False
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.EnableEvents = True
SourceRow = SourceRow + 1
Loop
End Sub
Я хотел бы, чтобы кнопка была установлена как переменная (я думаю), чтобы я мог редактировать форматирование / свойства и, надеюсь, позже добавить макрос к кнопке.
Dim buttonControl As MSForms.CommandButton
Set buttonControl = _
ActiveSheet.OLEObjects.Add(ClassType: = "Forms.CommandButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=1464, Top:=310, Width:=107.25, Height:=30)
With buttonControl.Opject
.Caption = "OPEN FOLDER"
.Name = "cmd_OPEN_FOLDER"
End With
У меня возникает ошибка «Ошибка выполнения 13: несоответствие типов». Я не уверен, почему, потому что CommandButton1 создается в правильном месте.
@dwirony Я в недоумении. Что вы рекомендуете?
Это не опечатка Object?
Ой! Вы правы, но проблема не в этом. проблема должна быть на этой строке или сразу после нее. Установите buttonControl = _ ActiveSheet.OLEObjects.Add (ClassType: = "Forms.CommandButton.1", _ Link: = False, _ DisplayAsIcon: = False, _ Left: = 1464 , Верх: = 310, ширина: = 107,25, высота: = 30)
Какая строка выделяется при возникновении ошибки? И, как я уже сказал, я полагаю, что вам здесь не нужен .Object - просто With buttonControl. .Caption является собственностью CommandButton.


OLEObjects.Add создает OLEObject и добавляет его в коллекцию OLEObjects; объект, возвращаемый функцией Add, - это OLEObject, а не MSForm.CommandButton. Это базовый тип OLEObject.Object - поэтому установите для вашего buttonControl свойство .Object возвращаемого объекта:
Set buttonControl = _
ActiveSheet.OLEObjects.Add(ClassType: = "Forms.CommandButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=1464, Top:=310, Width:=107.25, Height:=30).Object
Кнопка создается в правильном месте, потому что функция Add работает и возвращает - при несоответствии типа возникает ошибка, связанная с присвоением возвращенного OLEObject переменной CommandButton сразу после этой операции.
Последующий блок With может быть просто With buttonControl.
Ах. Тогда будет ли его следующая строчка просто With buttonControl?
Ах, у меня это почти было!
buttonControl.Opject- Объект? Для меня это похоже на опечатку - но я не думаю, что вам там даже нуженObject.