我想使用WorksheetFunction.Sum來總結結果中所有行上的相同字段,但是,它似乎並沒有這樣做。它不會拋出一個錯誤,它只是不計算任何東西。我知道一些行應該拋出多於一行的結果。Application.WorksheetFunction.Sum不適用於篩選結果VBA
這就是我想要做的事:
For Each Code In BomCodes
With InventorySheet
.AutoFilterMode = False
.Range("B1").AutoFilter Field:=2, Criteria1:="Project"
.Range("D1").AutoFilter Field:=4, Criteria1:="ContractNumber"
.Range("N1").AutoFilter Field:=14, Criteria1:="Code"
.Range("Q1").AutoFilter Field:=17, Criteria1:=">0"
End With
'Do a search through the filtered inventory
Set rangeFilteredInventory = InventorySheet.Range("Q2:Q" & Cells(Rows.Count, "Q").End(xlUp).Row)
'Get the sum of all results
With InventorySheet
TotalQty = WorksheetFunction.Sum(rangeFilteredInventory.SpecialCells(xlCellTypeVisible))
If TotalQty <> 0 Then
Debug.Print TotalQty, vbNewLine, vbNewLine
End If
End With
Next Code
我試過,而不使用與InventorySheet,採用全
Applicaiton.WorksheetFunction.Sum
,
Set rangeFilteredInventory = InventorySheet.Range("Q2:Q" & Cells(Rows.Count, "Q").End(xlUp).Row)
遍歷所有但如果我評論如果結構,它總是顯示0.
更改爲
Set rangeFilteredInventory = InventorySheet.Range("Q2:Q" & Rows.Count).End(xlUp).Row
它不訪問,甚至在第一個記錄
而且還
Set rangeFilteredInventory = InventorySheet.Range("Q" & Rows.Count).End(xlUp).Row
它沒有任何訪問的第一個記錄。
所以,我的想法是,我的範圍錯了。它應該總結該表中的所有「Q」。
,如果我做一個宏觀上表,做
With Worksheets("sbom")
.AutoFilterMode = False
.Range("B1").AutoFilter Field:=2, Criteria1:="5522970"
.Range("D1").AutoFilter Field:=4, Criteria1:="0008621302140U"
.Range("N1").AutoFilter Field:=14, Criteria1:="LVE70001372"
.Range("Q1").AutoFilter Field:=17, Criteria1:=">0"
End With
它返回多個記錄。
對不起,如果我是新的東西在那裏以錯誤的方式,我是新來的VBA和我自己學習。
編輯:
我切換總和小計,雖然它的循環,TotalQty仍然是0。我用BK201給我改進一些地方的部分答案。
For Each Code In BomCodes
Debug.Print "Grabbed Code:", Code, vbNewLine
With InventorySheet
.AutoFilterMode = False
LRowOnQ = .Columns("Q").End(xlUp).Row
.Range("B1").AutoFilter Field:=2, Criteria1:="Project"
.Range("D1").AutoFilter Field:=4, Criteria1:="ContractNumber"
.Range("N1").AutoFilter Field:=14, Criteria1:="Code"
.Range("Q1").AutoFilter Field:=17, Criteria1:=">0"
Set rangeFilteredInventory = .Range("Q2:Q" & LRowOnQ)
End With
'Do a search through the filtered inventory
'Get the sum of all results
' With InventorySheet
TotalQty = WorksheetFunction.Subtotal(9, rangeFilteredInventory.SpecialCells(xlCellTypeVisible))
If TotalQty <> 0 Then
Debug.Print TotalQty, vbNewLine, vbNewLine
End If
Next Code
您是否嘗試過使用SUBTOTAL()函數而不是SUM()函數? –
我同意加里你可以在整個專欄上使用小計。這就是它的目的,爲什麼你必須'使用InventorySheet'在兩個語句之間只有一行,也可以使用with命令? – user2140261
同意加里在這一個。 SUBTOTAL似乎更適合這項法案。但是,爲了更好地編寫代碼,請參閱下面的答案。 – Manhattan