我正在尝试获取有关我一直在使用的 Excel 宏的最后一步的帮助。我设置了一个宏,它将从两个不同工作簿的工作表中获取数据,并将其粘贴到第三个工作簿中。
第三个工作簿是 15 个文件之一,这些文件属于 15 个不同的员工,每个员工都有不同的姓名和编号。
我已经设置了宏,以便一次打开并更新 15 个工作簿中的每一个,然后保存并关闭它们,但现在我需要适应 15 个工作簿列表的变化(当员工辞职或新员工被雇用时)。
按照我编写宏的方式,我必须手动进入代码并更改对 15 名员工的姓名和 ID 号的引用。
有没有办法设置它,以便它可以从列表(保存在第四个工作簿上)中读取名称和号码,这样我就可以根据需要简单地编辑该列表,而宏可以保持不变并循环运行?我知道每次需要进行更改时我都可以使用 Replace,但从单个可编辑列表中工作仍然更容易。谢谢。
在下面的例子中,引用了名为 Melvin Smith ID # 2878 的员工:
‘ Using the AutoFilter on the workbook called NEW DD
Windows("NEW DD.xlsx").Activate
ActiveSheet.Range("$H$1:$H$3055").AutoFilter Field:=8, Criteria1:=”=*Melvin Smith*”, _ Operator:=xlAnd
Selection.Copy
‘ Going back to Melvin’s workbook named 2878
Windows("2878.xlsx").Activate
Sheets("D dd N").Select
Range("A1").Select
ActiveSheet.Paste
答案1
我过去的做法就是完全按照你说的做——我将变量存储在另一张工作表/书中。
假设您创建一个名为“Employees.xlsx”的工作簿,如下所示:
| A | B
|-----------------|--------------------
1| Employee | Employee Num
2| Melvin Smith | 2878
3| David Gilmour | 1908
然后,您创建两个子程序:一个循环遍历您的表,另一个执行复制。我们将员工的姓名和编号传递给第二个子程序,它将使用这些值而不是硬编码的值。
Sub CopyAllSheets()
' Store a reference to the workbook
Dim Wb As Workbook
Set Wb = Workbooks("Employees.xlsx")
' Start at row 2 to ignore the column headers
Dim Counter As Long
For Counter = 2 To Wb.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
CopySingleSheet Wb.Sheets(1).Range("A" & Counter), Wb.Sheets(1).Range("B" & Counter)
Next Counter
End Sub
Sub CopySingleSheet(EmpName As String, EmpNumber As String)
' Using the AutoFilter on the workbook called NEW DD
Windows("NEW DD.xlsx").Activate
ActiveSheet.Range("$H$1:$H$3055").AutoFilter Field:=8, Criteria1:="=*" & EmpName & "*", Operator:=xlAnd
Selection.Copy
' Going back to Melvin’s workbook named 2878
Windows(EmpNumber & ".xlsx").Activate
Sheets("D dd N").Select
Range("A1").Select
ActiveSheet.Paste
End Sub
希望这是有意义的