В нем записаны "проходы" для первых двух строк таблицы, по которым он работает (выполняет одни и те же действия для каждой из заданных строк). Как оптимизировать его таким образом, чтоб скрипт был по-короче (например с использованием FOR TO для подстановки номеров строк (отмечены красным)) и "обрабатывал" все строки, дойдя до первой пустой строки (строки постоянно дополняются, сейчас первыми пустыми явяются строки A270:F270). (действия для всех строк одинаковы, единственное что меняется, если вбивать макрос вручную, это отмеченные красным ячейки (т.е. A1:F1 / A2:F2 / A3:F3 и т.п. и G1/G2/G3 и т.п.).
я уже написал, переменная для цикла = j (или, если хотите J) Она потом используется для адресации ячейки. НЕЛЬЗЯ в одном месте писать j, а в другом J - для программы это РАЗНЫЕ вещи. Range(cells(J, "A"), cells(J, "F")).Copy Cells(J, "G")
p.s. Файл с внятным описанием что надо сделать не хотите показать? Давно б уж все решили...
записанный макрос по двум строкам в итоге проставляет в столбец G количество значений, больших 50. К чему такие сложности?...может просто протянуть формулу?
Пытливый Надо чтоб после запуска макроса подтсавлялись значения из ячеек А1-F1 в ячейки ВJ1-ВJ6 , далее получившееся в результате этого значение из ячейки BK1 копировалось в ячейку G1, далее все повторяется со второй строкой: после запуска макроса подтсавлялись значения из ячеек А2-F2 в ячейки ВJ1-ВJ6 , далее получившееся в результате этого значение из ячейки BK1 копировалось в ячейку G2, и так далее, до момента, когда следующая строка оказывается пустой.
yoozhik Это пример более простой таблицы, чем исходная: в исходной более сложные связи и формулы, которые на смысл макроса не влияют.
Не обязательно переписывать все в другой диапазон, там считать количество значений = 0 и потом переписывать результат в нужное место. Можно все делать в макросе:
Код
Sub t58()
Dim lngI As Long
For lngI = 1 To Cells(Rows.Count, 1).End(xlUp).Row 'от первой строки до последней заполненной
'в ячейку G соответствующей строки пишем результат работы функции СЧЕТЕСЛИ соответствующего диапазона и условия.
Range("G" & lngI) = Application.WorksheetFunction.CountIf(Range("A" & lngI & ":F" & lngI), 0)
Next lngI
End Sub
Sub t59()
Dim lngI As Long
For lngI = 1 To Cells(Rows.Count, 1).End(xlUp).Row
'транспонируем значение диапазона А:F соответствующей строки
Range("bj1:bj6").FormulaArray = "=TRANSPOSE(A" & lngI & ":F" & lngI & ")"
'тащим результат в G соответствующей строки
Range("G" & lngI) = Range("BK1")
Next lngI
End Sub
Довел код до такого вида: все равно не работает, где-то ошибка.
Код
Sub Makro()
Dim i As Long
For i = 1 To Range("AM1")
Range("bj1:bj6").FormulaArray = "=TRANSPOSE(A" & i & ":F" & i & ")"
Range("G" & i) = Range("BK1")
Next i
End Sub
For i = 1 To Range("AM1") Что в этой строке написано? От i = 1 до значения, содержащегося в AM1 Зачем? Бегать по циклу ж надо от первой строки до последней заполненной?
p.s. В примере с таблицей "более похожей на финальную" - 15 раз запускал макрос - все корректно отрабатывает, заполняет G до 260 строки без прерываний. Может не в макросе проблема?