1

ここでちょっと立ち往生しています。このようなシートにフィルターを適用しています。フィルターを適用すると、次のようになります (例のアイテム 999)

品目請求書 数量 Avi。フラッグBOX

999    12   9   N    X1
999    23   17  Y    X2
999    1    1   N    X14
999    21   3   N    X113

「フラグ」列の値を取得しようとしていました(フィルター内でクラッシュしました)コード:

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

フィルターの後、常に同じ値を取ります。コード:

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

結果範囲の最も一般的な文字を取る方法はありますか? 小計に平均オプションがあることは承知していますが、それは単なる数字だと思います。

編集:試したコード:

 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))

そして、それはループさえしません。

4

1 に答える 1

5

これは、関数を使用して実現できますMODE。したがって、VBA は必要ありません。


数字の例

=MODE(IF(SUBTOTAL(3,OFFSET(Range,ROW(Range)-MIN(ROW(Range)),0,1)),Range*{1,1})) 

テキストの例

=INDEX(A3:A21,MODE(IF(SUBTOTAL(3,OFFSET(A3,ROW(A3:A21)-ROW(A3),0)),MATCH(A3:A21,A3:A21,0)*{1,1})))

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

これは UDF であるため、通常の関数のようにワークシートで使用できます。

モード小計

または、コードで簡単に呼び出すこともできます。

Public Sub test()

Sheet1.Cells(1, 1).Value = ModeSubTotal(Range("C1:C20"))

End Sub

関数は現時点で空白を値としてカウントするため、返される値が空白である場合、これは非常に簡単に変更できます。

于 2013-11-01T17:05:26.320 に答える