В первый раз пишу тему и надеюсь сделаю всё правильно. Поиск использовал, решение начал искать давно, однако ничего не нашёл.
Прелюдия - Записал макрос который переносит данные с одного листа на другой. Суть проблемы - необходимо перенести одну строчку по условию, в ней очень много столбиков (около 30). Я записал макрос, однако перенос надо сделать по условию и строчек очень много (>1000). Поєтому я попытался создать цикл -
[vba]
Код
Sub pastgo1() Dim i As Long i = 2 Do While Cells(i, 1) <> "" Sheets("Sheet1").Select Range.Cells(i, 6).Select Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste Sheets("Sheet1").Select Range.Cells(i, 4).Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range.Cells(i, 2).Select ActiveSheet.Paste Sheets("Sheet1").Select Range.Cells(i, 5).Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range.Cells(i, 3).Select ActiveSheet.Paste ActiveCell.FormulaR1C1 = "=R[-3]C[-2]*R[-3]C[-4]/100" i = i + 1 Loop End Sub
[/vba]
Выкладываю только часть кода, потому что он очень длинный получился и без условия, потому что решил разобраться с проблемой поэтапно. Вместо координтов в скобках стояла отдельная ячейка, я переправил макрос на то что есть сейчас и он не работает. Компилятор выдаёт ошибку Argument Not optional.
Так же - [vba]
Код
Sub comm() Dim i As Long Do While Cells(i, 2) <> "" If Cells(i, 9).Value = "paper0" And Cells(i, 8).Value = "spot1" Then Cells(i, 1) = 0.1 Else If Cells(i, 9).Value = "paper1" Then Cells(i, 1) = 0.2 Else If Cells(i, 9).Value = "paper2" Then Cells(i, 1) = 0.3 i = i + 1 End If Loop End Sub
[/vba]
Вариантов else очень много, поєтому скопировал только часть кода. Выдает ошибку Loop without Do (как я понимаю компилятор видит конец цикла но не видит его начало).
О VBA знал раньше но работать начал с ним только позавчера, данные отличны от оригинальных потому что они конфединциальны, надуюсь вы отнесётесь к этому с пониманием, буду рад любой помощи. Спасибо.
Добрый день!
В первый раз пишу тему и надеюсь сделаю всё правильно. Поиск использовал, решение начал искать давно, однако ничего не нашёл.
Прелюдия - Записал макрос который переносит данные с одного листа на другой. Суть проблемы - необходимо перенести одну строчку по условию, в ней очень много столбиков (около 30). Я записал макрос, однако перенос надо сделать по условию и строчек очень много (>1000). Поєтому я попытался создать цикл -
[vba]
Код
Sub pastgo1() Dim i As Long i = 2 Do While Cells(i, 1) <> "" Sheets("Sheet1").Select Range.Cells(i, 6).Select Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste Sheets("Sheet1").Select Range.Cells(i, 4).Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range.Cells(i, 2).Select ActiveSheet.Paste Sheets("Sheet1").Select Range.Cells(i, 5).Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range.Cells(i, 3).Select ActiveSheet.Paste ActiveCell.FormulaR1C1 = "=R[-3]C[-2]*R[-3]C[-4]/100" i = i + 1 Loop End Sub
[/vba]
Выкладываю только часть кода, потому что он очень длинный получился и без условия, потому что решил разобраться с проблемой поэтапно. Вместо координтов в скобках стояла отдельная ячейка, я переправил макрос на то что есть сейчас и он не работает. Компилятор выдаёт ошибку Argument Not optional.
Так же - [vba]
Код
Sub comm() Dim i As Long Do While Cells(i, 2) <> "" If Cells(i, 9).Value = "paper0" And Cells(i, 8).Value = "spot1" Then Cells(i, 1) = 0.1 Else If Cells(i, 9).Value = "paper1" Then Cells(i, 1) = 0.2 Else If Cells(i, 9).Value = "paper2" Then Cells(i, 1) = 0.3 i = i + 1 End If Loop End Sub
[/vba]
Вариантов else очень много, поєтому скопировал только часть кода. Выдает ошибку Loop without Do (как я понимаю компилятор видит конец цикла но не видит его начало).
О VBA знал раньше но работать начал с ним только позавчера, данные отличны от оригинальных потому что они конфединциальны, надуюсь вы отнесётесь к этому с пониманием, буду рад любой помощи. Спасибо.Treider01
Если речь о синтаксисе, то три оператора IF подразумевают три END IF Если операторов IF много, используйте альтернативные варианты, SELECT CASE, например. В любом случае нужен файл с примером
Если речь о синтаксисе, то три оператора IF подразумевают три END IF Если операторов IF много, используйте альтернативные варианты, SELECT CASE, например. В любом случае нужен файл с примеромPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Если речь о синтаксисе, то три оператора IF подразумевают три END IF Если операторов IF много, используйте альтернативные варианты, SELECT CASE, например. В любом случае нужен файл с примером
Спасибо насчёт трёх End if - компилятор на ругается, сейчас буду проверять как работает. Операторов IF около 30 и єто не предел + ещё в двух местах используется ещё больше операторов поэтому альтернативный вариант насчёт SELECT CASE - я попробую его использовать, но так как у меня ещё основная работа много времени отнимает, то я ищу лёгкие и быстрые пути решения.
Насчёт файла (файлов на самом деле, отличаются конфигурацией и набором формул), то он огромен, его уменьшение и упрощение займёт много времени, я читал правила формула и в них сказано, что если вопрос общий то можно и без файла примера. На мой взгляд (который может быть ошибочным) мой вопрос можно отнести к категории общих, поэтому файл я не прикладывал.
В любом случае спасибо за помощь, одну ошибку уже исправили.
EDIT Код опять не работает, после проверки появилось окно ошибки с цифрой 400. В итоге компилятор ругается на application-defined or object-defined error. Я попробую сделать файл пример.
Если речь о синтаксисе, то три оператора IF подразумевают три END IF Если операторов IF много, используйте альтернативные варианты, SELECT CASE, например. В любом случае нужен файл с примером
Спасибо насчёт трёх End if - компилятор на ругается, сейчас буду проверять как работает. Операторов IF около 30 и єто не предел + ещё в двух местах используется ещё больше операторов поэтому альтернативный вариант насчёт SELECT CASE - я попробую его использовать, но так как у меня ещё основная работа много времени отнимает, то я ищу лёгкие и быстрые пути решения.
Насчёт файла (файлов на самом деле, отличаются конфигурацией и набором формул), то он огромен, его уменьшение и упрощение займёт много времени, я читал правила формула и в них сказано, что если вопрос общий то можно и без файла примера. На мой взгляд (который может быть ошибочным) мой вопрос можно отнести к категории общих, поэтому файл я не прикладывал.
В любом случае спасибо за помощь, одну ошибку уже исправили.
EDIT Код опять не работает, после проверки появилось окно ошибки с цифрой 400. В итоге компилятор ругается на application-defined or object-defined error. Я попробую сделать файл пример.Treider01
Сообщение отредактировал Treider01 - Среда, 10.09.2014, 17:12
Наконец прилагаю файл, надеюсь не слишком сложно, старался упростить. И да у меня английский excel. Надеюсь єто не проблема. Для меня основное понять, как єто сделать правильно, потому как от работающей программы, в которой я не разбираюсь, толку будет не много.
Спасибо за внимание!
Добрый день!
Наконец прилагаю файл, надеюсь не слишком сложно, старался упростить. И да у меня английский excel. Надеюсь єто не проблема. Для меня основное понять, как єто сделать правильно, потому как от работающей программы, в которой я не разбираюсь, толку будет не много.
а макрос-то зачем? особенно с учётом того, что вы синтаксис знать не хотите можно всё прекрасно формулами сделать.
Хммм. а где это я такое написал?
Однако отвечаю на ваш вопрос - у экселя ограничения на размер формулы и кол-во логических условий, для обоих вычислений представленных в файле формулы уже занимают два столбца. И это не предел. Я, надеюсь, ответил на ваш вопрос? Кроме того они очень сложны для восприятия и корректировки.
а макрос-то зачем? особенно с учётом того, что вы синтаксис знать не хотите можно всё прекрасно формулами сделать.
Хммм. а где это я такое написал?
Однако отвечаю на ваш вопрос - у экселя ограничения на размер формулы и кол-во логических условий, для обоих вычислений представленных в файле формулы уже занимают два столбца. И это не предел. Я, надеюсь, ответил на ваш вопрос? Кроме того они очень сложны для восприятия и корректировки.Treider01
Сообщение отредактировал Treider01 - Четверг, 11.09.2014, 15:14
нет. в формулах на листах, ссылающихся на лист-источник, не может быть ничего сложного и длинного.
Да, вы правы, если бы мне надо было ссылаться на данные, то всё возможно, однако мне их надо перенести, простая логика подсказывает что всё не просто так, если мой предыдущий ответ вас не удволетворил, то извините, не буду больше отнимать ваше время, спасибо за уделённое внимание моему вопросу.
нет. в формулах на листах, ссылающихся на лист-источник, не может быть ничего сложного и длинного.
Да, вы правы, если бы мне надо было ссылаться на данные, то всё возможно, однако мне их надо перенести, простая логика подсказывает что всё не просто так, если мой предыдущий ответ вас не удволетворил, то извините, не буду больше отнимать ваше время, спасибо за уделённое внимание моему вопросу.Treider01
фукакглупо. Вы за советом пришли или губы надутые показывать? в Вашем файле упоминается, что сейчас данные переносятся формулами, но подряд, и Вы потом удаляете ненужные строки. эти формулы можно сразу написать так, чтобы ненужных строк не было. и они достаточно простые. в этом, собственно, и был вопрос. если же Вам нужен именно макрос - так и пишите.
т.к. конкретики в файле не оч.много, а заполненных данных для примера - так и вообще нет, то и ответ носит несколько общий характер. но комментарии я написал. надеюсь, сможете разобраться. [vba]
Код
Sub ex() Dim lr&, i&, j1&, j3&, j4& j1 = 2: j3 = 2: j3 = 2 ' инициализация счётчиков листов-приёмников With Sheets("Data1") lr = .Cells(.Rows.Count, 1).End(xlUp).Row ' последняя заполненная строка в первом столбце For i = 3 To lr ' цикл по строкам исходного листа If .Cells(i, "v") = "А" Then ' переносим на первый лист j1 = j1 + 1 .Cells(i, "a").Copy Sheets(1).Cells(j1, "a") ' из столбца A в столбец A первого листа .Cells(i, "b").Copy Sheets(1).Cells(j1, "d") ' из столбца B в столбец D первого листа ' и т.д. Else ' переносим на третий или четвёртый лист If .Cells(i, "h") = 1 Then ' к примеру, какое-то условие по столбцк H j3 = j3 + 1 .Cells(i, "a").Copy Sheets(3).Cells(j3, "a") ' из столбца A в столбец A третьего листа .Cells(i, "e").Copy Sheets(3).Cells(j3, "b") ' из столбца E в столбец B третьего листа ' и т.д. Else j4 = j4 + 1 .Cells(i, "a").Copy Sheets(4).Cells(j4, "a") ' из столбца A в столбец A третьего листа .Cells(i, "e").Copy Sheets(4).Cells(j4, "b") ' из столбца E в столбец B третьего листа ' и т.д. End If End If Next End With End Sub
[/vba]
фукакглупо. Вы за советом пришли или губы надутые показывать? в Вашем файле упоминается, что сейчас данные переносятся формулами, но подряд, и Вы потом удаляете ненужные строки. эти формулы можно сразу написать так, чтобы ненужных строк не было. и они достаточно простые. в этом, собственно, и был вопрос. если же Вам нужен именно макрос - так и пишите.
т.к. конкретики в файле не оч.много, а заполненных данных для примера - так и вообще нет, то и ответ носит несколько общий характер. но комментарии я написал. надеюсь, сможете разобраться. [vba]
Код
Sub ex() Dim lr&, i&, j1&, j3&, j4& j1 = 2: j3 = 2: j3 = 2 ' инициализация счётчиков листов-приёмников With Sheets("Data1") lr = .Cells(.Rows.Count, 1).End(xlUp).Row ' последняя заполненная строка в первом столбце For i = 3 To lr ' цикл по строкам исходного листа If .Cells(i, "v") = "А" Then ' переносим на первый лист j1 = j1 + 1 .Cells(i, "a").Copy Sheets(1).Cells(j1, "a") ' из столбца A в столбец A первого листа .Cells(i, "b").Copy Sheets(1).Cells(j1, "d") ' из столбца B в столбец D первого листа ' и т.д. Else ' переносим на третий или четвёртый лист If .Cells(i, "h") = 1 Then ' к примеру, какое-то условие по столбцк H j3 = j3 + 1 .Cells(i, "a").Copy Sheets(3).Cells(j3, "a") ' из столбца A в столбец A третьего листа .Cells(i, "e").Copy Sheets(3).Cells(j3, "b") ' из столбца E в столбец B третьего листа ' и т.д. Else j4 = j4 + 1 .Cells(i, "a").Copy Sheets(4).Cells(j4, "a") ' из столбца A в столбец A третьего листа .Cells(i, "e").Copy Sheets(4).Cells(j4, "b") ' из столбца E в столбец B третьего листа ' и т.д. End If End If Next End With End Sub
Вы не будете против если я задам несколько вопросов?
По поводу вашего комментария - я думал об этом, однако данные не копируются по порядку, иногда вообще хаотично, поэтому я остановился на этом варианте, с последующим удалением лишних строк по мере их образования, как на самом простом.
Спасибо вам за показанный пример.
Большое спасибо!
Вы не будете против если я задам несколько вопросов?
По поводу вашего комментария - я думал об этом, однако данные не копируются по порядку, иногда вообще хаотично, поэтому я остановился на этом варианте, с последующим удалением лишних строк по мере их образования, как на самом простом.
Вы не будете против если я задам несколько вопросов?
а попробуйте! чем чёрт не шутит...
[p.s.]пс. прошу пардону за некоторую кажущуюся мою несерьёзность. этот только кажется. характер такой. на самом деле я ещё более несерьёзный[/p.s.]ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
1)Когда вы обявляете переменные - что значит знак & после каждой переменной?
2)j1 = 2: j3 = 2: j3 = 2 ' инициализация счётчиков листов-приёмников - Как я понял макрос будет проверять условие в столбце, на предмет соотвествия, если оно найдено, то он выполнит копирование, но сначала увеличит перменную на 1? Тогда для первого цикла любая из них станет равна 3 и копирование произойдет в третью строчку ?
3)Ещё не могли бы вы обьяснить как построен цикл, потому как такого я нигде не видел.
4) Sheets(4).Cells(j4, "b") - цифра 4 указывает на порядковый номер листа?
Большое спасибо за внимание.
1)Когда вы обявляете переменные - что значит знак & после каждой переменной?
2)j1 = 2: j3 = 2: j3 = 2 ' инициализация счётчиков листов-приёмников - Как я понял макрос будет проверять условие в столбце, на предмет соотвествия, если оно найдено, то он выполнит копирование, но сначала увеличит перменную на 1? Тогда для первого цикла любая из них станет равна 3 и копирование произойдет в третью строчку ?
3)Ещё не могли бы вы обьяснить как построен цикл, потому как такого я нигде не видел.
4) Sheets(4).Cells(j4, "b") - цифра 4 указывает на порядковый номер листа?
1) краткий способ объявления некоторых типов. i& - то же самое, что i As Long 2) да 3) от третьей строки до последней заполненной. обычный цикл со счётчиком. (или я вопрос не понял). 4) да
1) краткий способ объявления некоторых типов. i& - то же самое, что i As Long 2) да 3) от третьей строки до последней заполненной. обычный цикл со счётчиком. (или я вопрос не понял). 4) даikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Т.е. если я переставлю счётчик переменных вниз, после копирования, он увеличит переменную после копирования? Просто странно начинать копирование с третьей строчки, а не со второй.
Большое спасибо вам за код, на данный момент переписываю его, компилятор не ругается и пока всё хорошо.
Для меня более менее обычный цикл - это тот, что я использовал изначально - Do while.
Т.е. если я переставлю счётчик переменных вниз, после копирования, он увеличит переменную после копирования? Просто странно начинать копирование с третьей строчки, а не со второй.
Большое спасибо вам за код, на данный момент переписываю его, компилятор не ругается и пока всё хорошо.
Для меня более менее обычный цикл - это тот, что я использовал изначально - Do while.Treider01
странно начинать копирование с третьей строчки, а не со второй
эт Вы мягко выразились ещё... но дело в том, что именно в таком виде у Вас данные на листе Data1 - первая строка заголовки, потом пустая строка, потом данные пошли.
странно начинать копирование с третьей строчки, а не со второй
эт Вы мягко выразились ещё... но дело в том, что именно в таком виде у Вас данные на листе Data1 - первая строка заголовки, потом пустая строка, потом данные пошли.
эт Вы мягко выразились ещё... но дело в том, что именно в таком виде у Вас данные на листе Data1 - первая строка заголовки, потом пустая строка, потом данные пошли.
Простите, запарился и забыл обозначить что это не данные, а формат данных. Я подумал, что это может быть важно.
Итак я переставил часть значений и всё было хорошо, но опять вылетела ошибка 400, которая в итоге опять же обозначила application-defined or object-defined error. Жизнь моя полна боли и печали.
EDIT:
Код написанный вами, без моих дополнений, вылетает с той же ошибкой, однако, и та и другая версия успевает перекопировать часть ячеек. Забавно.
эт Вы мягко выразились ещё... но дело в том, что именно в таком виде у Вас данные на листе Data1 - первая строка заголовки, потом пустая строка, потом данные пошли.
Простите, запарился и забыл обозначить что это не данные, а формат данных. Я подумал, что это может быть важно.
Итак я переставил часть значений и всё было хорошо, но опять вылетела ошибка 400, которая в итоге опять же обозначила application-defined or object-defined error. Жизнь моя полна боли и печали.
EDIT:
Код написанный вами, без моих дополнений, вылетает с той же ошибкой, однако, и та и другая версия успевает перекопировать часть ячеек. Забавно.Treider01
Сообщение отредактировал Treider01 - Четверг, 11.09.2014, 18:10