自动求和单元格 VBA Excel

4
我正在尝试使用VBA在Excel中对一块单元格进行自动求和。但是在调试以下代码时,我不断收到类型不匹配的错误信息。我做错了什么?
Sub autosumtest()
    Dim total As Integer
    Worksheets("Sheet1Test").Select
    Range("F16:G20").Select
    total = CInt("=SUM(Selection.Values)")
    MsgBox (total)
End Sub

编辑1:这是我的测试数据示例,名为Autosum Range:

enter image description here


1
你为什么要使用 CInt - 如果数字是文本,它不会帮助你求和的。 - brettdj
2
如果您的数据是数字,则单行代码就足够了,不需要使用“CInt”函数。示例代码如下:MsgBox Application.Sum(Sheets("Sheet1Test").Range("F16:G20")) - brettdj
我以为使用CInt会消除类型不匹配的错误。 - Anthony
1
在被添加的范围内,是否有任何带有错误的单元格? - brettdj
你能否请提供一下你的数据快照?(除非你已经有以下代码可用) - brettdj
@brettdj 好的,我已经编辑了我的问题并包含了快照。 - Anthony
4个回答

6
你可以使用 [] 来评估任何电子表格表达式。
Sub autosumtest()
   Dim total As Integer
   total = CInt([=sum(sheet1Test!F16:G20)])
   MsgBox (total)
End Sub

1
谢谢你们增加了这个新特性,不知怎么的,我以前从没注意到它。 同时total = CInt(Evaluate("=sum(sheet1Test!F16:G20)"))也能完成相同的工作。 - Jüri Ruut

2

您的范围F16到G20将包含不同的格式。请确保它们具有数字格式,问题得以解决。

您还可以使用以下方法:

Sub autosumtest()
    Dim total As Integer
    total = [=SUM(Sheet1Test!F16:G20)]
    MsgBox (total)
End Sub

1
你为什么还要保留这个完全没用的 .Select? - iDevlop
1
你不需要在从VBA评估或操作单元格之前选择它。这只是缓慢的行为,可能是从查看录制器结果继承而来的。 - iDevlop
1
@iDevlop,但我是在工作表上使用而不是单元格。如果我在Sheet4中调用autosumtest,则它将计算Sheet4中的总和。而现在它会选择Sheet1并在那里运行宏。或者我的逻辑完全错误吗..? - CustomX
2
只需使用sum(sheet1Test!F16:G20)。 - iDevlop
t.thielemans,感谢您的回复。在使用您的代码并选择单元格->格式化单元格->数字->小数位数:0->确定后,我遇到了运行时错误'13'类型不匹配。为什么我仍然会遇到这种类型不匹配的问题呢? - Anthony
显示剩余3条评论

2

是的,存在类型不匹配问题,因为“=SUM(F16:G20)”是一个字符串。

应该使用Worksheetfunction来对所需范围进行求和。除非有希望进一步选择某些内容,否则不需要使用.Select。

Option Explicit

Sub autosumtest()
    Dim total As Integer
    Dim rng As Range

    Set rng = Worksheets("Sheet1Test").Range("F16:G20")
       total = CInt(WorksheetFunction.Sum(rng))
    MsgBox (total)
End Sub

+1,成功了!感谢你提醒我使用Option Explicit,介绍了“Set”的用法,以及高效简洁地编写代码。 - Anthony

1

好的,鉴于其他答案的长度和冗余的 CInt....

Sub Easy()
MsgBox Application.Sum(Sheets("Sheet1Test").Range("F16:G20"))
End Sub 

因为我的复制和粘贴技能很差。添加了缺少的括号。 - brettdj
我甚至尝试加上括号,但仍然出现语法错误:MsgBox(Application.Sum(Sheets(“Sheet1Test”)。Range(“F16:G20”)) - Anthony
1
谢谢,它可以工作。我从未想到你可以在不使用()的情况下使用MsgBox?那很有趣。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接