Массив не печатается во второй строке моего второго листа? - PullRequest
0 голосов
/ 18 марта 2019

Я просто предоставлю фрагменты. По сути, у меня есть два набора данных в основном списке, и они разделены на значение X в столбце H реестра. Я хочу, чтобы X's был напечатан на Лист1 из Wb и Blanks был напечатан на Лист2.

У меня это работает, но поскольку оно объявляет FinalDest как единственную переменную, оно не начинается со строки 2 Sheet2.

Пример: если X заполняет 10-ю строку Sheet1, он будет запускать данные Sheet2 в 11-й строке вместо 2 (после заголовков).

 Sub Main()
  Dim Wb As Workbook
  Dim Data, Last, Login, SaveTyping
  Dim i As Long, j As Long, k As Long, a As Long
  Dim Dest1 As Range, Dest2 As Range, FinalDest As Range
  Set Wb = Workbooks("Template.xlsx")

  Set Dest1 = Wb.Sheets("Currently Eligible").Range("A2")
  Set Dest2 = Wb.Sheets("Newly Eligible").Range("A2")

  With ThisWorkbook.Sheets("Roster")
    Data = .Range("AA2", .Range("A" & Rows.Count).End(xlUp))
  End With

После того, как я объявил свой массив, я разделяю то, что напечатано в шаблоне.

   SaveTyping = Data(i, 8) 'Column my X's and Blanks are
    If InStr(SaveTyping, "X") Then
         Set FinalDest = Dest1
    End If
    If SaveTyping = "" Then
         Set FinalDest = Dest2
    End If

    For k = 1 To UBound(Data, 2)

      FinalDest.Offset(j, a) = Data(i, k) 'Where I need to tell array to print
      a = a + 1
    Next

    j = j + 1

  Next

FinalDest диапазон поднимается в следующем ряду после того, как он остановился на Листе 1, как мне предотвратить это и запустить его на строке 2 для обоих листов?

    Option Explicit

Sub Main()
  Dim Wb As Workbook 'Workbook I'm printing each managers employee roster to and saving off a copy to a folder
  Dim Data, Last, Login, chkVal 'Data = data I'm printing into template / Last = Manager name / Login = Manager Login ID
  Dim i As Long, j As Long, k As Long, a As Long 'i = Data(row) / k = Data(column) / a = Wb(row) / j = Wb(column)
  Dim Dest1 As Range, Dest2 As Range, FinalDest As Range 'Dest1 = Sheets(1) of Wb / Dest2 = Sheets(2) of Wb

Set Wb = Workbooks("Template.xlsx") 'Sets template for each file cut

Set Dest1 = Wb.Sheets("Currently Eligible").Range("B2")
Set Dest2 = Wb.Sheets("Newly Eligible").Range("B2")

With ThisWorkbook.Sheets("Sheet1")
Data = .Range("AA2", .Range("A" & Rows.Count).End(xlUp)) 'Raw data
End With

Wb.Activate
Application.ScreenUpdating = False

For i = 1 To UBound(Data) 'Row 1 to Ubound of Data(rows)

If Data(i, 1) <> Last Then 'only print array to Wb one manager at a time, we see when managers change because values in Data(i,1) will <> the next cell

  If i > 1 Then 'skip header

    Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
      ValidFileName(Login & " - " & Last & " - Shift Differential Validation.xlsx")

  End If

 With Sheets("Exempt Population")
 .Rows(2 & ":" & .Rows.Count).ClearContents 'Clears previous managers data
 End With

  Last = Data(i, 1) 'Manager last name is in Column A
  chkVal = Data(i, 8) 'Check for X or Blank in Column H
  Login = Data(i, 27) 'Manager login ID is in column AA

  j = 0 'Wb Column = 0

End If

a = 0 'Wb Row = 0

