Код из постов с номерами строк можно скопировать на лист, затем из листа второй столбец скопировать в редактор В красных строках удалить в начале строки пробелы с мусором.
Код из постов с номерами строк можно скопировать на лист, затем из листа второй столбец скопировать в редактор В красных строках удалить в начале строки пробелы с мусором.Hugo
"B:B" = "Да" - это сравнение двух строковых значений. Понятно, что они не равны.
Чуть подробнее "Да" - это значение ячейки "В:В" - это адрес диапазона Попытка их сравнить и дает ошибку Сравнивать можно так [B1] = "Да" Range("B1") = "Да" Cells(1, 2) = "Да" Cells(1, "B") = "Да" А для сравнения всех ячеек в диапазоне использовать один из циклов
Quote (KuklP)
"B:B" = "Да" - это сравнение двух строковых значений. Понятно, что они не равны.
Чуть подробнее "Да" - это значение ячейки "В:В" - это адрес диапазона Попытка их сравнить и дает ошибку Сравнивать можно так [B1] = "Да" Range("B1") = "Да" Cells(1, 2) = "Да" Cells(1, "B") = "Да" А для сравнения всех ячеек в диапазоне использовать один из цикловRAN
"Да" - это значение ячейки "В:В" - это адрес диапазона
Да нет же Андрей. "В:В" это просто строка. [В:В], или range("В:В") - это диапазон. А в конструкции If "B:B" = "Да" Then васик просто сравнивает побуквенно строки. Понятно, что уже после сравнения В и Д результат будет Ложь.
Quote (RAN)
"Да" - это значение ячейки "В:В" - это адрес диапазона
Да нет же Андрей. "В:В" это просто строка. [В:В], или range("В:В") - это диапазон. А в конструкции If "B:B" = "Да" Then васик просто сравнивает побуквенно строки. Понятно, что уже после сравнения В и Д результат будет Ложь.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
А почему нельзя, как в формулах, сравнивать значение одной ячейки сразу со всем диапазоном?
Можно. Используя или формулы листа, или свой обработчик массива. При вычислении формул, все равно ведь на низком уровне происходит обработка массива в цикле. Просто мы этого не видим. Однако, это заметно по скорости вычисления массивных формул. Если их много и массивы большие.
Quote (Serge_007)
А почему нельзя, как в формулах, сравнивать значение одной ячейки сразу со всем диапазоном?
Можно. Используя или формулы листа, или свой обработчик массива. При вычислении формул, все равно ведь на низком уровне происходит обработка массива в цикле. Просто мы этого не видим. Однако, это заметно по скорости вычисления массивных формул. Если их много и массивы большие.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Отвозил дите на елку. Итак, господа, давайте по порядку: 1. я хотел указать макросу, что, если в любой из ячеек столбца В значение будет равно Да, то нужно переместить из А1 листа Данные в А1 листа Да. Если равно Нет, то нужно переместить из А1 листа Данные в А1 листа Нет. Я так понял, что if [В:В] = "Да" Then работать не будет. (что касается того, что запись "В:В" - это текст, я понял) 2. Примерно так я понял этот макрос: [vba]
Код
Sub Перенос2() Dim i& что это? With Sheets("Данные") For i = .UsedRange.Rows.Count To 1 Step -1 я так понимаю, что тут задаем какое-то действие переменной i. Только какое? If .Cells(i, 2).Value = "да" Then не совсем понял эту строку, но, по-моему, именно она дает команду к действию, если ячейка столбца В будет равна "Да" .Cells(i, 1).Copy _ тут копируем ячейку столбца А (кстати, почему не вырезаем?) Sheets("Да").[a65536].End(xlUp).Offset(1) опять непонятки. Ясно только, что все происходит на листе "Да" .Cells(i, 2).EntireRow.Delete удаляем значения из ячейки столбца В ElseIf .Cells(i, 2) = "нет" Then далее указываем что следует делать, если значение ячейки столбца В будет равно "Нет" .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete End If Next End With End Sub
Я читал это. После прочтения ставил эксперименты. Все было в порядке. Отлично копировалось без проблем. А тут на тебе. 4.
Цитата (nilem)
Предполагалось, что далее будем избавляться от селектов, потом повесим это дело на событие Worksheet_Change и попытаемся использовать массивы.
Я так понял СЕЛЕКТ - это выбор и избавляться будем от команд выбора ячеек? Только зачем? А Worksheet_Change - это команда смены рабочего листа? Правильно? И как ее использовать? 5. RAN,
Цитата (RAN)
Cells(1, 2) = "Да" Cells(1, "B") = "Да"
Что обозначают значения в скобках?
Отвозил дите на елку. Итак, господа, давайте по порядку: 1. я хотел указать макросу, что, если в любой из ячеек столбца В значение будет равно Да, то нужно переместить из А1 листа Данные в А1 листа Да. Если равно Нет, то нужно переместить из А1 листа Данные в А1 листа Нет. Я так понял, что if [В:В] = "Да" Then работать не будет. (что касается того, что запись "В:В" - это текст, я понял) 2. Примерно так я понял этот макрос: [vba]
Код
Sub Перенос2() Dim i& что это? With Sheets("Данные") For i = .UsedRange.Rows.Count To 1 Step -1 я так понимаю, что тут задаем какое-то действие переменной i. Только какое? If .Cells(i, 2).Value = "да" Then не совсем понял эту строку, но, по-моему, именно она дает команду к действию, если ячейка столбца В будет равна "Да" .Cells(i, 1).Copy _ тут копируем ячейку столбца А (кстати, почему не вырезаем?) Sheets("Да").[a65536].End(xlUp).Offset(1) опять непонятки. Ясно только, что все происходит на листе "Да" .Cells(i, 2).EntireRow.Delete удаляем значения из ячейки столбца В ElseIf .Cells(i, 2) = "нет" Then далее указываем что следует делать, если значение ячейки столбца В будет равно "Нет" .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete End If Next End With End Sub
Я читал это. После прочтения ставил эксперименты. Все было в порядке. Отлично копировалось без проблем. А тут на тебе. 4.
Цитата (nilem)
Предполагалось, что далее будем избавляться от селектов, потом повесим это дело на событие Worksheet_Change и попытаемся использовать массивы.
Я так понял СЕЛЕКТ - это выбор и избавляться будем от команд выбора ячеек? Только зачем? А Worksheet_Change - это команда смены рабочего листа? Правильно? И как ее использовать? 5. RAN,
KuklP, а что, адрес диапазона это не строка? Или как ныне принято говорить - "может я че не догоняю"? А ошибка от того, что человек "A:A" воспринимает не как адрес диапазона, а так-же, как в формуле - диапазоном
light26, а курсор поставить на Cells и нажать F1? Или даже просто сравнить эти 4 строки?
KuklP, а что, адрес диапазона это не строка? Или как ныне принято говорить - "может я че не догоняю"? А ошибка от того, что человек "A:A" воспринимает не как адрес диапазона, а так-же, как в формуле - диапазоном
light26, а курсор поставить на Cells и нажать F1? Или даже просто сравнить эти 4 строки?RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Среда, 04.01.2012, 17:50
Андрей, свойство address действительно имеет строковый тип, но пока мы не заключим строку в конструкцию [В:В], или range("В:В") Эксель никак не будет ассоциировать эту строку с диапазоном, или воспринимать ее как адрес. Это просто строка, такая же по значимости для Экса, как "мама мыла раму". Т.е. другими словами - любой адрес есть строка, но не любая строка есть адрес. Надеюсь понятно объяснил. Из меня объясняла...
Андрей, свойство address действительно имеет строковый тип, но пока мы не заключим строку в конструкцию [В:В], или range("В:В") Эксель никак не будет ассоциировать эту строку с диапазоном, или воспринимать ее как адрес. Это просто строка, такая же по значимости для Экса, как "мама мыла раму". Т.е. другими словами - любой адрес есть строка, но не любая строка есть адрес. Надеюсь понятно объяснил. Из меня объясняла...KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Я так понял СЕЛЕКТ - это выбор и избавляться будем от команд выбора ячеек? Только зачем? А Worksheet_Change - это команда смены рабочего листа? Правильно? И как ее использовать?
Excel работает с активными объектами Поэтому при записи рекордером получается [vba]
[/vba] Ничего не моргает, не переключается, а просто копируется с листа 1 на лист 2
А Worksheet_Change - событие, возникающее при внесении изменений на листе (в любой ячейке)
PS Сергей, мне понятно!. Я пытаюсь объяснить Вадиму.
В продолжение
Цитата (light26)
Я так понял СЕЛЕКТ - это выбор и избавляться будем от команд выбора ячеек? Только зачем? А Worksheet_Change - это команда смены рабочего листа? Правильно? И как ее использовать?
Excel работает с активными объектами Поэтому при записи рекордером получается [vba]
Sub Перенос2() Dim i& 'обявление переменной c типом long With Sheets("Данные") ' For i = .UsedRange.Rows.Count To 1 Step -1 ' это просто счетчик на убывание If .Cells(i, 2).Value = "да" Then 'проверка условия .Cells(i, 1).Copy _ Sheets("Да").[a65536].End(xlUp).Offset(1) 'если условие истинно - копируем .Cells(i, 2).EntireRow.Delete 'удаляем строку ElseIf .Cells(i, 2) = "нет" Then 'дальше тоже самое для другого условия .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) ' .Cells(i, 2).EntireRow.Delete ' End If Next End With End Sub
Вадим, преподавать Вам азы онлайн - дурная затея. Читайле литературу, пробуйте. А уж что непонятно - спрашивайте. И активней пользуйтесь клавишей F1.
Code
Sub Перенос2() Dim i& 'обявление переменной c типом long With Sheets("Данные") ' For i = .UsedRange.Rows.Count To 1 Step -1 ' это просто счетчик на убывание If .Cells(i, 2).Value = "да" Then 'проверка условия .Cells(i, 1).Copy _ Sheets("Да").[a65536].End(xlUp).Offset(1) 'если условие истинно - копируем .Cells(i, 2).EntireRow.Delete 'удаляем строку ElseIf .Cells(i, 2) = "нет" Then 'дальше тоже самое для другого условия .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) ' .Cells(i, 2).EntireRow.Delete ' End If Next End With End Sub
Вадим, преподавать Вам азы онлайн - дурная затея. Читайле литературу, пробуйте. А уж что непонятно - спрашивайте. И активней пользуйтесь клавишей F1.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Учитывая мою деревянность, мне надо не объяснять, а вдалбливать ))) Можно, для особо одаренных еще раз: Worksheet_Change - это.... Просто если переводить условно-дословно, то получится что-то вроде рабочий лист замена
Quote (RAN)
Я пытаюсь объяснить Вадиму.
Учитывая мою деревянность, мне надо не объяснять, а вдалбливать ))) Можно, для особо одаренных еще раз: Worksheet_Change - это.... Просто если переводить условно-дословно, то получится что-то вроде рабочий лист заменаlight26
Хотелось бы вернуться к моему if [В:В] = "Да" then. Эта запись не применима в данном макросе, не применима вообще или запись может иметь место , но не в этом макросе
Хотелось бы вернуться к моему if [В:В] = "Да" then. Эта запись не применима в данном макросе, не применима вообще или запись может иметь место , но не в этом макросеlight26
Хотелось бы вернуться к моему if [В:В] = "Да" then. Эта запись не применима в данном макросе, не применима вообще или запись может иметь место , но не в этом макросе
На данном этапе освоения VBA лучше всего считать, что однозначно НЕТ!
Quote (light26)
Хотелось бы вернуться к моему if [В:В] = "Да" then. Эта запись не применима в данном макросе, не применима вообще или запись может иметь место , но не в этом макросе
На данном этапе освоения VBA лучше всего считать, что однозначно НЕТ!RAN
Странно, а я, прочитав справку, пришел к иному выводу
Ничего странного здесь нет. Дело не в самом цикле If Then Else , а в задании условия для цикла. В случае вашего if [В:В] = "Да" then условие задано неправильно ( чем уже говорилось выше, пост №№ 39,42) Правильно будет как в посте KuklP №51. Еще о циклах можно посмотреть здесь Управляющие структуры ... Циклы
Quote
Странно, а я, прочитав справку, пришел к иному выводу
Ничего странного здесь нет. Дело не в самом цикле If Then Else , а в задании условия для цикла. В случае вашего if [В:В] = "Да" then условие задано неправильно ( чем уже говорилось выше, пост №№ 39,42) Правильно будет как в посте KuklP №51. Еще о циклах можно посмотреть здесь Управляющие структуры ... ЦиклыVictorM
Сообщение отредактировал VictorM - Четверг, 05.01.2012, 10:34