gpt4 book ai didi

excel - WorksheetFunction.Sum 为数字返回零

转载 作者:行者123 更新时间:2023-12-04 20:03:57 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





VBA WorksheetFunction.Sum doesn't work with array but works with range?

(2 个回答)


2年前关闭。




清理你的代码, children 。在哭泣和咬牙切齿之后,问题原来是我在 .Sum 参数中的额外括号。非常感谢@BigBen 和@JvdV。

问题: Worksheetfunction.Sum 为动态范围返回总和 0,但仅适用于 rows.count > 1 且仅适用于货币格式的引用数据。

更多详情:我设置了一个用户表单来抓取引用工作簿并根据用户输入将不同的数字返回到四个不同的文本框中。有时,这些数字需要是引用工作簿上几行的总和。使用我下面的代码,只要行数为 1,对于每个返回文本框,这就像一个梦想,但对于其他任何东西都返回 0(或 0.00 美元)。 但是,对于只是一个整数的一个总和,它在所有情况下都可以正常工作。其余的被格式化为货币。

我做了什么:使用 MsgBoxes,我验证了动态范围返回正确的地址,即我想要求和的所有单元格,并且这些地址处的数字实际上是数字而不是文本(通过 IsNumber 的 True 返回验证)。我已经尝试使用 .Subtotal 和 .Aggregate 来查看它们是否有帮助,但是我遇到了 Missing Object 和其他错误,并且因为我是 VBA 新手而呜咽着跑掉了。

代码:

我的基本逻辑如下: 在引用资料(csrWorkbook)的每一页中搜索 textbox.value。一旦找到,测量合并区域的高度(我知道我知道,但合并决定是在我的工资等级之上做出的)。向右偏移可找到 4 个不同的相关数量。如果存在多行,则对这些数量求和。将总和返回到四个不同的文本框。

帮助!

    Private Sub ScrapeButton_Click()

'Enter search term into first TB
'click search button
'result DOES(!!) appear in second TB

'Variables
Dim csrWorkbook As Workbook
Dim refWorkbook As Workbook
Dim refVariables As Worksheet
Dim csrFilePath As String
Dim csrFileName As String
Dim slinAddress As String
Dim ws As Worksheet
Dim sheetCount As Long
Dim rowCount As Long
Dim slinCell As Excel.Range
Dim quantCells As Excel.Range
Dim costCells As Excel.Range
Dim feeCells As Excel.Range
Dim totalCells As Excel.Range
Dim i As Integer
Dim iCost As Double
Dim iFee As Double
Dim iTotal As Double


Set refWorkbook = Workbooks("AutomationBackbone.xlsm")
csrFileName = refWorkbook.Sheets("Variable Storage").Range("A2").Value
Set csrWorkbook = Workbooks(csrFileName)

sheetCount = csrWorkbook.Sheets.Count

'search all worksheets for data in a known column
For i = 1 To sheetCount
Set slinCell = csrWorkbook.Sheets(i).Range("C1:C100").find(Me.TextBox1.Value)
If Not slinCell Is Nothing Then

'Find sums and populate
rowCount = slinCell.MergeArea.Rows.Count 'count the number of rows in merged area
Set quantCells = slinCell.Offset(0, 2).Resize(rowCount, 1) 'establish a new range of that same height
Set costCells = quantCells.Offset(0, 6)
Set feeCells = quantCells.Offset(0, 7)
Set totalCells = quantCells.Offset(0, 8)

Me.iQuantityTB.Value = Application.WorksheetFunction.Sum((quantCells)) 'populate the Initial Quantity
iCost = Application.WorksheetFunction.Sum((costCells)) 'find sum of Cost range
iFee = Application.WorksheetFunction.Sum((feeCells)) 'find sum of Fee range
iTotal = Application.WorksheetFunction.Sum((totalCells)) 'find sum of Total range

Me.iCostTB.Value = iCost 'populate textboxes
Me.iFeeTB.Value = iFee
Me.iTotalTB.Value = iTotal

'original code commented out to see if being more explicit helped.
'Narrator: it didn't
'Me.iCostTB.Value = Application.WorksheetFunction.Sum((quantCells.Offset(0, 6))) 'populate the Initial Cost
'Me.iFeeTB.Value = Application.WorksheetFunction.Sum((quantCells.Offset(0, 7))) 'populate the Initial Fee
'Me.iTotalTB.Value = Application.WorksheetFunction.Sum((quantCells.Offset(0, 8))) 'populate the Initial Total

Exit Sub
End If
Next i
End Sub

编辑:为了清楚起见,添加了图片。

This approximates the format of the data I'm trying to pull and sum to populate textboxes

最佳答案

括号又来了!

包含额外的括号会导致计算内部表达式,并将结果传递给 Sum .

所以

Application.WorksheetFunction.Sum((costCells))

相当于
Application.WorksheetFunction.Sum(costCells.Value)

当基础数据为 Currency 时返回零.

作为 Sum 的一个可重复的小示例这里的行为(这不是我所期望的):
Dim x(0 To 1) As Currency
x(0) = 1
x(1) = 2

Debug.Print Application.Sum(x) '<~ returns zero.

请注意 .Value2不使用 Currency数据类型和行
Application.WorksheetFunction.Sum(costCells.Value2)

无论基础值如何,都会返回正确的结果。

请注意,已注意到并解释了类似的行为 here .

关于excel - WorksheetFunction.Sum 为数字返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045173/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com