это было записано на примере одной строки, как его "зациклить" чтобы он проделал то же самое для всей таблицы? реально таблица большая - около 700 строк.
Доброго времени суток! Есть такая задачка: с помощью функции "запись макроса" был записан макрос noise [vba]
это было записано на примере одной строки, как его "зациклить" чтобы он проделал то же самое для всей таблицы? реально таблица большая - около 700 строк.arhi
В вашем случае я бы поступил следующим образом с использование редизайнера таблиц от Николая Павлова
[vba]
Код
Sub Redesigner() Dim i As Long Dim hc As Integer, hr As Integer Dim ns As Worksheet
hr = InputBox("Сколько строк с подписями данных сверху") hc = InputBox("Сколько столбцов с подписями данных слева?") i = 1 Set inpdata = Selection Set realdata = Range(inpdata.Cells(hr + 1, hc + 1), inpdata.Cells(Selection.Rows.Count, Selection.Columns.Count)) Set ns = Worksheets.Add
For Each cell In realdata For c = 1 To hc ns.Cells(i, c) = inpdata.Cells(cell.Row, c) Next c For r = 1 To hr ns.Cells(i, c + r - 1) = inpdata.Cells(r, cell.Column) Next r ns.Cells(i, c + r - 1) = cell.Value i = i + 1 Next cell End Sub
[/vba]
Выделяете сперва диапазон всего "шума" (то что нужно выделить сделал голубым) и нажимаете на большую кнопку в файле, в двух окнах которые выскакивают подряд ставите: в первом 1, во втором 0 У Вас данный диапазон преобразовывается в плоскую таблицу. После чего проделываете тоже самое с диапазоном время (то что нужно выделить выделил оранжевым). Теперь спокойно копируете готовые данные в свои столбцы.
В вашем случае я бы поступил следующим образом с использование редизайнера таблиц от Николая Павлова
[vba]
Код
Sub Redesigner() Dim i As Long Dim hc As Integer, hr As Integer Dim ns As Worksheet
hr = InputBox("Сколько строк с подписями данных сверху") hc = InputBox("Сколько столбцов с подписями данных слева?") i = 1 Set inpdata = Selection Set realdata = Range(inpdata.Cells(hr + 1, hc + 1), inpdata.Cells(Selection.Rows.Count, Selection.Columns.Count)) Set ns = Worksheets.Add
For Each cell In realdata For c = 1 To hc ns.Cells(i, c) = inpdata.Cells(cell.Row, c) Next c For r = 1 To hr ns.Cells(i, c + r - 1) = inpdata.Cells(r, cell.Column) Next r ns.Cells(i, c + r - 1) = cell.Value i = i + 1 Next cell End Sub
[/vba]
Выделяете сперва диапазон всего "шума" (то что нужно выделить сделал голубым) и нажимаете на большую кнопку в файле, в двух окнах которые выскакивают подряд ставите: в первом 1, во втором 0 У Вас данный диапазон преобразовывается в плоскую таблицу. После чего проделываете тоже самое с диапазоном время (то что нужно выделить выделил оранжевым). Теперь спокойно копируете готовые данные в свои столбцы.DJ_Marker_MC
DJ_Marker_MC, Спасибо, но это не совсем то, дело в том, что цифры "шум" и "время" в таблице - это не набор самостоятельных цифр, их надо обрабатывать именно по строкам, чтобы из трех значений с учетом времени рассчитать эквивалентное значение. Если они собирутся все в один столбец, то не понятно, где границы бывших строк (в примере введено по 3 значение в строке, в реальной таблице их количество разное - от 1 до 12). Поэтому и хотелось использовать макрос, т.к. строк много и можно запутаться в значениях.
DJ_Marker_MC, Спасибо, но это не совсем то, дело в том, что цифры "шум" и "время" в таблице - это не набор самостоятельных цифр, их надо обрабатывать именно по строкам, чтобы из трех значений с учетом времени рассчитать эквивалентное значение. Если они собирутся все в один столбец, то не понятно, где границы бывших строк (в примере введено по 3 значение в строке, в реальной таблице их количество разное - от 1 до 12). Поэтому и хотелось использовать макрос, т.к. строк много и можно запутаться в значениях.arhi
arhi, пересохраните и выложите файл в формате .xls (Excel-2003), а текст записанного макроса Вы, похоже, уже привели в старт-топике. Будет пауза на работе - до обеда посмотрю. Я на работе не могу открывать файлы с макросами (спасибо гадам-сисадминам!)
arhi, пересохраните и выложите файл в формате .xls (Excel-2003), а текст записанного макроса Вы, похоже, уже привели в старт-топике. Будет пауза на работе - до обеда посмотрю. Я на работе не могу открывать файлы с макросами (спасибо гадам-сисадминам!)Alex_ST
Ну... Посмотрел на структуру Вашей таблицы и понял, что писать макросы для неё бесполезно ибо почти полностью отсутствует логика заполнения, да ещё и объединённые ячейки присутствуют Как Вы себе представляете "зациклить" если не ясен принцип периодичности повторения группы операций? Следуя какой формальной (программной) логике у Вас данные из ячеек O23…Q23 и R23…Т23 сначала копируются (транспонируются) в столбцы С2...С4 и А2...А4, а потом вдруг ни с того, ни с сего из N6 копируется значение в U23 ?
Так что правильно Вам посоветовал, оказывается, DJ_Marker_MC: приведите сначала структуру данных в регулярный вид так, чтобы ясно прослеживалась логика взаимосвязи ячеек, а уже потом пытайтесь что-то автоматизировать. Поймите, программа не может думать и догадываться. Она работает только по чётко заданному алгоритму, каждый шаг которого строго определён.
Ну... Посмотрел на структуру Вашей таблицы и понял, что писать макросы для неё бесполезно ибо почти полностью отсутствует логика заполнения, да ещё и объединённые ячейки присутствуют Как Вы себе представляете "зациклить" если не ясен принцип периодичности повторения группы операций? Следуя какой формальной (программной) логике у Вас данные из ячеек O23…Q23 и R23…Т23 сначала копируются (транспонируются) в столбцы С2...С4 и А2...А4, а потом вдруг ни с того, ни с сего из N6 копируется значение в U23 ?
Так что правильно Вам посоветовал, оказывается, DJ_Marker_MC: приведите сначала структуру данных в регулярный вид так, чтобы ясно прослеживалась логика взаимосвязи ячеек, а уже потом пытайтесь что-то автоматизировать. Поймите, программа не может думать и догадываться. Она работает только по чётко заданному алгоритму, каждый шаг которого строго определён.Alex_ST
По поводу того, что непонятен принцип, я так понимаю, что этот макрос - и есть группа операций, которая должна повторяться для каждой последующей строки, т.е. меняются только строки, откуда копируются значения, но они закономерно меняются, смещаясь на одну вниз. т.е. после того как макрос выполнен, ему надо сказать, спустись на строку 24 и повтори все тоже самое и так далее.
Alex_ST, теперь работает.
По поводу того, что непонятен принцип, я так понимаю, что этот макрос - и есть группа операций, которая должна повторяться для каждой последующей строки, т.е. меняются только строки, откуда копируются значения, но они закономерно меняются, смещаясь на одну вниз. т.е. после того как макрос выполнен, ему надо сказать, спустись на строку 24 и повтори все тоже самое и так далее.arhi
Сообщение отредактировал arhi - Среда, 07.05.2014, 10:06
данные из ячеек O23…Q23 и R23…Т23 сначала копируются (транспонируются) в столбцы С2...С4 и А2...А4, а потом вдруг ни с того, ни с сего из N6 копируется значение в U23
Не вижу логики в последней операции. Какое отношение имеет ячейка N6 к данному циклу заполнения, если в нём заполнялись ячейки в столбцах С2...С4 и А2...А4 ? И вообще N6, судя по Вашим формулам, вычисляется по массиву значений в столбце J, которые сами будут меняться по мере заполнения ячеек в столбцах А, В, С -------------------------------------- К стати, можно ещё чуть сократить запись Вашего макроса так:
[vba]
Код
Sub noise() Range("O23").Copy Range("C2") Range("P23").Copy Range("C3") Range("Q23").Copy Range("C4") Range("R23").Copy Range("A2") Range("S23").Copy Range("A3") Range("T23").Copy Range("A4") Range("N6").Copy: Range("U23").PasteSpecial (xlPasteValues) End Sub
[/vba]
или вообще так:
[vba]
Код
Sub noise() [O23].Copy [C2] [P23].Copy [C3] [Q23].Copy [C4] [R23].Copy [A2] [S23].Copy [A3] [T23].Copy [A4] [N6].Copy: [U23].PasteSpecial (xlPasteValues) End Sub
[/vba]
но это уже "на пределе читабельности" кода. Дальнейшее сокращение путём замены константы xlPasteValues на её значение -4163 снизит читабельность совсем.
данные из ячеек O23…Q23 и R23…Т23 сначала копируются (транспонируются) в столбцы С2...С4 и А2...А4, а потом вдруг ни с того, ни с сего из N6 копируется значение в U23
Не вижу логики в последней операции. Какое отношение имеет ячейка N6 к данному циклу заполнения, если в нём заполнялись ячейки в столбцах С2...С4 и А2...А4 ? И вообще N6, судя по Вашим формулам, вычисляется по массиву значений в столбце J, которые сами будут меняться по мере заполнения ячеек в столбцах А, В, С -------------------------------------- К стати, можно ещё чуть сократить запись Вашего макроса так:
[vba]
Код
Sub noise() Range("O23").Copy Range("C2") Range("P23").Copy Range("C3") Range("Q23").Copy Range("C4") Range("R23").Copy Range("A2") Range("S23").Copy Range("A3") Range("T23").Copy Range("A4") Range("N6").Copy: Range("U23").PasteSpecial (xlPasteValues) End Sub
[/vba]
или вообще так:
[vba]
Код
Sub noise() [O23].Copy [C2] [P23].Copy [C3] [Q23].Copy [C4] [R23].Copy [A2] [S23].Copy [A3] [T23].Copy [A4] [N6].Copy: [U23].PasteSpecial (xlPasteValues) End Sub
[/vba]
но это уже "на пределе читабельности" кода. Дальнейшее сокращение путём замены константы xlPasteValues на её значение -4163 снизит читабельность совсем.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 07.05.2014, 10:47
Alex_ST, может я как-то непонятно выражаю свои мысли, но смысл работы и состоит в том, чтобы получить значение N6 (эквивалентный уровень шума) и вернуть его к в таблицу, а для этого нужно подставлять время и шум в столбцы А, С, и повторять эту операцию для всех строк. За кадром осталась огромная сводная таблица, откуда взяты значения шума и времени и куда потом будет скопирован столбец эквивалентных шумов.
Alex_ST, может я как-то непонятно выражаю свои мысли, но смысл работы и состоит в том, чтобы получить значение N6 (эквивалентный уровень шума) и вернуть его к в таблицу, а для этого нужно подставлять время и шум в столбцы А, С, и повторять эту операцию для всех строк. За кадром осталась огромная сводная таблица, откуда взяты значения шума и времени и куда потом будет скопирован столбец эквивалентных шумов.arhi
N6, судя по Вашим формулам, вычисляется по массиву значений в столбце J, которые сами будут меняться по мере заполнения ячеек в столбцах А, В, С
Так может быть имеет смысл сразу вычислять значения в ячейках столбца U по значениям в ячейках столбцов О … Т, а не пихать их сначала в А … С, считать формулами и возвращать обратно?
N6, судя по Вашим формулам, вычисляется по массиву значений в столбце J, которые сами будут меняться по мере заполнения ячеек в столбцах А, В, С
Так может быть имеет смысл сразу вычислять значения в ячейках столбца U по значениям в ячейках столбцов О … Т, а не пихать их сначала в А … С, считать формулами и возвращать обратно?Alex_ST
Sub noise3() Dim i& For i = 23 To 26 [a2:a4] = Application.Transpose(Range(Cells(i, "R"), Cells(i, "T"))) [c2:c4] = Application.Transpose(Range(Cells(i, "O"), Cells(i, "Q"))) Cells(i, "U").Value = [k4].Value Next End Sub
[/vba]
Так? Для файла noise1.xls [vba]
Код
Sub noise3() Dim i& For i = 23 To 26 [a2:a4] = Application.Transpose(Range(Cells(i, "R"), Cells(i, "T"))) [c2:c4] = Application.Transpose(Range(Cells(i, "O"), Cells(i, "Q"))) Cells(i, "U").Value = [k4].Value Next End Sub
Нет, Игорь. Я так понимаю, что и писать из каждой строчки нужно не в одни и те же [a2:a4], [c2:c4], а в каждом новом цикле сдвигаясь вниз на 3 ячейки
Нет, Игорь. Я так понимаю, что и писать из каждой строчки нужно не в одни и те же [a2:a4], [c2:c4], а в каждом новом цикле сдвигаясь вниз на 3 ячейкиAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 07.05.2014, 11:44
Данные в ячейках столбцов C и D введены через Alt+Enter, поэтому их нельзя сразу использовать для рассчетов, я с помощью некоторых преобразований представила их в виде горизонтальных строк 23, 24, ... чтобы значения шум и время были рядом (файл noise). Источников не всегда 3 - их может быть от 1 до 12, поэтому Повторяюсь, таблица содержит 687 строк, задача - минимизировать ручную работу.
Цитата
Так может быть имеет смысл сразу вычислять значения в ячейках столбца U по значениям в ячейках столбцов О … Т, а не пихать их сначала в А … С, считать формулами и возвращать обратно?
Источников не всегда 3 - их может быть от 1 до 12, поэтому если данные представить в вертикальном варианте, то не будут видны границы между рабочими местами.
Данные в ячейках столбцов C и D введены через Alt+Enter, поэтому их нельзя сразу использовать для рассчетов, я с помощью некоторых преобразований представила их в виде горизонтальных строк 23, 24, ... чтобы значения шум и время были рядом (файл noise). Источников не всегда 3 - их может быть от 1 до 12, поэтому Повторяюсь, таблица содержит 687 строк, задача - минимизировать ручную работу.
Цитата
Так может быть имеет смысл сразу вычислять значения в ячейках столбца U по значениям в ячейках столбцов О … Т, а не пихать их сначала в А … С, считать формулами и возвращать обратно?
Источников не всегда 3 - их может быть от 1 до 12, поэтому если данные представить в вертикальном варианте, то не будут видны границы между рабочими местами.arhi
нет, смещаться не надо, это просто форма для рассчетов, данные всегда вставляются начиная с A2, C2
А Вас не смущает, что со строки 5 до строки 21 в Вашей таблице везде при таком заполнении получились одинаковые данные, никак не зависящие от введённых в строки 2... 4 значений? А формула, рассчитывающая эквивалентный уровень шума, всегда считает и эти не заполненные ячейки. Соответственно и данные не правильные выдаёт, наверное. Что-то тут явно не то.
только сейчас посмотрел... Так если Вам нужно просто по каждому рабочему месту вычислить эквивалентный уровень шума, может быть имеет смысл сразу в этой таблице данные и обрабатывать? Привели бы Вы расчётные формулы. Если у Вас везде разделитель информации от датчиков внутри ячейки Alt+Enter, то макросом их "расцепить" пара пустяков.
нет, смещаться не надо, это просто форма для рассчетов, данные всегда вставляются начиная с A2, C2
А Вас не смущает, что со строки 5 до строки 21 в Вашей таблице везде при таком заполнении получились одинаковые данные, никак не зависящие от введённых в строки 2... 4 значений? А формула, рассчитывающая эквивалентный уровень шума, всегда считает и эти не заполненные ячейки. Соответственно и данные не правильные выдаёт, наверное. Что-то тут явно не то.
только сейчас посмотрел... Так если Вам нужно просто по каждому рабочему месту вычислить эквивалентный уровень шума, может быть имеет смысл сразу в этой таблице данные и обрабатывать? Привели бы Вы расчётные формулы. Если у Вас везде разделитель информации от датчиков внутри ячейки Alt+Enter, то макросом их "расцепить" пара пустяков.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 07.05.2014, 12:13