Excel VBA: подсчет данных в столбце из другой книги и ввод счетчика в главную книгу

#vba #excel #macros #counter

#vba #excel #макросы #счетчик

Вопрос:

Мне нужно создать макрос в моем CountResults.xlsm (Главная книга), который решает следующую проблему. У меня есть столбец данных на другом листе с ДА или НЕТ. Мне нужно придумать макрос, который подсчитывает количество «ДА» в столбце. Столбец расположен на листе 2 книги Test01.xlsx . Затем возьмите это количество и поместите его в одну ячейку в моем файле CountResults.xlsm. Вот так:

YESorNO

У меня есть код, который отображает счетчик для столбца на том же листе. Но этот код не учитывается, когда в столбце есть «разрывы» (пустые пробелы), как у меня на картинке. Это тот код:

 Private Sub CommandButton1_Click()

MsgBox Range("A1").End(xlDown).Row
Range("A1").End(xlDown).Offset(1, 0).Select

End Sub
 

У меня есть другой код, который помогает получить доступ к другой книге и определить значения для каждой книги и рабочего листа:

 Dim wbSource As Workbook
Dim wbTarget As Workbook
Dim shSource As Worksheet
Dim shTarget As Worksheet

Set wbSource = Workbooks.Open(Filename:="C:Userskhanr1DesktopTest_ExcelTest03.xlsm", ReadOnly:=True)
Set wbTarget = ThisWorkbook
Set shSource = wbSource.Worksheets("Sheet2")
Set shTarget = wbTarget.Worksheets("Sheet1")
 

Ответ №1:

Используйте COUNTIF . Это даст вам общее количество, даже если диапазон находится в другой книге. =COUNTIF([Book2.xlsx]Sheet2!$D$2:$D$9, "Yes") т. е. Проблема с наличием COUNTIF в вашем листе в виде формулы заключается в том, что вам нужно будет открыть другую книгу, если вы хотите, чтобы счетчик обновлялся. Приведенный ниже код VBA выполнит обновление для вас. Назначьте подраздел кнопке в вашей CountResults.xlsm книге

РЕДАКТИРОВАТЬ: добавлено количество строк в соответствии с требованиями OP

 Sub UpdateResults()

    Dim oWBWithColumn As Workbook: Set oWBWithColumn = Application.Workbooks.Open("<your Test01.xlsx address here>")
    Dim oWS As Worksheet: Set oWS = oWBWithColumn.Worksheets("Sheet2")
    Dim intLastRow as Integer: intLastRow = oWS.Cells(Rows.Count, "B").End(xlUp).Row

    ThisWorkbook.Worksheets("<name of the sheet in your CountResults.xlsm workbook>").Range("<cell address>").Value = Application.WorksheetFunction.CountIf(oWS.Range("B2:B" amp; intLastRow), "yes")

    oWBWithColumn.Close False

    Set oWS = Nothing
    Set oWBWithColumn = Nothing

End Sub
 

Комментарии:

1. Просто понял, что COUNTIF это сработает, только если у вас открыта книга с ожидаемым столбцом. Обновил мой ответ, чтобы также предоставить вам опцию VBA

2. Работает отлично! Не могу отблагодарить вас, Зак. У меня был еще один вопрос. Если бы я хотел перейти от B2 к концу столбца B. Как бы это выглядело? (B2: B)?

3. @Ridwan — если это сработало (как я полагаю, это сработало), пожалуйста, убедитесь, что «приняли» ответ Зака, щелкнув флажок. Это гарантирует, что будущие пользователи с аналогичными проблемами увидят в этом решение. Кроме того, это дает надлежащий кредит

4. @Hambone Спасибо, что уведомили меня об этом. Кроме того, как я могу продолжить и должным образом оценить его код? Спасибо

5. @Hambone: Спасибо, что побудили OP принять ответ. @Ridwan: не думайте, что вы можете просто использовать B2:B . Я обновлю свой ответ, чтобы включить все ячейки в вашу строку