Я хочу скопировать данные с нескольких листов / вкладок на мастер-лист - PullRequest
1 голос
/ 28 октября 2010

У меня есть электронная таблица с более чем 100 вкладками с относительно одинаковым форматом данных, но на некоторых листах больше или меньше строк, чем на других.У меня есть лист с именем EMP_NUM со всеми номерами и именами сотрудников.У меня есть лист Master , в который я хотел бы скопировать все относительные данные на мастер-лист.Номера сотрудников, указанные на листе EMP_NUM , соответствуют именам более 100 листов.В конце я хотел бы, чтобы в каждой строке на листе Master первая ячейка была номером сотрудника, а остальные ячейки в строке - данные, собранные со всех других листов.

Данные листа employee # , которые необходимо скопировать, начинаются с A4 и заканчиваются в TX, где X равно наибольшему номеру строки в столбце A, который все еще имеет значение.

Я думалиспользования данных в EMP_NUM , вызываемых в процедуре, для поиска правильного листа для копирования данных, поскольку они будут соответствовать, но также для использования в качестве первой ячейки в строке.

Когда я закончу, я могу добавить свои формулы для расчета данных.Прошло более 6 лет с тех пор, как я немного поболтал в VB в Excel, и я не уверен, что делать.Спасибо за вашу помощь!!Пожалуйста, дайте мне знать, если мне нужно что-нибудь прояснить.

** ДОБАВЛЕНО **

Я думаю, что первым шагом будет поискпервый лист для копирования данных.Чтобы найти первый лист, функция должна перейти на лист EMP_NUM и посмотреть, что такое первое число, это число точно соответствует названию нужного нам листа.Это может быть intEmpNum

Затем на соответствующем листе я выясняю, сколько строк за строкой 4 содержит данные.Эти строки будут диапазон для копирования.Скопируйте этот диапазон в первую доступную строку на листе Master , начиная со столбца B, оставив пока столбец A пустым.Столбец A предназначен для intEmpNum для всех строк, в которых есть данные в столбце B, но нет столбца A.

Затем найдите номер следующего сотрудника в EMP_NUM и повторите процедурупока в столбце А на листе Emp_NUM

больше нет номеров сотрудников. Это то, что я имею до сих пор -

Sub Button1_Click()    
Dim intEmpNum As Integer 'employee number
    Dim strEmpCell As String 'row that employee number is in 
    strEmpCell = 1
    Do Until Sheets("EMP_NUM").Range("A" + strEmpCell).Value = 0
        intEmpNum = Sheets("EMP_NUM").Range("A" + strEmpCell).Value
        strEmpCell = strEmpCell + 1
    Loop
        MsgBox ("The value was not found!")
End Sub

Ответы [ 2 ]

0 голосов
/ 29 октября 2010

Я думаю, у вас есть правильное представление о коде, который у вас есть.Но я хотел бы рассмотреть возможность использования имен динамического диапазона вместо того, чтобы установить список номеров сотрудников.Таким образом, у вас может быть имя ранга.

Создайте новое имя ранга с именем «EmployeeNum» со следующей формулой

=OFFSET("EMP_NUM!$A1",0,0,COUNTA("EMP_NUM!$A:$A"),1)

Это немного упрощает работу с кодом цикла

Sub getEmployeeData()
    Dim rCell As Range
    Dim dblPasteRow As Double

    'Start pasting in first row

    For Each rCell In Range("EmployeeNum")
        dblPasteRow = dblPasteRow + CopyData(rCell.Value, dblPasteRow)
    Next rCell
End Sub

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

Function CopyData(strEmpNum As String, dblPasteStart As Double) As Double

    Dim wksEmployee As Worksheet
    Dim dblEndRow As Double

    'If there is an error, we are adding 0 rows
    CopyData = 0
    'Error handling - if sheet isn't found
    On Error GoTo Err_NoSheetFound
    'Set a worksheet object to hold the employee data sheet
    Set wksEmployee = Sheets(strEmpNum)
    On Error GoTo 0

    With wksEmployee
        'Find the last row on the worksheet that has data in column A
        dblEndRow = .Range("A4").End(xlDown).Row
        'Copy data from this sheet
        Range(.Range("A4"), .Range("T" & dblEndRow)).Copy
    End With

    'Paste data to master sheet - offset to column B
    Range(Worksheets("MASTER").Range("B" & dblPasteStart), Worksheets("MASTER").Range("U" & dblPasteStart + dblEndRow)).Paste
    'Write employee numbers next to the data
    Range(Worksheets("MASTER").Range("A" & dblPasteStart), Worksheets("MASTER").Range("A" & dblPasteStart + dblRowEnd)).Value = strEmpNum

    'Let the calling sub know how many rows we added
    CopyData = dblEndRow

    Exit Function
'Only runs if an error is found
Err_NoSheetFound:
    Debug.Print "Can't find employee number: " & strEmpNum

End Function

Я не запускал код, поэтому в нем могут быть некоторые ошибки.Я надеюсь, что это, по крайней мере, укажет вам правильное направление.

0 голосов
/ 28 октября 2010

Я недавно выбрал VBA для одноразового проекта.Разделите вашу работу на более мелкие задачи.

Вот как найти данное ИМЯ на листе wn:

Dim wn as String
Dim COLUMN_WHERE_ID_IS as String

COLUMN_WHERE_ID_IS = "B" 
For srow = 1 To Worksheets(wn).Range("B65536").End(xlUp).row
 If (Worksheets(wn).Range(COLUMN_WHERE_ID_IS & srow & ":" & COLUMN_WHERE_ID_IS & srow).Value = NAME) Then
     '' copy stuff to target you have range now
 Exit For
End If
Next srow

Теперь создайте функцию, которая будет проходить через все ячейки и получать ИМЯ, а затемвызов выше подпрограммы.Затем вам нужно найти способ перебрать все листы.

Имейте в виду, что это ужасно неэффективно.С алгоритмической точки зрения вы должны поместить все EMP NUM в структуру Set и сделать проверку, если set.contains (_empnum) при переходе по любому из листов.

...