【问题标题】:How can I sum value in 8 textboxes to the a single textbox?如何将 8 个文本框中的值加到单个文本框中?
【发布时间】:2015-06-12 06:33:16
【问题描述】:

我找不到这样做的方法。我认为这是一个非常基本的问题,但我只是 excel VBA 的新手,找不到正确的公式。

最近我明白要进行求和,我必须先将每个 textboxes 更改为整数,然后我可以将其添加到单个 textbox,所以我将每个值转换为整数,同时将它们一一相加到文本框中。

我试过这段代码。

Private Sub txtTotal_Change() 
txtTotal.Value = CInt(txtKas) + CInt(txtInvestasi) + CInt(txtDanaTerbatas) + CInt(txtBruto) + ...
End Sub

如何将这多个文本框(8 个文本框)汇总到一个文本框中?

【问题讨论】:

  • 文本框,我无法发布图片来解释我的问题。在我持有所有数字并对最后一个文本框中的值求和后,我将其打印到 excel 的单元格中。问题是我不能在文本框中求和。
  • 为什么是txtTotal_Change()?您不应该调用txtTotal_Sum() 之类的东西来汇总所有这些文本框并在其中任何一个发生更改时将结果放入 txtTotal 中吗?用户应该无法更改 txtTotal(锁定它)。我认为你应该使用CInt(textbox.Value)
  • 感谢回复,我已经改成这个代码Private Sub txtTotal_Sum() txtTotal = CInt(txtKas.Value) + CInt(Investasi.Value) + CInt(DanaTerbatas.Value) End Sub 并且我还锁定了最后一个文本框,但是结果没有出来。
  • 您需要在所有其他文本框的TextboxName_Change() 上调用此txtTotal_Sum()。您想要的是在任何这些文本框发生更改时自动更新吗?
  • 对,就是这个词,我要自动更新,我先试试

标签: vba excel textbox


【解决方案1】:

您需要在用户可更改的文本框中添加 Change 事件。

假设我有下面的用户窗体和 TextBox1TextBox3

TextBox3 将是 TextBox1 和 TextBox2 的总和。

右键Project下的UserForm1,选择View Code,然后放入TextBoxesSum Sub(我使用Double类型接受小数):

Private Sub TextBoxesSum()
    Dim Total As Double
    Total = 0
    If Len(TextBox1.Value) > 0 Then Total = Total + CDbl(TextBox1.Value)
    If Len(TextBox2.Value) > 0 Then Total = Total + CDbl(TextBox2.Value)
    ' Add more for the rest of your text boxes
    TextBox3.Value = Total
End Sub

为了安全和智能,您还应该根据用户输入进行密钥检查。由于您拥有的文本框数量,最好有一个函数来处理它:

Private Function NumericOnly(ByVal KeyAscii As MSForms.ReturnInteger) As MSForms.ReturnInteger
    Dim Key As MSForms.ReturnInteger
    Select Case KeyAscii
        Case 46, 48 To 57 ' Accept only decimal "." and numbers [0-9]
            Set Key = KeyAscii
        Case Else
            KeyAscii = 0 ' Minor bug earlier
            Set Key = KeyAscii
    End Select
    Set NumericOnly = Key
End Function

现在回到UserForm1对象,右键TextBox1并查看代码,输入:

Private Sub TextBox1_Change()
    TextBoxesSum
End Sub

还要检查 KeyPress 事件:

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = NumericOnly(KeyAscii)
End Sub

现在复制上面2组TextBox Sub并粘贴到下面,然后替换下划线之前的字符串以匹配您拥有的文本框的名称。

样本输出:

【讨论】:

  • 感谢@PatricK 的回复,我终于得到了这个问题的答案。非常感谢您的帮助
  • 如果用户出错了怎么办? excel VBA中是否有撤消按钮的内置功能?
  • 撤消用户出错? AFAIK,撤消没有内置功能。您将不得不从头开始实施它。这将是复杂的代码,你准备好了吗?您应该指示用户在输入数据时要小心/留心(我们已阻止他们输入除数字和小数以外的任何内容 - 但不能输入多个小数)。
  • 也许我应该更多地研究VB,我认为有一个撤消按钮。感谢您的建议帕特里克。
【解决方案2】:

当有人试图更改总计框中的值时,您(可能)不想对文本框中的值求和 - 当其他八个框中的任何一个中的值发生变化时,您希望对它们求和。

最简单的方法可能是创建一个简单的宏来汇总文本框的值,然后从用户可能更改的 8 个更改事件中调用它。

对文本框求和并将它们放入总计框的宏

Private Sub sum_boxes()
    txtTotal = CLng(txtKas.Value) + CLng(Investasi.Value) + CLng(DanaTerbatas.Value)
End Sub

变更事件会是什么样子

Private Sub txtKas_Change() 
    Call sum_boxes
End Sub

如前所述,您需要为八个盒子中的每一个制作一个更改事件。

另一方面,使用文本框存储总数可能不是一个好主意,因为您不希望用户更改其中的内容。正如帕特里克建议的那样,一种选择是锁定文本框,另一种选择是使用不同的对象来保存数字,例如一个标签,只需将其标题更改为与您当前的总数相似。

【讨论】:

  • 谢谢@eirikdaude 我已经关注了你的代码,但它说这个代码需要对象txtTotal = CLng(txtKas.Value) + CLng(Investasi.Value) + CLng(DanaTerbatas.Value)
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多