Страницы: 1
RSS
Обработка строк макросом в цикле до первой пустой строки, оптимизация записанного средствами Excel макроса
 
Добрый день.

Имеется следующий (записанный средствами Excel) макрос:
Скрытый текст
В нем записаны "проходы" для первых двух строк таблицы, по которым он работает (выполняет одни и те же действия для каждой из заданных строк). Как оптимизировать его таким образом, чтоб скрипт был по-короче (например с использованием FOR TO для подстановки номеров строк (отмечены красным)) и "обрабатывал" все строки, дойдя до первой пустой строки (строки постоянно дополняются, сейчас первыми пустыми явяются строки A270:F270).
(действия для всех строк одинаковы, единственное что меняется, если вбивать макрос вручную, это отмеченные красным ячейки (т.е. A1:F1 / A2:F2 / A3:F3 и т.п. и  G1/G2/G3 и т.п.).

Заранее спасибо!
Изменено: Excel-Starter - 29.10.2015 22:17:26
 
Для начала уберите все строки с ActiveWindow.ScrollColumn- невозможно ведь читать код!...
 
сначала определяем номер последней заполненной строки на листе:
Код
I=cells(rows.count,1).end(xlUp).row

потом гоняем цикл для заполненных строк
Код
For J = 1 to I
'...какие-то действия
Next J


копирование и вставку можно без использования Select
например, копируем диапазон с переменной строкой и от А до F в G
Код
For J = 1 to I
Range(cells(J, "A"), cells(J, "F").Copy Cells(J, G)
Next J
Кому решение нужно - тот пример и рисует.
 
Hugo, убрал

Пытливый, заменил:
Скрытый текст

выдается ошибка.
Изменено: Excel-Starter - 29.10.2015 16:34:57
 
1. На какой строке выдается ошибка?
2. Переменная для цикла j. В адресе ячеек используете J. Почему?

P.S. По-моему, гораздо проще было набросать файл-пример, описать свои хотелки и местные корифеи давно бы написали компактный макрос под ваши задачи.
Кому решение нужно - тот пример и рисует.
 
Ошибка в строке:
Range(cells(J, "A"), cells(J, "F").Copy Cells(J, G)
Брал ее из кода в Вашем сообщении
Код
For J = 1 to I
Range(cells(J, "A"), cells(J, "F").Copy Cells(J, G)
Next J
 
ActiveWindow.SmallScroll Down:=-30
убрать, G взять в кавычки. Для начала, дальше не вникал.
 
Cells(J, "G") кавычки вокруг G поставьте.
Кому решение нужно - тот пример и рисует.
 
Не помогло:
Compile Error: Expected List Separator or )

Range(cells(J, "A"), cells(J, "F").Copy Cells(j, "G")
 
я уже написал, переменная для цикла = j (или, если хотите J)
Она потом используется для адресации ячейки.
НЕЛЬЗЯ в одном месте писать j, а в другом J - для программы это РАЗНЫЕ вещи.
Range(cells(J, "A"), cells(J, "F")).Copy Cells(J, "G")

p.s. Файл с внятным описанием что надо сделать не хотите показать? Давно б уж все решили...
Кому решение нужно - тот пример и рисует.
 
Цитата
Excel-Starter написал: Expected List Separator or )
пишет ведь что скобки не хватает.
 
Прикладываю упрощенный пример
Изменено: Excel-Starter - 29.10.2015 17:29:57
 
Hugo
Скобку добавлял - не помогает...
 
в примере ОЧЕНЬ бы хорошо написать - вот есть, вот что надо, чтобы было.
А то - ну таблица. И?
Кому решение нужно - тот пример и рисует.
 
записанный макрос по двум строкам в итоге проставляет в столбец G количество значений, больших 50. К чему такие сложности?...может просто протянуть формулу?
 
Цитата
Excel-Starter написал: Скобку добавлял - не помогает...
Очевидно не туда добавляли. Всем помогает, Вам не помогает...
 
Пытливый
Надо чтоб после запуска макроса подтсавлялись значения из ячеек А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
Кому решение нужно - тот пример и рисует.
 
Пытливый
В исходной таблице такое простое решение не годится, там обязательно нужно переписывать значения, иначе не посчитается результат в ячейке BK1
 
Ок. :)
Код
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
Изменено: Пытливый - 29.10.2015 19:11:52
Кому решение нужно - тот пример и рисует.
 
Пытливый
Благодарю! Выглядет - оптимально, но не срабатывает. Прерывается на строке
Код
Range("G" & lngI) = Range("BK1")
Прерывается на заполнении то 48, то 40, то 34, то 15 строки (каждый раз по-разному)
Изменено: Excel-Starter - 29.10.2015 20:42:56
 
Вот версия таблицы, более похожая на финальную. Скрипт доходит до 15-60 строки и прерывается...
 
Довел код до такого вида: все равно не работает, где-то ошибка.
Код
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
Изменено: Excel-Starter - 30.10.2015 14:48:24
 
For i = 1 To Range("AM1")
Что в этой строке написано? От i = 1 до значения, содержащегося в AM1
Зачем? Бегать по циклу ж надо от первой строки до последней заполненной?

p.s. В примере с таблицей "более похожей на финальную" - 15 раз запускал макрос - все корректно отрабатывает, заполняет G до 260 строки без прерываний.
Может не в макросе проблема?
Изменено: Пытливый - 30.10.2015 14:52:45
Кому решение нужно - тот пример и рисует.
 
Пытливый
У меня вылазит ошибка

В финальной таблице каждый следующий подход требуется нажимать "Continue" для продолжения исполнения скрипта: для каждой строчки.

(B AM1 - ячейке находится номер последней заполненной строки)
Изменено: Excel-Starter - 30.10.2015 14:57:39
 
А вычисления на листе у вас в автоматическом режиме стоят?

Хотя... если нет - ну и что? тупо бы непересчитанные значения бы заполнялись...

Хм... даже не знаю пока в чем может быть причина.... думаю....

О!!!!!
А какие еще макросы есть в книге/на листе? Типа на изменение значения на листе?
Изменено: Пытливый - 30.10.2015 15:30:50
Кому решение нужно - тот пример и рисует.
 
Пытливый, больше никаких, без макросов.
Страницы: 1
Наверх