Application.match与多个控制input – 是否工作?

我是VBA新手,我花了大概2天的时间来修复这个代码,使其工作。 它实际上是一个非常简单的信用logging,我试图编译帐户数据库的声明。

用户窗体看起来像这样:

Excel userform VBA

顶部文本框分别命名为ClientTextBox和DebitTextBox,底部的10 + 10文本框命名为Inv1,Inv2 … Inv20。 发票文本框将引用我们收到的支票将支付哪些发票。 例如,我们收到客户“ABC”的支票“$ 100”来支付发票“001”和“002”。 因此,将001和002input到发票文本框1和2中,其余的保留为空。

增加了消息框以进行错误检查。 我使用“Like”函数来区分顶部文本框和发票文本框来区分input,如下所示:

For Each Ctr In Me.Controls If TypeName(Ctr) = "TextBox" And Ctr.Name Like "Inv#*" Then 

这工作得很好。 但是在这部分代码中,特别值得关注的是:

 If Ctr.value <> "" Then MsgBox ("Found a value!" & vbNewLine & Ctr.value) If Application.WorksheetFunction.CountIf(.Worksheets("SOA").Range("A:A"), Ctr.value) Then V = Application.WorksheetFunction.Match(Ctr.value, .Worksheets("SOA").Range("A:A"), 0) If .Worksheets("SOA").Range(V, 7).value = "Unpaid" Then .Worksheets("SOA").Range(V, 7).value = "Paid" 

Application.worksheetfunction.match实际上无法匹配任何variables(例如Y = Ctr.value),而出现错误1004,但在将Ctr.value更改为1时有效,如下所示:

  V = Application.WorksheetFunction.Match(1, .Worksheets("SOA").Range("A:A"), 0) 

我是新的用户forms,所以我没有得到一些限制。 任何build议将是最受欢迎的! 我刚学了一个星期前的VBA编码,所以我相信我还有很长的路要走。 以下是完整的代码:

 Private Sub OkButton_Click() Dim SOA As ListObject Dim Ctr As Control Dim pPage As msforms.Page Dim credit As ListRow Dim V As Variant With ThisWorkbook Set SOA = .Worksheets("SOA").ListObjects(1) 'table name Set credit = SOA.ListRows.Add(1) 'the new row, always add to the top credit.Range(1, 2).value = Format(Now(), "mm/dd") 'Date credit.Range(1, 3).value = ClientTextBox.value 'Client name credit.Range(1, 6).value = DebitTextBox.value 'Credit Amt For Each Ctr In Me.Controls If TypeName(Ctr) = "TextBox" And Ctr.Name Like "Inv#*" Then MsgBox (Ctr.Name) If Ctr.value <> "" Then MsgBox ("Found a value!" & vbNewLine & Ctr.value) If Application.WorksheetFunction.CountIf(.Worksheets("SOA").Range("A:A"), Ctr.value) Then V = Application.WorksheetFunction.Match(Ctr.value, .Worksheets("SOA").Range("A:A"), 0) If .Worksheets("SOA").Range(V, 7).value = "Unpaid" Then .Worksheets("SOA").Range(V, 7).value = "Paid" Else: MsgBox ("Invoice #" & Ctr.value & " has already been paid!") End If Else MsgBox ("Didn't find the number") End If End If End If Next End With Unload Me End Sub 

您的Ctr.Value是一个string值。 例如“1”。

即使Range中的值是数字, Application.WorksheetFunction.CountIf(.Worksheets("SOA").Range("A:A"), Ctr.value)也会计数。 这是因为CountIf的第二个参数预期为一个string,因为它也可以是“> 1”或“<1”或“<> 1”。

但是Application.WorksheetFunction.Match(Ctr.value, .Worksheets("SOA").Range("A:A"), 0)如果Ctr.Value是“1”,但是范围内的值是数字Application.WorksheetFunction.Match(Ctr.value, .Worksheets("SOA").Range("A:A"), 0)

因此,如果范围内的值是数字,则必须Ctr.Value转换为数字值,然后再用于Match

例:

 Application.WorksheetFunction.Match(CLng(Ctr.value), .Worksheets("SOA").Range("A:A"), 0)