1

これをできる限り単純かつ非特定に保つようにします。a、b、cの3つの列があります。列 C には、セル C1 ~ C100 に 100 個の乱数があります。列 A には、セル C1:C5 に 5 つの乱数があります。

セル B1:B5 ごとに、列 a の数値が列 c に何回表示されるかを入力します。数式をセル B1 に直接書き込む場合は、次のようになります。

=COUNTIF($C:$C, $A1)

次に、下にドラッグしてセル B2:B5 を埋めます。

VBA の Application.WorksheetFunction.CountIf 関数を使用してこれを実行したいと考えています (実際のプロジェクトはこれよりもはるかに複雑で、セルに自動的に入力する必要があります)。

Dim colb As Range
Set colb = Range("$B1:$B5")

Dim colc As Range
Set colc = Range("$C:$C")

Dim cola As Range
Set cola = Range("$A:$A")

For Each bcell In colb
    bcell.Formula = Application.WorksheetFunction.CountIf(colc, bcell.Offset(0, -1))
Next bcell

これは正しく動作します。しかし、For-Each ループを使用せずに、B のセルの数を指定せずに実行できるかどうか疑問に思っています (A が最後の値に達したことを認識し、それに応じて B の入力を停止します。

Dim colb As Range
Set colb = Range("$B:$B")

私の考えでは、重要な行は次のようになります。

colb.Formula = Application.WorksheetFunction.CountIf(colc, cola)

しかし、これはうまくいきません。私が求めていることは可能ですか?Excel に範囲全体を一度に入力させると、ループするよりも高速になると思います。

4

2 に答える 2

1

ループは必要ありませんし、worksheetfunctionを使用する必要もありません:)これはあなたが望むことをします。

Range("$B1:$B5").Formula="=COUNTIF($C:$C, $A1)"

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim colb As Range

    Set ws = Sheets("Sheet1")
    Set colb = ws.Range("$B1:$B5")

    colb.Formula = "=COUNTIF($C:$C, $A1)"
End Sub
于 2012-05-08T08:29:53.140 に答える
1

評価を使用できます:

Sub testeval()
Dim vArr As Variant
Dim nARows As Long
Dim nCRows As Long
Dim oSht1 As Worksheet
Dim strSheet As String

Set oSht1 = ActiveSheet
strSheet = oSht1.Name & "!"
nARows = oSht1.Range("A1").Offset(oSht1.Rows.Count - 1).End(xlUp).Row
nCRows = oSht1.Range("C1").Offset(oSht1.Rows.Count - 1).End(xlUp).Row
vArr = oSht1.Evaluate("=INDEX(COUNTIF(" & strSheet & "$C1:$C" & CStr(nCRows) & "," & strSheet & "$A1:$A" & CStr(nARows) & "),0,1)")
oSht1.Range("$B1").Resize(UBound(vArr), 1) = vArr
End Sub
于 2012-05-08T08:24:47.880 に答える