提前道歉,我没有特定的代码示例可供使用,这更多是关于使用VBA表单执行任务的可能选项的问题。
我有一个数据集,我需要通过错误检查程序运行。此过程的一部分是将一些数据行从原始表移动到另外两个表中的一个。我可以通过发票编号列(数据上的12列之一)找到这些行。我正在处理的表单有一个设置,用户将发票#输入文本框,然后单击按钮将其添加到列表框中。问题在于接下来要做什么"完成/继续"按钮。
我可以将列表框发票号码添加到数组中,但是我不确定如何从这里开始。我的工作中的一个人建议将数组写入表中,然后在其旁边使用MATCH来获取单元格引用并可能从中拉出行,但我无法使其正常工作;将数组写入表中是为了避开我,然后将单元格值放入另一个数组中,看起来它似乎不能正常工作,因为即使这样你也必须读取行,然后以某种方式选择基础表的行,然后将表行切出......等等。
我可能使用数组在数据发票栏上运行过滤器会起作用,但我不知道怎么写。这可能会使选择范围更容易(只是.databodyrange?可能不仅仅适用于过滤区域......)。
无论如何,您对类似的事情有什么想法或知道吗?
谢谢:3
答案 0 :(得分:0)
因此,要查找值,您可以使用Range.Find
,.VLookUp
和.Match
,差异就是返回值。我不知道为什么他建议将它写入数组,但你可以使用文本框的值。您不能一次查找多个值。在继续之前,我会检查是否存在匹配。
为您举例说明所有方法:
Private Sub txtInvoice_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim txt As String: txt = txtInvoice.Text
Dim sht As Worksheet
Dim Result As Variant, ResultRng As Range, MReturn As Variant
Set sht = Worksheets("Sheet1")
'.Match
If IsNumeric(txt) Then
Result = Application.Match(CLng(txt), sht.Range("A:A"), 0)
Else
Result = Application.Match(txt, sht.Range("A:A"), 0)
End If
If Not IsError(Result) Then
MReturn = sht.Cells(Result, 3).Value
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
'OR
'.VLookUp
If IsNumeric(txt) Then
Result = Application.VLookup(CLng(txt), sht.Range("A:C"), 3, False)
Else
Result = Application.VLookup(txt, sht.Range("A:C"), 3, False)
End If
If Not IsError(Result) Then
MReturn = Result
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
'OR
'.Find
Set ResultRng = sht.Range("A:A").Find(txt, LookAt:=xlWhole)
If Not ResultRng Is Nothing Then
MReturn = sht.Cells(ResultRng.Row, 3).Value
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
End Sub
因此,为了自己尝试一下,您需要一个名为Textbox
的{{1}}和另一个对象(如按钮,您可以将焦点设置为)。要匹配的工作表是txtInvoice
。在Col Sheet1
中查找该值,在Col A
中查找返回值。如果通过单击将选中对象切换/切换到另一个对象,则子将激活并尝试匹配。如果它不能,那么它将发出消息并重新聚焦C
。
我建议使用Textbox
,选项数量最多,最容易使用。 .Find
和VLookUp
可能会遇到数字问题,这就是为什么我将它们转换为实数,Match
没有这个问题。