2016-03-15 4 views
2

У меня есть таблица вроде этого:Получить счет нескольких секций колонны

A1   B1 Team 1 C1 Team 2 D1 Team 3 
A2 Name  B2 A  C2 B  D2 C 
A3   B3 D  C3 E  D3 F 
A4   B4 G  C4   D4 H 
A5 School B5 AB  C5 CD  D5 
A6   B6 GH  C6 EF  D6 
A7   B7   C7 IJ  D7 

Я пытаюсь написать макрос, чтобы получить значение счетчика непустых строк следующим образом:

A1   B1 Team 1 C1 Team 2 D1 Team 3 
A2 Name  B2 A  C2 B  D2 C 
A3   B3 D  C3 E  D3 F 
A4   B4 G  C4   D4 H 
A5   B5 3  C5 2  D5 3 
A6 School B6 AB  C6 CD  D6 
A7   B7 GH  C7 EF  D7 
A8   B8   C8 IJ  D8 
A9   B9 2  C9 3  D9 0 

где 5-я и 9-я строки дают количество нечетных строк. Мне нужно сделать это с помощью макросов.

ответ

1

Вы можете достичь этого, используя функцию COUNTA в VBA. С динамическими выходными строками я настоятельно рекомендую помечать эти строки, чтобы код мог их легко найти. В этом случае я сделал это, поставив «Name Count» в ячейке A5 и «School Count» в ячейке A9 (во второй таблице, которую вы опубликовали). Они могут быть в любой строке. Код найдет их до тех пор, пока они находятся в столбце A.

Для дальнейшего использования использование названных диапазонов будет намного более чистым и эффективным способом.

Sub der() 

'Declare and set worksheet object 
Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Sheet1") 'Worksheet name here 

Dim nameOutRow As Integer, schoolOutRow As Integer 
Dim ns As Integer, ne As Integer, ss As Integer, se As Integer 

'Find the Output rows 
nameOutRow = Application.Match("Name Count", ws.Columns(1), 0) 
schoolOutRow = Application.Match("School Count", ws.Columns(1), 0) 

'Determine Name count range 
ns = Application.Match("Name", ws.Columns(1), 0) 'name start row 
ne = nameOutRow - 1 'name end row 

'School count range 
ss = Application.Match("School", ws.Columns(1), 0) 'school start row 
se = schoolOutRow - 1 'school end row 

'Names 
ws.Range("B" & nameOutRow) = Application.CountA(ws.Range("B" & ns & ":B" & ne)) 
ws.Range("C" & nameOutRow) = Application.CountA(ws.Range("C" & ns & ":C" & ne)) 
ws.Range("D" & nameOutRow) = Application.CountA(ws.Range("D" & ns & ":D" & ne)) 

'Schools 
ws.Range("B" & schoolOutRow) = Application.CountA(ws.Range("B" & ss & ":B" & se)) 
ws.Range("C" & schoolOutRow) = Application.CountA(ws.Range("C" & ss & ":C" & se)) 
ws.Range("D" & schoolOutRow) = Application.CountA(ws.Range("D" & ss & ":D" & se)) 


End Sub 
+0

Фактически записи в столбцах B, C, D являются динамическими. Следовательно, я не могу жестко закодировать диапазон для B5, C5 и т. Д. @oortCloud Можете ли вы, пожалуйста, помочь мне с этим? – TanviP

+0

@TanviP, см. Правки – oortCloud

+0

Спасибо @oortCloud! Есть только одна проблема. Я получаю ошибку несоответствия типа на 'nameOutRow = Application.Match (« Количество имени », ws.Columns (1), 0)« Не могли бы вы помочь? – TanviP

Смежные вопросы