1

私は Stackoverflow フォーラム (および基本的には Google の他のすべての場所) を見回して、VBA にもう少し精通していればおそらく十分である私の質問に対する多くの「ほぼ」回答を見つけましたが、いじりましたしばらくの間、整理できませんでした。少しイライラしてきたので、質問する時が来たと思いました!私の問題を説明するときに言葉遣いなどが間違っていたらごめんなさい!それはおそらく私の構文の問題です。

基本的に、スプレッドシートの列からデータを取得し、特定のパラメーター セットのセルの Countifs (とにかくだと思います) を実行できるようにする必要があります。必要なデータはすべて、「Dimension1 x Dimension 2」、たとえば「8.5 x 11」の形式のページ ディメンションになります。

Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "8.5 x 11")

この式は、おそらく驚くべきことではありませんが、問題なく機能します。しかし、次元を反転させるだけでなく、<= 8.5 x <=11 の次元を与えるには、countifs (または必要なもの) が必要です (<=11 x <=8.5)。

式を(および同様の)形式に変更しようとしました

Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "<=8.5" & " x " & "11")

しかし、それは 3 x 4 や 22 x 11 などの次元を報告します。countif が複数のパラメーターを使用できることは知っています (これが、通常の countif ではなく、いじっていた理由です)。引数が正しいパスであるか、引用符が正しく使用されているかどうか、または...誰が知っていますか?

If-then ステートメントを問題なく動作させることができました (配列を使用し、カウンターを使用して各セルを循環させます) が、これは明らかに最速の方法ではありません。これが、私の目標をもう少し明確にするためです。

'If x(0) <= 8.5 And x(1) <= 11 Or x(1) <= 8.5 And x(0) <= 11 Then

関連する問題では、前の質問 (8.5 X 11) の検索結果を含めずに、たとえば <=11 x <=17 などのページを見つけることができる必要もあります。そのため、<8.5 のように >=17 未満というような複数のパラメーターの適切な構文を知る必要があります。

前もって感謝します!どんな助けでも大歓迎です。十分に説明していない場合はお知らせください。

編集:私が検索するデータの例:

A                     Count for 8.5 x 11 (expected output)
8.6 x 11              5
8.5 x 11  
8.5 x 11  
8.5 x 11  
8.5 x 11  
8.4 x 11  
22 x 11  
10 x 17   
4

1 に答える 1

1

このUDFを試すことができます:通常のVBAモジュールにコピーして貼り付けます。範囲と、小さいディメンションと大きいディメンションの下限/上限をそれぞれ渡します。

例: 小さい辺が 8 から 10 の間、大きい辺が 12 から 14 の間 (両端を含む) のすべてのサイズを数えるには:

=CountSizes(A:A,8,10,12,14)

編集:8.5x11以下の特定のユースケース向け

=countsizes(A:A, 0, 8.5, 0, 11)  'one side btw 0 and 8.5 & one side btw 0 and 11.5   

EDIT3: 2 番目の列を含め、UDF としてではなく VBA からこれを使用する方法を示す

Sub Tester()
    With ThisWorkBook.Sheets("Pages")
        'count only where second column has "Color"
        .Range("B1").Value = CountSizes(.Range("A:B"), "Color", 0, 8.5, 0, 11)
    End With
End sub

コード:

Function CountSizes(rng As Range, colorType As String, _
                     smallGE, smallLE, largeGE, largeLE)

    Dim tmp, val, v1, v2, small, large, arr, arrVals
    Dim num As Long, r As Long, nr As Long

    num = 0
    arr = rng.Value
    nr = UBound(arr, 1)
    For r = 1 To nr
        val = Trim(arr(r, 1))
        If val Like "*x*" Then
            arrVals = Split(val, "x")
            v1 = Trim(arrVals(0))
            v2 = Trim(arrVals(1))
            If IsNumeric(v1) And IsNumeric(v2) Then
                v1 = CDbl(v1)
                v2 = CDbl(v2)
                If v1 > v2 Then
                    small = v2: large = v1
                Else
                    small = v1: large = v2
                End If

                If small >= smallGE And small <= smallLE And _
                   large >= largeGE And large <= largeLE Then

                    If Trim(arr(r, 2)) = colorType Then
                        num = num + 1
                    End If

                End If

            End If
        End If
    Next r

    CountSizes = num
End Function
于 2013-01-02T19:26:33.790 に答える