2012-05-08 4 views
1

Я постараюсь сделать это как можно более простым и неспецифическим. У меня три столбца, a, b, c. Col C имеет сто случайных чисел в ячейках C1-C100. Col A имеет пять случайных чисел в ячейках C1: C5.Excel Application.WorksheetFunction.CountIf с использованием относительных ссылок

Для каждой ячейки B1: B5, я хочу указать, сколько раз число в столбце a появляется в col 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, a la

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

на мой взгляд, решающая линия будет что-то вроде:

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

Но это не работает ли что-то я спрашиваю возможно, я вообразите позволяя Excel заполнить весь диапазон сразу бы.? быстрее, чем зацикливание.

ответ

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 
1

Вам не нужен цикл, и вам не нужно использовать функцию рабочего листа :) Это сделает то, что вы хотите.

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 
+0

Это будет, и я считал его. Но у меня есть целая куча формул для написания, некоторые из которых чрезвычайно сложны, и у меня нет терпения для построения строк с использованием переменных vb. Вышеприведенный пример является простым примером. Реальность более сложная. – Swiftslide

+0

Можете ли вы показать мне пример сложной формулы, которую вы планируете использовать? –