Spl*_*nia 1 excel vba excel-vba
我有点卡在这里.我在应用过滤器的应用程序中应用了一个过滤器,如下所示(示例项999)
项目Inv.数量Avi.数量标志BOX
999 12 9 N X1
999 23 17 Y X2
999 1 1 N X14
999 21 3 N X113
Run Code Online (Sandbox Code Playgroud)
我试图获得"Flag"列值,(在过滤器内部并且它崩溃)代码:
With InventorySheet
.AutoFilterMode = False
LRowOnQ = .Cells(Rows.Count, "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("Q1:Q" & LRowOnQ)
ControlFlag = .Range("L2").Value
End With
Run Code Online (Sandbox Code Playgroud)
在过滤器之后,它总是采用相同的值.码:
With InventorySheet
.AutoFilterMode = False
LRowOnQ = .Cells(Rows.Count, "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("Q1:Q" & LRowOnQ)
End With
ControlFlag = InventorySheet.Range("L2").Value
Run Code Online (Sandbox Code Playgroud)
有没有办法获取结果范围最常见的字母?我知道小计中有一个平均选项,但我认为它只适用于数字.
编辑:尝试代码:
With InventorySheet
.AutoFilterMode = False
LRowOnQ = .Cells(Rows.Count, "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("Q1:Q" & LRowOnQ)
Set ControlRange = .Range("L1:L" & LRowOnQ)
End With
ControlFlag = WorksheetFunction.Subtotal(1, ControlRange.SpecialCells(xlCellTypeVisible))
Run Code Online (Sandbox Code Playgroud)
它甚至没有循环.
这可以使用该MODE功能来实现.所以不需要VBA.
数字的例子
=MODE(IF(SUBTOTAL(3,OFFSET(Range,ROW(Range)-MIN(ROW(Range)),0,1)),Range*{1,1}))
Run Code Online (Sandbox Code Playgroud)
文字的例子
=INDEX(A3:A21,MODE(IF(SUBTOTAL(3,OFFSET(A3,ROW(A3:A21)-ROW(A3),0)),MATCH(A3:A21,A3:A21,0)*{1,1})))
Run Code Online (Sandbox Code Playgroud)
ctrl + shift + enter(因为它是一个数组公式)
您可以阅读有关此处的讨论
这是使用纯VBA的另一种解决方案:
Public Function ModeSubTotal(rng As Range) As String
Dim Dn As Range
Dim oMax As Double
Dim K As Variant
Dim val As String
With CreateObject("scripting.dictionary")
.CompareMode = vbTextCompare
For Each Dn In rng
If Dn.Rows.Hidden = False Then
If Not .Exists(Dn.Value) Then
.Add Dn.Value, 1
Else
.Item(Dn.Value) = .Item(Dn.Value) + 1
End If
End If
Next
oMax = Application.Max(Application.Transpose(.Items))
For Each K In .keys
If .Item(K) = oMax Then
val = val & K & ","
End If
Next K
ModeSubTotal = Left(val, Len(val) - 1)
End With
End Function
Run Code Online (Sandbox Code Playgroud)
因为它是一个UDF,你可以在工作表中使用,就像一个普通的函数:

或者您可以轻松地在代码中调用它:
Public Sub test()
Sheet1.Cells(1, 1).Value = ModeSubTotal(Range("C1:C20"))
End Sub
Run Code Online (Sandbox Code Playgroud)
该函数此时将空白计为值,因此如果空白是将返回的最大值,则可以非常轻松地更改.