Как избежать двойного открытия в VBA - PullRequest
0 голосов
/ 05 июня 2018

Цель: сделать публичную константу для использования в качестве рабочей книги в нескольких функциях.Константа получается, побуждая пользователя открыть определенный файл.(Это сделано потому, что файл обновляется ежемесячно и каждый месяц имеет определенное имя) Как я могу ссылаться на открытую книгу, не открывая ее несколько раз?

Подробности: я пытался избежатьоткрыв несколько раз, удалив «path = OpenFile ()».Я также попытался сделать функции общедоступными, переменные все еще содержатся в их исходной функции.Я не могу использовать определенные переменные в функциях.В сообщении об ошибке указывается:

«Нижний индекс вне диапазона»

или

«Требуется объект»

РЕДАКТИРОВАТЬ Ошибка относится к

mvmtqt.Activate

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

Дополнительные openfile1 () и openfile2 () и т. Д. Относятся к копиям openfilee ().

Код:

Public Function OpenFilee() As String
    On Error GoTo Trap

    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .Title = "Open Sterling Shipment History" 'Name for file
        .InitialFileName = "Dialog start-up path"
        .Filters.Clear
       ' .Filters.Add "Text Documents (*.txt)", "*.txt", 1
        .ButtonName = " Open "
        .AllowMultiSelect = False
    End With

    If fd.Show <> 0 Then OpenFilee = fd.SelectedItems(1)

Leave:
    Set fd = Nothing
    On Error GoTo 0
Exit Function

Trap:
    MsgBox Err.Description, vbCritical
    Resume Leave

End Function


Public Function ShipmentHistPt2()

    Dim path1 As String
    path1 = OpenFile1()
    If path1 <> vbNullString Then Workbooks.Open (path1)
    Dim mvmtln As Workbook
    Set mvmtln = Workbooks.Open(path1)
    Dim path2 As String
    path2 = OpenFile2()
    If path2 <> vbNullString Then Workbooks.Open (path2)
    Dim mvmtqt As Workbook
    Set mvmtqt = Workbooks.Open(path2)
    mvmtqt.Activate
    Sheets("Sheet1").Select

Проблема: Всякий раз, когда я пытаюсь активироватьокно (mvmtqt.Activate) инициирует повторное открытие файла (если я снова определю переменную внутри функции), что не только замедляет процесс, но и устраняет все предыдущие изменения.

1 Ответ

0 голосов
/ 05 июня 2018

Объяснение исходного кода

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

Public Function ShipmentHistPt2()

    Dim path1 As String
    path1 = OpenFile1()                                    'calls function for filePicker
    If path1 <> vbNullString Then Workbooks.Open (path1)   'If file selected, opens file
    Dim mvmtln As Workbook
    Set mvmtln = Workbooks.Open(path1)                     'Opens file and sets to workbook variable
    Dim path2 As String
    path2 = OpenFile2()                                    'calls function for filePicker
    If path2 <> vbNullString Then Workbooks.Open (path2)   'If file selected, opens file
    Dim mvmtqt As Workbook
    Set mvmtqt = Workbooks.Open(path2)                     'Opens file and sets to workbook
    mvmtqt.Activate
    Sheets("Sheet1").Select

Так как я не уверен, хотите ли вы иметь два файла (запрашиваемые и выбранные пользователем) или один, я изменю коддля одного запроса и откройте.

Кроме того, использование .Activate и .Select может замедлить ваш код.Вы можете проверить дополнительную информацию здесь об альтернативах использованию .Select, если хотите.Если вы должны активировать рабочую книгу, вы сможете сделать это с помощью следующей строки: Workbooks(mvmtln.Name).Activate

Обратите внимание, что код немного легче читать, если все операторы Dimнаходятся в начале.


Public Function ShipmentHistPt2()
    Dim path1 As String
    Dim mvmtln As Workbook

    path1 = OpenFile1()
    If path1 <> vbNullString Then Set mvmtln = Workbooks.Open(path1)

    If Not mvmtln Is Nothing Then 'verifies that mvmtln has been assigned to a workbook
        Workbooks(mvmtln.Name).Activate 'Can un-comment if needed
        Workbooks(mvmtln.Name).Sheets("Sheet1").Select 'Should select the desired sheet
    End If

Edit (Global Vars) :

Для глобальных переменных вам нужен модуль общего кода(не один из листов или рабочей книги) и создайте там некоторые глобальные переменные (не объявляйте их в подпрограмме или функции, иначе они будут иметь только область действия в этих местах):

Dim globalVar_1 as String 'change as needed
Dim globalVar_2 as Long
Dim globalVar_3 as Workbook
'etc......

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

Public Function ShipmentHistPt2()
    Dim path1 As String
    Dim mvmtln As Workbook

    path1 = OpenFile1()
    If path1 <> vbNullString Then Set mvmtln = Workbooks.Open(path1)

    If Not mvmtln Is Nothing Then 'verifies that mvmtln has been assigned to a workbook
        Workbooks(mvmtln.Name).Activate 'Can un-comment if needed
        Workbooks(mvmtln.Name).Sheets("Sheet1").Select 'Should select the desired sheet

        'Added code
        globalVar_1 = Workbooks(mvmtln.Name).Sheets("Sheet1").Range("A1")
        globalVar_2 = Workbooks(mvmtln.Name).Sheets("Sheet1").Range("A2")
        Set globalVar_3 = mvmtln
    End If
...