假设我有一家租车公司,我有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
我有一个母版工作表,我想从所有工作表中获取特定信息,并将这些工作表的单元格值复制到母版工作中。我不熟悉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,"表1(51)"!1:1048576,2:2,FALSE),但会得到一个值错误或NA错误,这取决于我在参数中尝试的范围或值。我理解HLookup功能的方式是:
- 查找值是我在源工作表中查找的列标题:对于客户名称,我愿意,但查找值为B2
- 表数组将是整个源表
- 行数组将是我从源工作表中获取单元格值的行
- 范围查找是T或F,或者什么都没有,因为它是可选的。如果我使用True或False,我会得到NA错误。如果我什么都不使用,我会获得值错误
我的想法是,一旦这个公式适用于一个单元格,然后将其扩展到一行,然后将它扩展到我的sudocode中的循环中,用于源工作表中的所有行,然后扩展它以查看或转到下一个源工作表。
通过循环所有可用的工作表(不包括主工作表)并设置每个工作表的相关范围,可以很容易地实现这一点。然后使用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