2013-02-15 3 views
1

То, что я пытаюсь сделать, это перебрать диапазон, содержащий имена рабочих листов, и если ячейка не пуста, добавьте результат функции CountA в переменную count.WorksheetFunction.CountA не возвращает правильное значение

Таким образом, переменная count должна быть равна числу непустых ячеек в диапазоне B9:B28 на листах, которые я выполняю, но, как ни странно, это значение равно числу непустых ячеек в диапазоне, который я собираюсь через (sheet1!d5:d24).

Что я делаю неправильно? Вот код, я использую:

For Each c In Worksheets("Sheet1").Range("d5:d24").Cells 
    If Not IsEmpty(c) Then 
     count = count + WorksheetFunction.CountA(c & "!b9:b28") 
    End If 
Next 

Я попробовал альтернативный метод перебора второго диапазона и, если клетки не являются пустыми, то приращение переменной на 1, но что это дает несоответствиеВремя работы ошибки 13 типа ошибка. Это то, что я делаю сейчас:

For Each c In Worksheets("Sheet1").Range("d5:d24") 
    If Not IsEmpty(c) Then 
     For Each c2 In Worksheets(c).Range("b9:b28") 
      If Not IsEmpty(c2) Then 
       'count = count + WorksheetFunction.CountA(c & "!b9:b28") 
       count = count + 1 
      End If 
     Next 
    End If 
Next 

Пожалуйста, помогите мне. Большое спасибо заранее всем тем, кто забирает время, чтобы ответить.

+3

Я думаю, вам нужно предоставить '.CountA' с объектом диапазона и не строки. Попробуйте '.CountA (Worksheets (c) .Range (" B9: B28 "))' –

+1

Вы используете ячейку (как объект диапазона) и пытаетесь добавить к ней нотацию адреса. Конечно, это не сработает. Следуйте совету @PeterAlbert. –

+0

Спасибо за быстрые ответы. Я попробовал решение @Peter Albert, но он выбросил ошибку несоответствия типа. Я представил строку, потому что я думал, что функции работают одинаково в VBA, как в Excel. –

ответ

4

основе @Peter Альберт и комментарии @Peter L. «s, наконец, получил это работает. Правильный код:

For Each c In Worksheets("Sheet1").Range("d5:d24").Cells 
If Not IsEmpty(c.Value) Then 
    count = count + WorksheetFunction.CountA(c.Value & "!b9:b28") 
End If 
Next 

Спасибо большое, ребята :)

+0

My +1 специально для самообучения! –

1

Попробуйте это:

Sub CountColBForColD() 
Dim c As Range 
Dim r As Long 'row counter 
Dim rngB As Range 
Dim rngD As Range 
Dim lookSheet As Worksheet 

Set rngD = Sheets("Sheet1").Range("D5:D24") 
Set rngB = Range("B9:B28") 
r = 1 

For Each c In rngD 
    If Not IsEmpty(c) Then 
     On Error GoTo InvalidSheetName 
     Set lookSheet = Sheets(rngB(r).Value) 
     On Error GoTo 0 
     Count = Count + WorksheetFunction.CountA(_ 
      lookSheet.Range(rngB.Address)) 
      c.Offset(0, 1).Value = Count 
      r = r + 1 
    End If 
NxtC: 
Next 

Exit Sub 

InvalidSheetName: 
Err.Clear 
MsgBox "Sheet named in " & rngB(r).Address & " does not exist.", vbInformation 
Resume NxtC 

End Sub 
+0

Спасибо @ David Zemens, но я также получил его работу. На самом деле спасибо за то, что вы так быстро подвезли суб. –

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