2016-09-29 6 views
-1
Sub LoopAllExcelFilesInFolder() 

Dim wb As Workbook 
Dim myPath As String 
Dim myFile As String 
Dim myExtension As String 
Dim FldrPicker As FileDialog 

'Optimize Macro Speed 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Application.Calculation = xlCalculationManual 

'Retrieve Target Folder Path From User 
    Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker) 

    With FldrPicker 
     .Title = "Select A Target Folder" 
     .AllowMultiSelect = False 
     If .Show <> -1 Then GoTo NextCode 
     myPath = .SelectedItems(1) & "\" 
    End With 

'In Case of Cancel 
NextCode: 
    myPath = myPath 
    If myPath = "" Then GoTo ResetSettings 

'Target File Extension (must include wildcard "*") 
    myExtension = "*.xls" 

'Target Path with Ending Extention 
    myFile = Dir(myPath & myExtension) 

'Loop through each Excel file in folder 
    Do While myFile <> "" 
    'Set variable equal to opened workbook 
     Set wb = Workbooks.Open(Filename:=myPath & myFile) 

    'Ensure Workbook has opened before moving on to next line of code 
     DoEvents 

    'Press button in sheet 51 
     wb.Worksheets("51").CommandButton1.Value = True 

    'Save and Close Workbook 
     'wb.Close SaveChanges:=True 

    'Ensure Workbook has closed before moving on to next line of code 
     DoEvents 

    'Get next file name 
     myFile = Dir 
    Loop 

'Message Box when tasks are completed 
    MsgBox "Task Complete!" 

ResetSettings: 
    'Reset Macro Optimization Settings 
    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 

End Sub 

У меня есть папка с 50 книгами с одинаковыми рабочими листами в каждой книге. У меня есть две кнопки в каждом рабочем листе в книге, которая позволяет мне загружать/выгружать на db. Мне нужно прокрутить каждую книгу и нажать кнопку загрузки на листе51.Цитирование через каждую книгу в папке + нажатие кнопки VBA

wb.Worksheets ("51"). CommandButton1.Value = True

Можно ли смотреть через то, что я делаю неправильно? Я получаю это сообщение - Ошибка времени выполнения: «438»: объект не поддерживает это свойство или метод.

+0

Просто введите код CommandButton1_Click и вызовите его напрямую. – Comintern

ответ

1

CommandButtons не имеет Value свойства, так что я думаю, что вы хотите вызвать Click события кнопки, то есть:

wb.Worksheets("51").CommandButton1_Click 

CommandButton1_Click события будет первым нужно быть объявлен Public, а не Private, т.е. :

Public Sub CommandButton1_Click() 

В то время как оно объявлено приватным, к нему можно получить доступ только по коду внутри самого листа.


Следующие редактировать, для которого я очень благодарен, был сделан Коминтерном:

ПРИМЕЧАНИЕ: Если вы не хотите, чтобы вручную изменить все процедуры обработчика события, вы можете просто измените их из Private в Public с помощью расширяемой VBA:

'Requires a reference to Microsoft Visual Basic for Applications Extensibility 
'Also requires "Trust access to the VBA project object model" to be checked. 
'in Macro Security. 

Dim targetLine As Long 

'The "51" in VBComponents("51") is the name of the code module which is usually, but 
'not always, the same as the sheet name 
With wb.VBProject.VBComponents("51").CodeModule 
    targetLine = .ProcStartLine("CommandButton1_Click", vbext_pk_Proc) 
    .ReplaceLine targetLine, "Public Sub CommandButton1_Click()" 
End With 

wb.Sheets("51").CommandButton1_Click 
+0

Это заставляет меня задаться вопросом, можете ли вы использовать VBA Extensibility для изменения обработчика событий на 'Public' и ***, затем *** называть его ... – Comintern

+0

@Comintern - Я даже не пытался использовать функции расширения VBA, поэтому Я оставлю это вам, чтобы поэкспериментировать с этим, если хотите. (Опубликуйте ответ, если вы добьетесь успеха, и я удалю мой - ответ, который затрагивает вопрос «Частный», будет гораздо более полезен для других людей.) – YowE3K

+0

Ответ: да, да, вы можете. * Рекомендую * это совсем другая история - я оставлю это упражнение для читателя, если вам не любопытно. Если это так, я могу отредактировать его в вашем ответе (на самом деле это не очень важно). – Comintern

Смежные вопросы