VBA宏或函数将基于条件的单元格值复制到主工作表

时间:2017-11-09 15:05:00

标签: excel vba excel-vba function

假设我有一家租车公司,我有12张,每张10列,行数不详。每张纸都保存着租车的信息。以下是每个电子表格的列标题

 - A.   Date rented 
 - B.   Customer Name
 - C.   Customer Address
 - D.   Customer Phone
 - E.   Customer email 
 - F.   Car Year
 - G.   Car Make
 - H.   Car Model
 - I.   Car Plate number
 - J.   Car Vin

我有一张主表,我想从所有表中获取特定信息,并将这些表的cellValues复制到主表中。我不熟悉VBA所以这是我想要做的循环的sudocode:

For each sheet
 For each row
  Copy customer name, customer phone, car plate number into next available row on master sheet

在主表中,列将分别是我如何将它们放入sudocode

 - A.   Customer Name
 - B.   Customer Phone
 - C.   Car Plate number

有人可以告诉我VBA宏代码的用途吗?

免责声明:这不是我在电子表格中的实际信息,因为我正在处理的是保密信息,因此我无法提供屏幕截图。这只是模拟我想要做的事情的示例信息。

我试过= HLOOKUP(B1,' Sheet1(51)'!1:1048576,2:2,FALSE)但是得到了值错误或NA错误,具体取决于什么我在参数中尝试的范围或值。我理解HLookup功能的方式是:

  1. 查找值是我在源表中查找的列标题:对于客户名称,我会为B2查找值
  2. 表格数组将是整个源表格
  3. 行数组将是从源表单中获取单元格值的行
  4. 范围查找是T或F,或者没有,因为它是可选的。如果我使用True或False,如果我什么都不使用,我会得到NA错误,我得到了值错误。
  5. 我的想法是,一旦我让这个公式为一个单元格工作,然后将它扩展为一行,然后将其扩展到我在sudocode中的源代码表中所有行的循环,然后将其展开以查看或转到下一张源表。

1 个答案:

答案 0 :(得分:0)

您可以通过循环浏览所有可用的工作表(不包括主工作表)并为每个工作表设置相关范围来轻松完成此操作。然后使用find函数获取主工作表中的最后一行数据,以便能够追加下一行。

这应该产生预期的结果:

Sub MasterGrab()

Dim master As Worksheet
Dim subSheet As Range
Dim i As Integer
Dim lastRow As Long

Set master = Worksheets("MasterSheet")
x = Sheets.Count
lastRow = master.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'find last row on master sheet
lastRow = lastRow + 1

For i = 1 To x
    If Not Sheets(i).Name = "MasterSheet" Then 'capture all sheets except MasterSheet
        Set subSheet = Sheets(i).Range("A1:J" & ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row) 'set each sheet range to cover required data
        For Each r In subSheet.Rows
            master.Cells(lastRow, 1) = r.Cells(2) 'Customer name
            master.Cells(lastRow, 2) = r.Cells(4) 'Customer phone
            master.Cells(lastRow, 3) = r.Cells(9) 'Car Plate number
            lastRow = lastRow + 1
        Next r

    End If
Next i
End Sub