SaveTyping = Data(i, 8) 'Column my X's and Blanks are
    If InStr(SaveTyping, "X") Then
         Set FinalDest = Dest1
    End If
    If SaveTyping = "" Then
         Set FinalDest = Dest2
    End If



  For k = 1 To UBound(Data, 2) 'Column 1 to Ubound of Data(columns)
  FinalDest.Offset(j, a) = Data(i, k)
  a = a + 1 'next Wb row
Next

j = j + 1 'next Wb column
Next

 SaveCopy Wb, Login, Last '<< save the last report


End Sub

1 Ответ

1 голос
/ 19 марта 2019

Я немного очистил код, дав правильные имена индексам.

С точки зрения решения вашей проблемы я добавил два разных индекса строки: один для X, другой для пустого.В зависимости от того, является ли он X или пустым, вы увеличиваете либо одно, либо другое.

Option Explicit

Sub Main()


Dim Wb As Workbook 'Workbook I'm printing each managers employee roster to and saving off a copy to a folder
Dim Data, Last, Login, chkVal 'Data = data I'm printing into template / Last = Manager name / Login = Manager Login ID
Dim row_data As Long, col_wb As Long, col_data As Long, row_wb As Long
Dim Dest1 As Range, Dest2 As Range, FinalDest As Range 'Dest1 = Sheets(1) of Wb / Dest2 = Sheets(2) of Wb
Dim row_index_x As Long, row_index_blank As Long, isX As Long

Set Wb = Workbooks("Template.xlsx") 'Sets template for each file cut

Set Dest1 = Wb.Sheets("Currently Eligible").Range("B2")
Set Dest2 = Wb.Sheets("Newly Eligible").Range("B2")

With ThisWorkbook.Sheets("Sheet1")
    Data = .Range("AA2", .Range("A" & Rows.Count).End(xlUp)) 'Raw data
End With

Wb.Activate
Application.ScreenUpdating = False

' initialise row indices to 0, ignore header as Dest1 and Dest2 already at B2.
row_index_x = 0
row_index_blank = 0

For row_data = 1 To UBound(Data) 'Row 1 to Ubound of Data(rows)

    ' if manager name changed between this row and previous row
    If Data(row_data, 1) <> Last Then 'only print array to Wb one manager at a time, we see when managers change because values in Data(row_data,1) will <> the next cell

        If row_data > 1 Then 'skip header

            ' save wb every time manager changes
            Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
              ValidFileName(Login & " - " & Last & " - Shift Differential Validation.xlsx")

        End If

        With Sheets("Exempt Population")
            .Rows(2 & ":" & .Rows.Count).ClearContents 'Clears previous managers data
        End With

        Last = Data(row_data, 1) 'Manager last name is in Column A
        chkVal = Data(row_data, 8) 'Check for X or Blank in Column H
        Login = Data(row_data, 27) 'Manager login ID is in column AA

        ' reset output row every time manager name changes
        row_wb = 0 'Wb Row = 0

    End If

    ' for every data row, reset output column to zero (start a new row)
    col_wb = 0 'Wb Col = 0

    SaveTyping = Data(row_data, 8) 'Column my X's and Blanks are

    ' decide output destination
    If InStr(SaveTyping, "X") Then
         Set FinalDest = Dest1
         row_wb = row_index_x
         isX = 1 ' remember whether its X or blank
    End If

    If SaveTyping = "" Then
         Set FinalDest = Dest2
         row_wb = row_index_blank
         isX = 0
    End If


    ' Loop through all columns for one row of data
    ' keep output row the same, increase the output column
    For col_data = 1 To UBound(Data, 2) 'Column 1 to Ubound of Data(columns)
        FinalDest.Offset(row_wb, col_wb) = Data(row_data, col_data)
        col_wb = col_wb + 1 'next Wb column
    Next

    'row_wb = row_wb + 1 'next Wb row

    ' decide which row index to increase
    If isX = 1 Then
        row_index_x = row_index_x + 1
    Else
        row_index_blank = row_index_blank + 1
    End If

Next

SaveCopy Wb, Login, Last '<< save the last report

End Sub

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