Значения vArray не удаляются из предыдущего цикла в VBA - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть несколько vArrays, которые не очищаются. Целью макроса является работа с вкладкой необработанных данных, которая имеет более 30 вкладок, каждая вкладка содержит информацию для конкретного офиса, 001 - Нью-Йорк и т. Д. Макрос должен выбирать x количество вкладок (на основе ссылки файл), скопируйте их и сохраните в новую рабочую книгу. Проблема заключается в том, что вместо копирования и сохранения из файла необработанных данных вместо него сохраняется эталонный файл. Цикл For ... Next используется для определения того, какие вкладки / отделения выбрать и скопировать из файла необработанных данных. Varrays находятся внутри цикла и содержат названия офисов. Когда код встречает vArray, значения varray не очищаются, когда цикл возвращается назад.

Пример:

'For 1' ссылается на ячейку со значением "8", поэтому она заполняет 8 различных значений vArray (офисы в данном случае). «For 2» имеет ссылочный номер 5 и должен заполнять 5 значений vArray. Он делает это правильно, так как я вижу 5 новых значений в окне локальных файлов в vArray (1) через vArray (5), однако, vArray 6 - 8 показывают значения предыдущего цикла вместо «Пусто». Значения vArray не очищаются, когда макрос зацикливается.

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

Заранее спасибо всем, кто пытается ответить на этот вопрос.

Option Explicit
Dim iYear As Integer, iMonth As Integer, iVer As Integer, icount As Integer, iCount2 As Integer
Dim iLetter As String, iReport As String
Dim sMonth As String, sDate As String, sVer As String, sAnswer As String
Dim sFolderName As String, sManagerInitials  As String
Dim iManagerNumber As Integer, iManagerStart As Integer, iTabNumber As Integer, iTabStart As Integer
Dim sMasterListWBName As String, sConsolidatedWBName As String, sExists As String
Dim oSheet As Object, oDistList As Object
Dim vArray(300) As Variant
Dim wbDistList As Workbook
Dim wsAgentListSheet As Worksheet, wsMain As Worksheet
Dim rCell As Range, rCell2 As Range, rCellTotal As Range
Public sFINorAgent As String


Sub Agent_Distribute()
On Error Resume Next

iYear = frm_fin_rep_main_distribute.txt_year
iMonth = frm_fin_rep_main_distribute.txt_month
iVer = frm_fin_rep_main_distribute.txt_version

sMonth = Right("0" & iMonth, 2)
sDate = iYear & "." & sMonth

sVer = "V" & iVer
sAnswer = MsgBox("Is the following information correct?" & vbNewLine & vbNewLine & _
                    "Report - " & frm_fin_rep_main.sLetter & vbNewLine & _
                    "Year - " & iYear & vbNewLine & _
                    "Month - " & sMonth & vbNewLine & _
                    "Name - " & frm_fin_rep_main.sReport & vbNewLine & _
                    "Version - " & sVer, vbYesNo + vbInformation, "Please verify...")
If sAnswer <> vbYes Then
    Exit Sub
End If

Unload frm_fin_rep_main_distribute
frm_agent.Hide
Form_Progress

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

sConsolidatedWBName = ActiveWorkbook.Name
sMasterListWBName = "Dist Master List Final.xls"
If Not IsFileOpen(sMasterListWBName) Then
    Workbooks.Open FileName:= _
    "W:\Addins\01 GL - Distribution\" & sMasterListWBName, Password:="password"
    Workbooks(sConsolidatedWBName).Activate
End If

Set oDistList = Workbooks(sMasterListWBName).Worksheets("Agent")

With oDistList

    iManagerNumber = .Range("ManNumber2") 'range value = 66

    For iManagerStart = 2 To iManagerNumber '2 to 66
        If .Range("A" & iManagerStart) = "x" Then

            iTabNumber = .Range("E" & iManagerStart) 'E2 to E66
            sFolderName = .Range("F" & iManagerStart) 'F2 to F66
            sManagerInitials = .Range("G" & iManagerStart) 'G2 to G66

                For iTabStart = 1 To iTabNumber
                    vArray(iTabStart) = .Range("G" & iManagerStart).Offset(0, iTabStart)
                Next iTabStart

                If iTabNumber = 1 Then
                    Sheets(vArray(1)).Select
                Else
                    Sheets(vArray(1)).Select
                    For iTabStart = 2 To iTabNumber
                        Sheets(vArray(iTabStart)).Select False
                    Next iTabStart
                End If

                ActiveWindow.SelectedSheets.Copy

                ' *** the following code is optional, remove preceding apostrophes from the following four lines to enable password protection ***
                'For Each oSheet In ActiveWorkbook.Sheets
                    'oSheet.Protect "password"
                    'oSheet.EnableSelection = xlNoSelection
                'Next

                ActiveWorkbook.SaveAs FileName:= _
                "W:\Financials\" & iYear & "\" & sDate & "\Report to Distribute Electronically\Department Reports\" _
                & sFolderName & "\Current Year Financials" & "\" & "Y" & ") " & iYear & "-" & sMonth & " Agent Report Card " & sVer & " - " & sManagerInitials & ".xls"
                ActiveWorkbook.Close
        End If

        iPercent = iManagerStart / iManagerNumber * 95
        Task_Progress (iPercent)
    Next iManagerStart
End With

Workbooks(sMasterListWBName).Close False

Task_Progress (100)
Unload frm_progress

Set oDistList = Nothing

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

Message_Done

frm_agent.Show (vbModeless)

End Sub

1 Ответ

0 голосов
/ 28 ноября 2018

Я исправил это.Я просто добавил «Рабочие книги (sWbName) .activate» в конце цикла, чтобы убедиться, что фокус снова на файле исходных данных.Теперь все файлы сохраняются в правильном формате и месте.Дело закрыто, если кому-то еще нечего добавить.Возможно, кто-то знает причину, по которой макрос терял свой активный лист (сохраняя справочный файл вместо файла необработанных данных).Спасибо.

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