Как настроить VBA для открытия только файлов Excel - PullRequest
1 голос
/ 24 сентября 2019

У меня есть книга книг, которая копирует информацию из разных книг.Чтобы открыть эти книги, я использую следующий код:

Dim nomearq As String
Dim nomearq2 As String
nomearq = Application.GetOpenFilename
Workbooks.Open Filename:=nomearq
nomearq2 = ActiveWorkbook.Name 

Итак, я пытался не запускать макрос, если выбранный файл не является файлом Excel:

If Not Right(nomearq, 4) = ".xls" Or Right(nomearq, 5) = ".xlsm" Then
    MsgBox "Arquivo incompatível"

       Exit Sub

Но файлы xlsm не открываются.Я не могу удивляться, почему.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

В качестве альтернативы вы можете ограничить возможность пользователя выбирать только файлы Excel, например:

Sub tgr()

    Dim nomearq As Variant

    nomearq = Application.GetOpenFilename("Excel Files, *.xl??")    'This specifies that it can ONLY open Excel files
    If VarType(nomearq) = vbBoolean Then Exit Sub  'Pressed cancel

    With Workbooks.Open(nomearq)
        'do stuff with the workbook here
        MsgBox "opened " & nomearq

        .Close SaveChanges:=False   'Close the opened workbook when you're done with it
    End With

End Sub
2 голосов
/ 24 сентября 2019

Проблема в вашей Or логике:

If Not Right(nomearq, 4) = ".xls" Or Right(nomearq, 5) = ".xlsm" Then

Это утверждение на самом деле состоит из двух утверждений, добавьте скобки, чтобы увидеть, что происходит:

If (Not Right(nomearq, 4) = ".xls") Or (Right(nomearq, 5) = ".xlsm") Then 

Вы можете добавить соответствующиеNot логика, или вместо Application.GetOpenFilename следует использовать Application.FileDialog, параметры которого позволяют ограничивать тип файла.

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
    .AllowMultiSelect = False
    .Filters.Clear
    .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm; *.xlsb", 1
    .FilterIndex = 1
    .Show
    If .SelectedItems.Count > 0 Then
        nomearq = .SelectedItems(0)
    End If
End With

Если вы не хотите использовать FileDialog, тогда вы можете сделать свою логику более надежной:

Dim extPos as Integer
extPos = InstrRev(nomearq, ".")
If Not Right(nomearq, extPos) Like ".xls*" Then

Это должно обрабатывать расширения файлов XLS, XLSM, XLSX, XLSB и др.

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