构造一个 VBA 表单来移动 excel 行。
Structuring a VBA form to move excel rows around.
提前致歉,我没有具体的代码示例可以处理,这更多的是关于使用 VBA 表单执行任务的可能选项的问题。
我有一个数据集需要 运行 通过错误检查程序。此过程的一部分是将一些数据行从原始 table 移动到另外两个 table 之一。我可以通过发票编号列(数据的 12 列之一)找到这些行。我正在处理的表单有一个设置,用户可以在其中将发票编号输入文本框,然后单击一个按钮将其添加到列表框。问题在于 "finish/continue" 按钮接下来要做什么。
我可以将列表框发票编号添加到数组中,但我不确定如何从这里开始。我工作的一个人建议将数组写入 table,然后在它旁边使用 MATCH 来获取单元格引用并可能从中提取行,但我无法使其正常工作;将数组写入 table 是在逃避我,然后将单元格值放入另一个数组似乎不会很好地工作,因为即使那样你也必须读取行,然后以某种方式 select 底层 table 的行,然后将 table 行切出...等等
虽然我也许 运行使用数组对数据的发票列进行筛选会起作用,但我不知道如何编写它。这可能会使 select 范围更容易(只是 .databodyrange?可能只对过滤区域不起作用...)。
无论如何,您有任何想法或知道类似的例子吗?
谢谢:3
所以要查找值,您可以使用 Range.Find
, .VLookUp
and .Match
,区别在于 return 值。我不知道他为什么建议将其写入数组,但您可以只使用文本框的值。您不能一次查找多个值。在继续之前,我会检查是否存在匹配项。
给你一个所有方法的例子:
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
因此,为了亲自尝试,您需要一个名为 txtInvoice
的 Textbox
和另一个对象(如按钮,您可以将焦点设置到)。要匹配的工作表是 Sheet1
。在 Col A
中查找该值,在 Col C
中查找 return 值。如果您通过单击 out/switch 选项卡将焦点转移到另一个对象,子程序将激活并尝试匹配。如果不能,那么它将发出一条消息并重新聚焦 Textbox
。
我会推荐使用 .Find
,选项最多且最容易使用。 VLookUp
和 Match
可能有数字问题,所以我将它们转换为实数,.Find
没有这个问题。
提前致歉,我没有具体的代码示例可以处理,这更多的是关于使用 VBA 表单执行任务的可能选项的问题。
我有一个数据集需要 运行 通过错误检查程序。此过程的一部分是将一些数据行从原始 table 移动到另外两个 table 之一。我可以通过发票编号列(数据的 12 列之一)找到这些行。我正在处理的表单有一个设置,用户可以在其中将发票编号输入文本框,然后单击一个按钮将其添加到列表框。问题在于 "finish/continue" 按钮接下来要做什么。
我可以将列表框发票编号添加到数组中,但我不确定如何从这里开始。我工作的一个人建议将数组写入 table,然后在它旁边使用 MATCH 来获取单元格引用并可能从中提取行,但我无法使其正常工作;将数组写入 table 是在逃避我,然后将单元格值放入另一个数组似乎不会很好地工作,因为即使那样你也必须读取行,然后以某种方式 select 底层 table 的行,然后将 table 行切出...等等
虽然我也许 运行使用数组对数据的发票列进行筛选会起作用,但我不知道如何编写它。这可能会使 select 范围更容易(只是 .databodyrange?可能只对过滤区域不起作用...)。
无论如何,您有任何想法或知道类似的例子吗?
谢谢:3
所以要查找值,您可以使用 Range.Find
, .VLookUp
and .Match
,区别在于 return 值。我不知道他为什么建议将其写入数组,但您可以只使用文本框的值。您不能一次查找多个值。在继续之前,我会检查是否存在匹配项。
给你一个所有方法的例子:
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
因此,为了亲自尝试,您需要一个名为 txtInvoice
的 Textbox
和另一个对象(如按钮,您可以将焦点设置到)。要匹配的工作表是 Sheet1
。在 Col A
中查找该值,在 Col C
中查找 return 值。如果您通过单击 out/switch 选项卡将焦点转移到另一个对象,子程序将激活并尝试匹配。如果不能,那么它将发出一条消息并重新聚焦 Textbox
。
我会推荐使用 .Find
,选项最多且最容易使用。 VLookUp
和 Match
可能有数字问题,所以我将它们转换为实数,.Find
没有这个问题。