#excel #vba #excel-formula #countif
#excel #vba #excel-формула #countif
Вопрос:
У меня есть данные, хранящиеся на нескольких листах в Excel. Каждый рабочий лист имеет точно такую же структуру данных.
Я пытаюсь создать скрипт, который дает мне приятный летний вид на другом рабочем листе.
На этом листе имена листов перечислены в столбце 1, и я хочу подсчитать строки, которые удовлетворяют определенным условиям. Мне удалось создать countifs
функцию, которая подсчитывает строки, для которых определенный столбец имеет ИСТИННОЕ логическое значение, но у меня также есть значения даты и времени, и я хочу посчитать их между двумя конкретными датами. В чем я ошибаюсь?
for i = [got the range right here]
wsOverview.cells(i, 2).Formula = "=countifs(" amp; ThisWorkbook.sheets(wsOverview.cells(i, 1).value).Range("AI:AI").Address(external:=True) amp; ","">""" amp; wsOverview.cells(1,2).value amp; ")"
next i
(это попытка указать дату, превышающую критерии, я не беспокоюсь о максимальном значении даты, пока мне не удастся сделать это правильно.)
Проблема где-то в последней части, потому что замена "">""" amp; wsOverview.cells(1,2).value
на TRUE и AIs на столбец с логическими данными дает результаты.
Комментарии:
1. Сохраните дату (даты) в ячейках на листе и получите
amp; ", "">"" amp; A1)"
?2. Мне не хватало знака amp; перед ссылкой на ячейку в формуле. Должно быть, меня смутило аналогичное использование того же знака amp; в скрипте VBA и фактической формуле ячейки Excel. Это помогло, спасибо! Вы также можете добавить его в качестве ответа. Я знаю, что мог бы, но я здесь новичок, и я не хочу красть вашу славу поиска ошибок! В качестве альтернативы, я сделаю это, если ты этого хочешь, @GSerg.
3. Пожалуйста, не стесняйтесь публиковать ответ.
Ответ №1:
Основываясь на замечании GSerg, мне удалось сделать это правильно.
Это была проблема со знаками amp;, я использовал только те, которые связывали код VBA, но забыл тот, который заставлял работать формулу ячейки.
Я сделал что-то вроде замены
"">""" amp;
с
"">""amp;" amp;
в результате ячейка, имеющая одну из ячеек в countifs, функционирует правильно.
=countifs(proper criteria range; ">"amp;B2)
Ответ №2:
Попробуйте это (A1 содержит первую дату, B1 — вторую дату):
Sub frm()
Set wsOverview = Worksheets("over")
template = "=COUNTIFS(INDIRECT(#amp;""!B:B""),"">""amp;over!A1,INDIRECT(#amp;""!B:B""),""<""amp;over!B1)"
For i = 2 To 4
wsOverview.Cells(i, 2).Formula = Replace(template, "#", wsOverview.Cells(i, 1).Address)
Next i
End Sub
Комментарии:
1. Это кажется отличным способом написать то, что я хочу, в более коротком коде, и я многому научился, но сначала мне нужно заставить его работать. Я также считаю, что часть моего кода, которая называет рабочий лист, на который мне нужно ссылаться, работает хорошо, поскольку более простой подсчет работает так, как задумано. Это заставляет меня думать, что проблема где-то в синтаксисе логического условия ячеек, содержащих информацию о времени и дате, превышающую определенную дату.
2. Простой способ создать правильную строку формулы — создать и отладить формулу в ячейке с пользовательским интерфейсом, затем поместить курсор на ячейку с формулой, открыть IDE VBA и ввести в немедленном окне «?activecell.formula» (без «) и нажать Enter. Используйте распечатанную формулу в качестве основы в коде VBA, она должна иметь правильный синтаксис.