我是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
答案 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)