#vba #excel #macros #counter
#vba #excel #макросы #счетчик
Вопрос:
Мне нужно создать макрос в моем CountResults.xlsm (Главная книга), который решает следующую проблему. У меня есть столбец данных на другом листе с ДА или НЕТ. Мне нужно придумать макрос, который подсчитывает количество «ДА» в столбце. Столбец расположен на листе 2 книги Test01.xlsx . Затем возьмите это количество и поместите его в одну ячейку в моем файле CountResults.xlsm. Вот так:
У меня есть код, который отображает счетчик для столбца на том же листе. Но этот код не учитывается, когда в столбце есть «разрывы» (пустые пробелы), как у меня на картинке. Это тот код:
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
это сработает, только если у вас открыта книга с ожидаемым столбцом. Обновил мой ответ, чтобы также предоставить вам опцию VBA2. Работает отлично! Не могу отблагодарить вас, Зак. У меня был еще один вопрос. Если бы я хотел перейти от B2 к концу столбца B. Как бы это выглядело? (B2: B)?
3. @Ridwan — если это сработало (как я полагаю, это сработало), пожалуйста, убедитесь, что «приняли» ответ Зака, щелкнув флажок. Это гарантирует, что будущие пользователи с аналогичными проблемами увидят в этом решение. Кроме того, это дает надлежащий кредит
4. @Hambone Спасибо, что уведомили меня об этом. Кроме того, как я могу продолжить и должным образом оценить его код? Спасибо
5. @Hambone: Спасибо, что побудили OP принять ответ. @Ridwan: не думайте, что вы можете просто использовать
B2:B
. Я обновлю свой ответ, чтобы включить все ячейки в вашу строку