Пытаясь заставить этот VBA в Excel открыть определенную папку, чтобы выбрать файлы Excel для объединения, я, кажется, хожу по кругу, как обычно

#vba #select #directory

#vba #выберите #каталог

Вопрос:

Пытаясь заставить этот VBA в Excel открыть определенную папку, чтобы выбрать файлы Excel для объединения, я, кажется, хожу по кругу, как обычно…..

 Sub mergeFiles()
    'Merges all files in a folder to a main file.
    
    'Define variables:
    Dim numberOfFilesChosen, i As Integer
    Dim tempFileDialog As fileDialog
    Dim mainWorkbook, sourceWorkbook As Workbook
    Dim tempWorkSheet As Worksheet
    
    Set mainWorkbook = Application.ActiveWorkbook
    Set tempFileDialog = Application.fileDialog(msoFileDialogFilePicker)
    
    'Allow the user to select multiple workbooks
    tempFileDialog.AllowMultiSelect = True
    
    numberOfFilesChosen = tempFileDialog.Show
    
    'Loop through all selected workbooks
    For i = 1 To tempFileDialog.SelectedItems.Count
        
        'Open each workbook
        Workbooks.Open tempFileDialog.SelectedItems(i)
        
        Set sourceWorkbook = ActiveWorkbook
        
        'Copy each worksheet to the end of the main workbook
        For Each tempWorkSheet In sourceWorkbook.Worksheets
            tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
        Next tempWorkSheet
        
        'Close the source workbook
        sourceWorkbook.Close
    Next i
    
End Sub
  

Любые идеи о том, как изменить код, чтобы использовать определенный путь для папки, были бы высоко оценены.

Вот надеюсь

Ответ №1:

Пожалуйста, попробуйте следующий код:

 Sub mergeFilesBis()
    'Define variables:
    Dim i As Integer, tempFileDialog As FileDialog
    Dim mainWorkbook, sourceWorkbook As Workbook, tempWorkSheet As Worksheet
    Dim initialFolder As String
    
    initialFolder = "C:"
    Set mainWorkbook = Application.ActiveWorkbook
    Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker)
    
    'Allow the user to select multiple workbooks
    With tempFileDialog
        .AllowMultiSelect = True
        .InitialFileName = initialFolder
        If Not .Show = -1 Then Exit Sub
    End With
    
    'Loop through all selected workbooks
    For i = 1 To tempFileDialog.SelectedItems.count

        Set sourceWorkbook = Workbooks.Open(tempFileDialog.SelectedItems(i))
        
        'Copy each worksheet to the end of the main workbook
        For Each tempWorkSheet In sourceWorkbook.Worksheets
            tempWorkSheet.Copy After:=mainWorkbook.sheets(mainWorkbook.Worksheets.count)
        Next tempWorkSheet
        
        'Close the source workbook
        sourceWorkbook.Close
    Next i
End Sub
  

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

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

2. @Eric the Viking: Но где в вашем коде вы пытаетесь установить начальную папку открытой? Можете ли вы лучше объяснить (на словах), в чем ваша проблема, на самом деле? Вам нужно, чтобы диалоговое окно открывалось в определенной папке? Если да, то в каком? VBA не может читать ваши мысли… Предполагалось, что вы будете просматривать, чтобы найти соответствующую папку.

3. Просто чтобы убедиться, что мой вопрос ясен, я импортирую серию отдельных книг в основную книгу. Отдельные книги были экспортированы из access в определенную папку, которая также содержит основную книгу. Что я хочу, чтобы VBA делал, это всегда открывал папку с экспортированными файлами в ней, вместо того, чтобы переходить к последнему открытию папки и ожидать, что пользователь затем перейдет в нужную папку.

4. Я ценю, что я не сказал VBA перейти к этой конкретной папке, мне нужен правильный код, чтобы сообщить об этом, если вы понимаете, что я имею в виду.

5. @Eric the Viking: Я адаптировал код для открытия диалогового окна в определенной папке. Но вы должны «указать» коду, который является путем к этой папке , правильно заполнив переменную initialFolder . Убедитесь, что путь к папке заканчивается на «». Пожалуйста, протестируйте код и отправьте отзыв.