Может ли VBA хранить каждый массив по отдельности и ждать, чтобы распечатать его в шаблоне? - PullRequest
0 голосов
/ 13 декабря 2018

Есть ли способ, чтобы этот скрипт формировал весь массив на основе строк, которые я хочу извлечь на основе IF Statement?

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

Option Explicit

Sub CIB_Cuts()
Dim j As Long, k As Long, x As Long
Dim varArray() As Variant
Dim varArray2() As Variant
ReDim varArray(1 To 19, 1 To 1)

Dim strManager As String, strEC As String, strLogin As String
Dim BASEPATH As String, strNewPath As String, strFileName As String
Dim Wb As Workbook

Dim mgrRow As Long
Dim colManager As Long
colManager = 3
Dim colLogin As Long
colLogin = 4
Dim colEC As Long
colEC = 5

BASEPATH = "M:\Final Files\"

Call speedupcode(True)

For mgrRow = 2 To ThisWorkbook.Worksheets("Mgrs").UsedRange.Rows.Count
    If ThisWorkbook.Worksheets("Mgrs").Cells(mgrRow, 3) <> "" Then
        strManager = ThisWorkbook.Worksheets("Mgrs").Cells(mgrRow, 3)

        With ThisWorkbook.Worksheets("Data")
            ReDim varArray(1 To UBound(varArray, 1), 1 To 1)
            x = 1
            For k = 1 To UBound(varArray, 1)
                varArray(k, x) = .Cells(1, k)
            Next
            For j = 2 To .UsedRange.Rows.Count + 1
                If strManager = .Cells(j, colManager) Then
                    x = x + 1
                    ReDim Preserve varArray(1 To UBound(varArray, 1), 1 To x)
                    For k = 1 To UBound(varArray, 1)
                        If k = 1 Then
                            varArray(1, x) = CStr(Format(.Cells(j, k), "000000000"))
                        Else
                            varArray(k, x) = .Cells(j, k)
                        End If
                        strEC = .Cells(j, colEC)
                        strManager = .Cells(j, colManager)
                        strLogin = .Cells(j, colLogin)
                    Next
                End If
            Next
        End With

                    strFileName = strLogin & " - " & strManager & " - " & "Shift Differential Validation" & ".xlsx"

        ReDim varArray2(1 To UBound(varArray, 2), 1 To UBound(varArray, 1))

        Set Wb = Workbooks.Add(XlWBATemplate.xlWBATWorksheet)
        With Wb
            With .Worksheets("Sheet1")
                .Columns(1).NumberFormat = "@"
                .Columns(15).NumberFormat = "0%"

                For j = 1 To UBound(varArray, 2)
                    For k = 1 To UBound(varArray, 1)
                        varArray2(j, k) = varArray(k, j)
                    Next
                Next

                .Range(.Cells(1, 1), .Cells(UBound(varArray, 2), UBound(varArray, 1))) = varArray2

                    Call DataValidation
                    Call Header

                    .Range("C2").Select
                     ActiveWindow.FreezePanes = True

                    .Cells.EntireColumn.AutoFit
                    .Rows("1:1").Font.Bold = True

                    Call protect

           End With

            .SaveAs strNewPath & strFileName, Password:="password", FileFormat:=51
            .Saved = True
            .Close

        End With
        Set Wb = Nothing
    End If
Next

Call speedupcode(False)

End Sub

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете хранить массив каждый раз в всеобъемлющем массиве или коллекции и цикле, который в конце ...

Public Sub test()
    Dim varArray2() As Variant, results As Collection
    'other code..
    Set results = New Collection

    results.Add varArray2
End Sub

Вы также можете использовать Select Case или что-то отличительное во время цикла,определить ключ и заполнить словарь массивами как значениями, которые могут упростить поиск определенных элементов.

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