Можно ли назначить строковое значение, содержащее имя книги в качестве аргумента? - PullRequest
1 голос
/ 15 мая 2019

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

Public fileName As String
fileName = InputBox("Type here the current workbook's name: ")  

Dim ext As String
ext = ".xlsb"

Set wk = Excel.Workbooks(fileName & ext)

Ошибка 9: индекс вне диапазона

1 Ответ

0 голосов
/ 16 мая 2019

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

Я создал пользовательскую функцию для выбора файлов через объект FileDialog. В качестве необязательного аргумента вы можете указать определенный тип файла в аргументе format.

get_file([format], [fullpath])

' Returns a file name of a selected file via the .FileDialog object
' Arguments:
'    [format] : Optional argument, if left empty any file format can be selected, _
                otherwise enforce what [format] was put in to be selected
'    [fullpath] : Optional argument, if left empty will only return FileName.xxx, _
                  otherwise will return full path (eg. D:\MyDir\Book.xlsx")
' Returns: A <String> with the selected filename.

Вот так выглядит функция:

Private Function get_file(Optional ByVal format As String = "nomatch", _
                          Optional ByVal fullpath As Boolean = False) As String

    Dim fs As FileDialog: Set fs = Application.FileDialog(msoFileDialogFilePicker)
    Dim goodmatch As Boolean: goodmatch = False

    Do Until goodmatch = True
        With fs
            If .Show <> -1 Then
                .Title = "Choose a Workbook to work with"
                .AllowMultiSelect = False
                .InitialFileName = Application.DefaultFilePath
            End If

            If format = "nomatch" Then
                goodmatch = True
            Else
                format = Replace(format, ".", "")
                If Mid(.SelectedItems(1), InStrRev(.SelectedItems(1), ".") + 1) <> format Then
                    MsgBox "Please select a " & format & " file format", vbCritical
                Else
                    goodmatch = True
                End If
            End If
        End With
    Loop

    If fullpath = True Then
       get_file = fs.SelectedItems(1)
    Else
       get_file = Mid(fs.SelectedItems(1), InStrRev(fs.SelectedItems(1), "\") + 1)
    End If

End Function

Пример пользователя функции:

Private Sub test()
    Dim wb As Workbook: Set wb = Workbooks.Open(get_file(".xlsx", fullpath:= True))
    ' saves a workbook of only .xlsx type from what user selected into wb variable
    Debug.Print wb.Name
End Sub

Открыл рабочую книгу с [fullpath] для правильной ссылки (True) с принудительным .xlsx [format] и напечатал Name свойство Workbook объекта, сохраненного в переменной wb

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...