我在Excel中使用多个工作表来创建一个正在接受一些技术培训的候选人数据库。每次将候选人添加到“数据库”时,都会为他们分配一个唯一的编号,例如“2015-0001”。当他们打电话支付押金时,我正在使用数据输入表给电话接线员记下细节,并查找候选人的唯一号码。然后我想根据他们的号码过滤候选人的主要数据库,并粘贴确认的存款细节。
我的查询是这样的:如何编写从工作表1上的单元格复制候选编号数据的代码,然后使用该数据(无论其值如何)来过滤工作表2?
我是宏的新手,并且一直在使用“记录宏”来生成代码,然后我随后编辑和学习。所以,如果这看起来非常笨重,请道歉。使用record,filter命令只需要使用我正在使用的示例文本(在本例中为2015-0011),而不是在更改Deposit输入表并运行宏时将其替换为修订后的值。我是否认为我需要使用String?
提前致谢。 RLC
Sub Confirm_Deposit()
'
' Confirm_Deposit Macro
'
'
Sheets("Take Deposit").Select
Range("C5").Select
Selection.Copy
Sheets("CIP Candidates").Select
ActiveSheet.Range("$A$6:$AK$2507").AutoFilter Field:=1, Criteria1:= _
"2015-0011" <---------------- ISSUE
Sheets("Take Deposit").Select
Range("C6:C8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("CIP Candidates").Select
Range("A6").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Offset(0, 20).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
Application.Run _
"'CIP Spreadsheet RLC (with Macros).xlsm'!ThisWorkbook.Clear_Filters"
etc.
答案 0 :(得分:1)
这是一种不同的方法,不是基于“宏”,而是更简单的使用循环的单元格操作。它非常灵活。看看您对这个想法的看法,然后我们就可以根据您的具体需求进行修改。
我将立即更改此代码的部分是选择查找值的来源。在这个例子中,由于我不知道你的具体情况,我看到你在上面的例子中使用“C5”。
Sub Confirm_Deposit()
Dim source As String
Dim target As String
Dim lookupVal As String
Dim row As Long
Dim searchRow As Long
source = "Take Deposit" 'In case you have similar projects, you can just replace these lines.
target = "CIP Candidates"
lastSourceRow = Sheets(source).Range("A" & Rows.Count).End(xlUp).row
lastTargetRow = Sheets(target).Range("A" & Rows.Count).End(xlUp).row
lastTargetCol = Sheets(target).Cells(1, Columns.Count).End(xlToLeft).Column
lookupVal = TextBox1.Text 'Set the lookupVal from whatever source you choose. I like ComboBoxes when I can.
For searchRow = 2 To lastSourceRow
If Sheets(source).Cells(searchRow, 3).Text = lookupVal Then 'Searching through Source Sheet on Col "C"
Exit For
End If
Next searchRow
'This way, at the end of the search, you have the row number of the original source to be copied, instead of hard coding.
For row = 6 To lastTargetRow 'Loop through the Target Sheet
If Sheets(target).Cells(row, 3).Text = lookupVal Then 'Compare lookupVal to the Range being looped.
For col = 2 To lastTargetCol
Sheets(target).Cells(row, 3) = Sheets(source).Cells(searchRow, col) 'Copies contents from Row 5 of source sheet.
Next col
End If
Next row
End Sub
编辑:使查找行动态而不是硬编码到第5行
答案 1 :(得分:0)
已经有一段时间了,但是这样做了吗?
ActiveSheet.Range("$A$6:$AK$2507").AutoFilter Field:=1, Criteria1:= _
Sheets("Take Deposit").Cells(5,3).Value
或
ActiveSheet.Range("$A$6:$AK$2507").AutoFilter Field:=1, Criteria1:= _
Sheets("Take Deposit").Range("C5").Value
没有必要选择和复制该值。您只需引用单元格值。