具有多个控制输入的Application.match - 它是否有效?

时间:2015-05-23 05:17:30

标签: excel vba excel-vba

我是VBA的新手,我花了2天时间尝试修复此代码以使其正常工作。它实际上是我正在尝试编译的帐户报表数据库的一个非常简单的信用条目。

userform看起来像这样:

http://imgur.com/gallery/DCHd23M/new

顶部文本框分别命名为ClientTextBox和DebitTextBox 底部10 + 10个文本框命名为Inv1,Inv2 ... Inv20。发票文本框用于引用我们收到的支票将支付的发票。例如。我们收到客户“ABC”的“100美元”支票,用于支付发票“001”和“002”。因此,001和002将输入发票文本框1和2,其余部分留空。

一路上添加了Msgboxes以进行错误检查。我使用“赞”功能来区分顶部文本框和发票文本框,以区分输入,如下所示:

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实际上无法将任何变量(例如Y = Ctr.value)与错误1004匹配,但在我将Ctr.value更改为1时有效,如下所示:

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

我是userforms的新手,所以我不太了解它的一些局限性。任何建议都是最受欢迎的!我刚刚在一周前学习了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

1 个答案:

答案 0 :(得分:0)

您的Ctr.Value是字符串值。例如。 “1”。

即使范围中的值是数字,Application.WorksheetFunction.CountIf(.Worksheets("SOA").Range("A:A"), Ctr.value)也会计算。这是因为CountIf的第二个参数预期为String,因为它也可能是“&gt; 1”或“&lt; 1”或“&lt;&gt; 1”。

但如果Application.WorksheetFunction.Match(Ctr.value, .Worksheets("SOA").Range("A:A"), 0)为“1”,则Ctr.Value将不匹配,但范围中的值为数字。

因此,如果范围内的值是数字,则必须先将Ctr.Value转换为数字值才能在Match中使用。

示例:

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