Всем привет. На одной из встреч экселистов разбирался записанный макрорекордером код. Так вот, макрорекордер записывает пошагово все действия. То-есть, если из ячейки А1 нужно удалить содержимое, то мы сначала выделим эту ячейку, затем нажмем Delete. В этом случае макрос запишет: [vba]
Code
Range("А1").Select Selection.ClearContents
[/vba] Но достаточно записать команду в виде [vba]
Code
Range("I4").ClearContents
[/vba] и получим тот же результат после выполнения макроса. И тут я наткнулся на такой код (приведу только его часть) [vba]
Case "да" r.Previous.Cut Sheets("Да").Activate Range("A1000").End(xlUp).Offset(1).Insert Shift:=xlDown Sheets("Данные").Activate r.ClearContents
[/vba] Или я чавой-то не понимаю?
Всем привет. На одной из встреч экселистов разбирался записанный макрорекордером код. Так вот, макрорекордер записывает пошагово все действия. То-есть, если из ячейки А1 нужно удалить содержимое, то мы сначала выделим эту ячейку, затем нажмем Delete. В этом случае макрос запишет: [vba]
Code
Range("А1").Select Selection.ClearContents
[/vba] Но достаточно записать команду в виде [vba]
Code
Range("I4").ClearContents
[/vba] и получим тот же результат после выполнения макроса. И тут я наткнулся на такой код (приведу только его часть) [vba]
Какой аргумент? Ты о чем? Вопрос по аналогии - наберу я полную обувь воды пройдя по луже? Да, если буду в ботинках и нет - если буду в сапогах. Ты же не говоришь, что такое "r", и с какого листа ты запускаешь макрос. Set r = Sheets("Да").Range("A1") - привяжется к листу "Да" Set r = Sheets("Данные").Range("A1") - привяжется к листу "Данные" Set r = Range("A1") - привяжется к активному листу
Какой аргумент? Ты о чем? Вопрос по аналогии - наберу я полную обувь воды пройдя по луже? Да, если буду в ботинках и нет - если буду в сапогах. Ты же не говоришь, что такое "r", и с какого листа ты запускаешь макрос. Set r = Sheets("Да").Range("A1") - привяжется к листу "Да" Set r = Sheets("Данные").Range("A1") - привяжется к листу "Данные" Set r = Range("A1") - привяжется к активному листуRAN
О том, что не понятно в чем не прав. Вот полный код [vba]
Code
Sub Перенос3() Dim r As Range For Each r In Range("B1:B23") r.Select Select Case r.Value Case "да" r.Previous.Select Selection.Cut Sheets("Да").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents Case "нет" r.Previous.Select Selection.Cut Sheets("Нет").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents End Select Next Range("A1:A23").SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlUp End Sub
[/vba] Разве тут не надо выбрать лист "Данные" перед "Select.CearContents"?
Quote (RAN)
Какой аргумент? Ты о чем?
О том, что не понятно в чем не прав. Вот полный код [vba]
Code
Sub Перенос3() Dim r As Range For Each r In Range("B1:B23") r.Select Select Case r.Value Case "да" r.Previous.Select Selection.Cut Sheets("Да").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents Case "нет" r.Previous.Select Selection.Cut Sheets("Нет").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents End Select Next Range("A1:A23").SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlUp End Sub
[/vba] Разве тут не надо выбрать лист "Данные" перед "Select.CearContents"?light26
Разве тут не надо выбрать лист "Данные" перед "Select.CearContents"?
Вставьте перед и после Sheets("Данные").Activate оператор:
Debug.Print r.Parent.Name
и всё станет понятнее.
Range, однажды определенный в любом месте (при помощи Set или в цикле For Each), хранит своё окружение ("родителя" и других "предков") в момент определения (Worksheet, Workbook и даже Application, если идет кросс-работа с несколькими экземплярами Excel) до конца жизни. Если не было явного указания листа, о чем сказал RAN, то папа Range - ActiveSheet в момент определения.
Quote (LightZ)
Забудьте про Селекты и Активейты
Ну, совсем-то не надо, наверное, забывать. А то как же тогда, например, ActiveWindow.FreezePanes = True делать?
Quote (light26)
Разве тут не надо выбрать лист "Данные" перед "Select.CearContents"?
Вставьте перед и после Sheets("Данные").Activate оператор:
Debug.Print r.Parent.Name
и всё станет понятнее.
Range, однажды определенный в любом месте (при помощи Set или в цикле For Each), хранит своё окружение ("родителя" и других "предков") в момент определения (Worksheet, Workbook и даже Application, если идет кросс-работа с несколькими экземплярами Excel) до конца жизни. Если не было явного указания листа, о чем сказал RAN, то папа Range - ActiveSheet в момент определения.
Quote (LightZ)
Забудьте про Селекты и Активейты
Ну, совсем-то не надо, наверное, забывать. А то как же тогда, например, ActiveWindow.FreezePanes = True делать?Gustav
Sub Перенос3() Dim r As Range For Each r In Sheets("Данные").Range("B1:B23") Select Case r.Value Case "да" r.Previous = r Sheets("Да").Cells(Sheets("Да").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents Case "нет" r.Previous = r Sheets("Нет").Cells(Sheets("Нет").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents End Select Next On Error Resume Next Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp End Sub
[/vba]
Держи свой макрос [vba]
Code
Sub Перенос3() Dim r As Range For Each r In Sheets("Данные").Range("B1:B23") Select Case r.Value Case "да" r.Previous = r Sheets("Да").Cells(Sheets("Да").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents Case "нет" r.Previous = r Sheets("Нет").Cells(Sheets("Нет").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents End Select Next On Error Resume Next Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp End Sub
r.Previous = r Sheets("Да").Cells(Sheets("Да").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents
А Cut-то где? И зачем ячейке слева присваивать значение текущей? В исходном макросе, вроде, нет этой операции...
P.S. И если под Range("A1000") действительно имелась в виду ячейка ниже всех имеющихся данных, т.е. Cells(Sheets("Да").Rows.Count, "A"), то можно попробовать обойтись одним Cut с Destination (без отдельного Insert):
r.Previous = r Sheets("Да").Cells(Sheets("Да").Rows.Count, "A").End(xlUp).Offset(1).Insert Shift:=xlDown r.ClearContents
А Cut-то где? И зачем ячейке слева присваивать значение текущей? В исходном макросе, вроде, нет этой операции...
P.S. И если под Range("A1000") действительно имелась в виду ячейка ниже всех имеющихся данных, т.е. Cells(Sheets("Да").Rows.Count, "A"), то можно попробовать обойтись одним Cut с Destination (без отдельного Insert):
Андрей, спасибо, но мне не макрос был нужен. Просто смутило большое количество Selectов, вот и решил уточнить правильно ли удалить из из тела макроса. А что касается Sheets("***").Activate, так когда я в одном из своих макросов удалил эту запись все последующие команды выполнились не на том листе на котором нужно. Вот я и засомневался, когда Александр убрал Sheets("Данные").Activate из макроса.
Quote (RAN)
Держи свой макрос
Андрей, спасибо, но мне не макрос был нужен. Просто смутило большое количество Selectов, вот и решил уточнить правильно ли удалить из из тела макроса. А что касается Sheets("***").Activate, так когда я в одном из своих макросов удалил эту запись все последующие команды выполнились не на том листе на котором нужно. Вот я и засомневался, когда Александр убрал Sheets("Данные").Activate из макроса.light26
Я так и понял, и не шибко старался. Однако обрати внимание - в моем коде select/selection нет, но работает правильно (пусть и делает не совсем то, что может и надо, а то, что я написал). А на то, что Игорь написал, не обращай внимания, слишком высокие материи.
Quote (light26)
Андрей, спасибо, но мне не макрос был нужен.
Я так и понял, и не шибко старался. Однако обрати внимание - в моем коде select/selection нет, но работает правильно (пусть и делает не совсем то, что может и надо, а то, что я написал). А на то, что Игорь написал, не обращай внимания, слишком высокие материи. RAN
Однако обрати внимание - в моем коде select/selection нет
Разумеется, обратил.:)
Quote (RAN)
А на то, что Игорь написал, не обращай внимания, слишком высокие материи
Ты прав, я половины не понял. Хотя это заставило меня рассмотреть макрос еще раз, вдумчиво и внимательно. С переводом каждого слова и подгонкой под смысл.
Quote (RAN)
Однако обрати внимание - в моем коде select/selection нет
Разумеется, обратил.:)
Quote (RAN)
А на то, что Игорь написал, не обращай внимания, слишком высокие материи
Ты прав, я половины не понял. Хотя это заставило меня рассмотреть макрос еще раз, вдумчиво и внимательно. С переводом каждого слова и подгонкой под смысл.light26
Это про мой пример? Там суть в том, что если кодом ставим УФ, то код пляшет от позиции активной ячейки, т.е. как попало в общем случае. Поэтому сперва кодом нужно эту активную ячейку задать. Может быть конечно можно как-то это иначе сделать, или отключить эту привязку к активной, не знаю... Мы это только вчера решали - сам такого не знал.
Это про мой пример? Там суть в том, что если кодом ставим УФ, то код пляшет от позиции активной ячейки, т.е. как попало в общем случае. Поэтому сперва кодом нужно эту активную ячейку задать. Может быть конечно можно как-то это иначе сделать, или отключить эту привязку к активной, не знаю... Мы это только вчера решали - сам такого не знал.Hugo