【问题标题】:Excel VBA: Add Value to TextBox based on ComboBox Selection Then SumExcel VBA:根据组合框选择向文本框添加值然后求和
【发布时间】:2015-05-25 01:48:21
【问题描述】:

我正在创建一个用户表单,它应该允许我从组合框中选择一个选项,并且我需要该选择来为它旁边的文本框提供一个值,因为我需要在最后执行计算。

我有 4 个框架,每个框架有 4 个组合框和 5 个文本框(第 5 个用于结果)。

我不确定这是否是正确的方法,因为这是我第一次使用用户表单。

首先,我在工作簿的工作表中创建了一个包含“是”和“否”的列表,并为其指定了一个名称范围。我认为如果将来需要添加更多值而无需修改代码会更容易。

=OFFSET(Lists!$A$2, 0, 0, COUNTA(Lists!$A:$A),1)

这是我到目前为止的一段代码。

Private Sub UserForm_Initialize()

Dim rngResponse As Range
Dim ws As Worksheet

Set ws = Worksheets("Lists")

For Each rngResponse In ws.Range("Response")

Me.cbResponse1.AddItem rngResponse.Value
Me.cbResponse2.AddItem rngResponse.Value
Me.cbResponse3.AddItem rngResponse.Value
Me.cbResponse4.AddItem rngResponse.Value
Me.cbResponse5.AddItem rngResponse.Value
Me.cbResponse6.AddItem rngResponse.Value
Me.cbResponse7.AddItem rngResponse.Value
Me.cbResponse8.AddItem rngResponse.Value
Me.cbResponse9.AddItem rngResponse.Value
Me.cbResponse10.AddItem rngResponse.Value
Me.cbResponse11.AddItem rngResponse.Value
Me.cbResponse12.AddItem rngResponse.Value
Me.cbResponse13.AddItem rngResponse.Value
Me.cbResponse14.AddItem rngResponse.Value
Me.cbResponse15.AddItem rngResponse.Value
Me.cbResponse16.AddItem rngResponse.Value

Next rngResponse

End Sub

每个文本框的命名如下。

txtResponse1
txtResponse2
txtResponse3
txtResponse4

直到 txtResponse16

然后我想在每一帧中显示结果的文本框是

txtResult1
txtResult2
txtResult3
txtResult4

我需要将“是”值设为 1,将“否”值设为 0,然后对帧中的所有值求和,然后将它们除以响应数。所以如果 cbbox 是空白的,那么 txtbox 也应该是空白的。

非常欢迎任何意见或建议。

编辑:

我为每个组合框添加了一个,它可以工作,但现在我有 16 个潜艇。有没有办法缩短这个?

Private Sub cbResponse1_Change()

If Me.cbResponse1.Value = "" Then
Me.txtResponse1.Value = ""
End If

If Me.cbResponse1.Value = "Yes" Then
Me.txtResponse1.Value = 1
End If

If Me.cbResponse1.Value = "No" Then
Me.txtResponse1.Value = 0
End If

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以通过使用一个所有事件处理程序都调用的函数来大大减少代码,如下所示:

    Private Sub cbResponse1_Change()
        Call cbResponsex_Change(Me.cbResponse1, Me.txtResponse1)
    End Sub
    
    Private Sub cbResponse2_Change()
        Call cbResponsex_Change(Me.cbResponse2, Me.txtResponse2)
    End Sub
    
    Private Sub cbResponsex_Change(cbResponse As Combobox, txtResponse As TextBox)
    
        If cbResponse.Value = "" Then
            txtResponse.Value = ""
        End If
    
        If cbResponse.Value = "Yes" Then
            txtResponse.Value = 1
        End If
    
        If cbResponse.Value = "No" Then
            txtResponse.Value = 0
        End If
    
    End Sub
    

    【讨论】:

    • 谢谢罗。但是,当我尝试运行它时,我得到一个错误“SubScript out of range”。我对更改事件进行了格式化以匹配每个组合框和每个文本框,但到目前为止似乎还不行。
    • 下标超出范围发生在哪一行?它不可能是我建议的任何代码,因为它不使用下标。
    • 我发现了那个错误。我正在处理的工作簿中缺少一张工作表。它是“列表”表,其中包含是/否的列表值。那是固定的。现在我得到的错误是“类型不匹配”,它指向第一个子 Private Sub cbResponse1_Change() Call cbResponsex_Change(Me.cbResponse1, Me.txtResponse1) End Sub。仅供参考,组合框是文本(是/否/空白),文本框应该是数字。认为这可能与此有关?我没有格式化文本框。我仍在尝试在学习过程中弄清楚这一点。
    • 改成 cbResponse As Object,txtResponse As Object。我是凭记忆输入名字的。
    • 感谢您的快速响应。现在,当我选择是/否选项时,这些值会正确填充。您是否碰巧知道我如何对每个帧中文本框的值求和,然后将它们除以该帧中非空文本框的计数,然后将其时间除以 100?我需要将结果显示为 %。我将文本框放在包含组合框的框架旁边的单独框架上。因为我认为它会更有条理,更容易进行计算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多