Как я могу добавить другой цикл For Loop, чтобы добавить другие данные рабочих таблиц перед сохранением файла? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть скрипт, который обрабатывает главный файл и создает отчет для каждого менеджера.В столбце A все строки под mgr 1 сохраняются и печатаются в шаблон, а затем он проходит по всем менеджерам до тех пор, пока данные не закончатся.

Option Explicit

Sub Main()
  Dim Wb As Workbook
  Dim Data, Last
  Dim i As Long, j As Long, k As Long, a As Long
  Dim Dest As Range

  'Refer to the template
  Set Wb = Workbooks("SpecializedSkillsTemplate.xlsx")
  'Refer to the destination cell
  Set Dest = Wb.Sheets("Manager Summary").Range("B1")
  'Read in all data
  With ThisWorkbook.Sheets("Sheet7")
    Data = .Range("Z2", .Range("A" & Rows.Count).End(xlUp))
  End With
  Wb.Activate


  'Process the data
  For i = 1 To UBound(Data)
    'Manager changes?
    If Data(i, 1) <> Last Then
      'Skip the first
      If i > 1 Then
        'Scroll into the view
        Dest.Select
        'Save a copy
        Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
          ValidFileName(Last & "_Assessment.xlsx")
      End If
      'Clear the employees
      Dest.Resize(, Columns.Count - Dest.Column).EntireColumn.ClearContents
      'Remember this manager
      Last = Data(i, 1)
      'Start the next round
      j = 0
    End If
    'Write the employee data into the template
    a = 0
    For k = 2 To UBound(Data, 2)
      Dest.Offset(a, j) = Data(i, k)
      a = a + 1
    Next

    'Next column
    j = j + 1
  Next
End Sub

Он берет данные из sheet 7 в мастер-файле, но возможно ли иметь еще один цикл For/Next, который делает это для другого листа?Скажем, у меня есть sheet 8, и я хочу, чтобы он делал то же самое, брал данные о сотрудниках и транспонировал смещение на столбец, чтобы я мог сравнить два набора.Это возможно?

Я думал добавить что-то вроде:

Dim Data2 

With ThisWorkbook.Sheets("Sheet8")
    Data2 = .Range("Z2, . Range("A" & Rows.Count).End(xlUp))
End With

, а затем еще один For/Next Loop:

For x = 1 to UBound(Data2)
    If Data2(I,1) <> Last
Next 

и т. Д.Кто-нибудь может дать мне знать, если это возможно?

1 Ответ

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

Вариант интеграции для следующего цикла

Задачи

Я добавил 6 строк и изменил одну (помеченную '*** в коде.

  • Добавлена ​​строковая константа, в которой будут храниться имена листов.
  • Добавлен вариант, в который имена листов будут вставляться и считываться.
  • Добавлен счетчик для циклического просмотра имен листов в варианте.
  • Используя функцию разделения, вставляются данные из строки в вариант (массив).
  • Запущено для следующего цикла.
  • Изменено ThisWorkbook.Sheets ().
  • ЗакрытоДля следующего цикла.

Код

Option Explicit

    Sub Main()

      Const cStrSheet As String = "Sheet7,Sheet8,Sheet9" '***

      Dim vntSheet As Variant ' ***
      Dim iSheet As Integer ' ***

      Dim Wb As Workbook
      Dim Data, Last
      Dim i As Long, j As Long, k As Long, a As Long
      Dim Dest As Range

      'Refer to the template
      Set Wb = Workbooks("SpecializedSkillsTemplate.xlsx")
      'Refer to the destination cell
      Set Dest = Wb.Sheets("Manager Summary").Range("B1")

      vntSheet = Split(cStrSheet, ",") '***

      For iSheet = 0 To UBound(vntSheet) '***

        'Read in all data
        With ThisWorkbook.Sheets(vntSheet(iSheet)) '***
          Data = .Range("Z2", .Range("A" & Rows.Count).End(xlUp))
        End With
        Wb.Activate

        'Process the data
        For i = 1 To UBound(Data)
          'Manager changes?
          If Data(i, 1) <> Last Then
            'Skip the first
            If i > 1 Then
              'Scroll into the view
              Dest.Select
              'Save a copy
              Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
                ValidFileName(Last & "_Assessment.xlsx")
            End If
            'Clear the employees
            Dest.Resize(, Columns.Count - Dest.Column).EntireColumn.ClearContents
            'Remember this manager
            Last = Data(i, 1)
            'Start the next round
            j = 0
          End If
          'Write the employee data into the template
          a = 0
          For k = 2 To UBound(Data, 2)
            Dest.Offset(a, j) = Data(i, k)
            a = a + 1
          Next

          'Next column
          j = j + 1
        Next

      Next ' iSheet '***

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