Существует ли такая вещь, как универсальный код поиска пути в Excel для Mac

#excel #vba #macos

#excel #vba #macos

Вопрос:

Я выполняю проект очистки на работе для отчетов об используемых приложениях.

Вот первая часть проекта, в которой мне нужна новая рабочая книга, чтобы извлекать извлеченные отчеты Excel из папки, копировать определенный рабочий лист (через окно ввода сообщения), изменять имя рабочего листа, чтобы отразить отчет приложения, и вставлять его в новую рабочую книгу.

Поскольку эта рабочая тетрадь с макросами будет доступна другим моим коллегам, я бы хотел, чтобы в ней было поле «выбрать каталог пути», чтобы они могли выбрать каталог пути.

Я выполнил основы указания макроса непосредственно в определенное место для выбора файлов. Мой менеджер хочет, чтобы он мог выбирать каталог path, если другой коллега использует этот же шаблон.

У нас есть team Google Drive, на котором хранятся файлы, поэтому, если код сможет извлекать файлы с team drive вместо того, чтобы пользователь загружал их в свою систему, это будет здорово.

 Sub CopySheets()

    Dim path As String
    Dim FileName As String
    Dim whichSheet As String

    path = "/Users/timothy.wong/Downloads/Project Clean Up/2019/"
    FileName = Dir(path amp; "*.xlsx")
    whichSheet = InputBox("Which month would you like to copy? Enter month (eg. Jan, Feb, Mar)")

    Do While FileName <> ""
        Workbooks.Open FileName:=path amp; FileName, ReadOnly:=True
        Sheets(whichSheet).Select
        ActiveWorkbook.ActiveSheet.Copy after:=ThisWorkbook.Sheets(1)
        Workbooks(FileName).Close
        ActiveSheet.Name = Left(FileName, Application.WorksheetFunction.Search(" ", FileName) - 1)
        FileName = Dir()

    Loop

End Sub
  

Базовый код работает хорошо, мне нужно сделать его немного более продвинутым.

Ответ №1:

Вы можете попробовать это:

 Option Explicit
Sub CopySheets()

    Dim path As String
    Dim FileName As String
    Dim whichSheet As String
    Dim SheetNames As String
    Dim wb As Workbook

    path = GetFolder
    If path = vbNullString Then
        MsgBox "No folder was selected. Ending the procedure."
        End
    End If
    FileName = Dir(path amp; "*.xlsx")
    whichSheet = InputBox("Which month would you like to copy? Enter month (eg. Jan, Feb, Mar)")

    Do While FileName <> ""
        Set wb = Workbooks.Open(FileName:=path amp; FileName, ReadOnly:=True)
        On Error Resume Next
        If Len(wb.Sheets(whichSheet).Name) = 0 Then 'Here we handle an error on the inputname for the sheet.
        On Error GoTo 0
            SheetNames = GetSheetNames(wb)
            MsgBox "The input sheet does not exist in this workbook. The current worksheet names are: " amp; SheetNames
            whichSheet = InputBox("Which month would you like to copy? Enter month (eg. Jan, Feb, Mar)")
        End If
        With wb.Sheets(whichSheet)
            .Copy after:=ThisWorkbook.Sheets(1)
            .Close
        End With
        ThisWorkbook.Sheets(2).Name = Left(FileName, Application.WorksheetFunction.Search(" ", FileName) - 1)
        FileName = Dir()
    Loop

End Sub
Function GetFolder() As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Selecciona una carpeta"
        .AllowMultiSelect = False
        .InitialFileName = Application.DefaultFilePath
        If .Show <> -1 Then GoTo NextCode
        sItem = .SelectedItems(1)
    End With
NextCode:
    GetFolder = sItem
    Set fldr = Nothing

End Function
Function GetSheetNames(wb As Workbook) As String

    Dim ws As Worksheet

    For Each ws In wb.Worksheets
        GetSheetNames = GetSheetNames amp; ", " amp; ws.Name
    Next ws

End Function
  

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

1. Спасибо за быстрый ответ, я просто попробовал, но у меня ошибка компиляции: аргумент не является необязательным, указывающий на «GetSheetsNames» с выделенным «Вложенные таблицы ()».

2. Мой плохой … SheetNames = GetSheetNames(wb) исправьте это

3. Теперь это «Ошибка времени выполнения ’91’: переменная объекта или с переменной блока не установлена», и она указывает на «. Title = «Selecciona una carpeta»»

4. @TimothyWong Нет способа, который выдает ошибку. Чуть выше этой строки With fldr

5. Нужно ли мне делать что-нибудь еще? Или код хорош для использования в новой книге и запуска? Извините за мои многочисленные вопросы, поскольку я все еще новичок в VBA Excel.