Excel VBA检查各种组合框中是否存在值,然后添加相应的文本框值

时间:2014-03-04 18:21:14

标签: excel excel-vba vba

如果你们都认为这是一个愚蠢的问题,我会提前为写作寻求帮助而道歉。

我有一个包含6个组合框和6个文本框的用户表单,我可以输入值。

Combobox1   Textbox1
Combobox2   Textbox2
Combobox3   Textbox3
Combobox4   Textbox4
Combobox5   Textbox5
Combobox6   Textbox6

这个问题需要知道组合/排列。

首先我在其中一个组合框中输入一个代码,然后在它旁边的文本框中输入一个总CY。然后我点击命令按钮给我一个报告。我想要实现的是编写一个代码,可以查看6个组合框中的每一个,查看代码“131010”是否存在于其中一些,如果是,则添加textbox1 ...同时排除textbox2(如果代码不在combobox2中。

因此,如果只有combobox1,3,5,6具有该代码,我只需添加textbox1,3,5,6,同时排除textbox4。

到目前为止,我有以下代码:

If ComboBox1.Value = "131010" Or ComboBox3.Value = "131010" Or ComboBox5.Value =   "131010" Or ComboBox7.Value = "131010" Or ComboBox9.Value = "131010" Or ComboBox11.Value = "131010" Then 
TextBox59.Value = Val(TextBox6) + Val(TextBox11) + Val(TextBox16) + Val(TextBox21) + Val(TextBox26) + Val(TextBox31)
TextBox52.Value = ComboBox1.Value
Else

或者我找到了这个代码:

For i = 1 To 6
    If IsNull(Me.Controls("combobox" & i)) = False Then
    if combobox & i="131010" then
        textbox59=val(textbox6)+val(textbox & i+5)
    End If
Next i

VBA代码正在添加所有文本框,并且无法识别组合框中何时存在不同的成本代码。我可以看到我做错了什么,但我不知道如何解决它。有人可以帮我弄清楚如何解决它?或者提出另一种选择?也许我需要循环组合框...我不知道该怎么做。 请不要对此问题表示否定。我确实对此进行了长时间的研究,并且无法想出一些东西。

提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

你可以像这样循环组合框:

' at top of module:
 Option Compare Text   ' make text comparison case insensitive

' in function:
Dim s as string
s = ""
for each b in UserForm.Controls
  If left(b.Name, 8) = "combobox" Then
    ' you found a combobox and its name
    ' you can append things to s as needed.
  End If
Next

或者,您可以先遍历所有这些值并生成一组值以便于操作:

Dim boxSelection(6)
Dim textValues(6) As String
Dim b
For Each b In UserForm1.Controls
  If Left(b.Name, 8) = "ComboBox" Then
    Index = Right(b.Name, 1)
    boxSelection(Index) = b.Value
  End If
  If Left(b.Name, 7) = "TextBox" Then
    Index = Right(b.Name, 1)
    textValues(Index) = b.Value
  End If
Next

你最终得到两个长度为6的数组 - 我根据你的例子硬编码 - 包含每个组合框的值。现在,您可以使用“更简单”的VBA例程进行比较,组合,等等。

更新假设您的文本框通过“textbox6”被称为“textbox1”(如上例所示,尽管在代码中它们似乎有不同的名称......),并且您的组合框是calles “combobox1”通过“combobox6”(再次,如果需要,我建议你重命名它们以使生活更轻松),然后你可以做到

Dim totalValue
totalValue = 0
for each b in UserForm.Controls
  If left(b.Name, 8) = "combobox" Then
    index = Right(b.name, 1)
    If b.Value = "131010" Then
      totalValue = totalValue & UserForm.Controls("textbox" & index).value
    End If
  End If
Next

一些关键的事情(我以为你可以从我之前发布的代码片段中找到它 - 但我显然是错的):

  1. 您自动遍历所有组合框
  2. 您希望查看名称是否与您要查找的内容相符
  3. 名称的最后一个字符是数字
  4. 您会找到相应的编号“文本框”
  5. 您将值累积到totalValue
  6. 你认为你能从这里拿走吗?我想知道你为什么要使用用户表单来做这一切 - 这似乎是错误的工作工具 - 但鉴于你这样做,上面的(或它的一个变种)应该有效。

    注意 - 您必须重命名控件...