Здравствуйте. Столкнулся со странным поведение With [vba]
Код
Sub wwwwwwww() Dim oX As Long oX = 0 Stop 'Вариант 1 Рабочий With Range("G20") With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert End With With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With Stop 'Вариант 2 Такой же как 1й но выдает ошибку With Range("G20") With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert ' End With ' With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With Stop 'Вариант 3 тот который планировал написать по красонте, но он выдает ошибку With Range("G20").Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End Sub
[/vba] Пытался написать 3 вариант для вставки столбцов таблицы в нужном месте, но он выдавал ошибку, хотя в ручную всё вставлялось. Чтоб разобраться где косяк, решил сначала записать макрос через верхнюю панель эксель, и уже потом, шаг за шагом переделывая записанный код под тот что мне нужен, выявить где ошибка.
В результате обнаружил что ошибка возникает когда строки с Insert и Destination находятся внутри одной With (как во 2 и 3 вариантах), а если разделить их (как в 1 варианте), то всё работает. Объясните, это я чего то не знаю о With или это косяк разработчиков?
Здравствуйте. Столкнулся со странным поведение With [vba]
Код
Sub wwwwwwww() Dim oX As Long oX = 0 Stop 'Вариант 1 Рабочий With Range("G20") With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert End With With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With Stop 'Вариант 2 Такой же как 1й но выдает ошибку With Range("G20") With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert ' End With ' With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With Stop 'Вариант 3 тот который планировал написать по красонте, но он выдает ошибку With Range("G20").Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End Sub
[/vba] Пытался написать 3 вариант для вставки столбцов таблицы в нужном месте, но он выдавал ошибку, хотя в ручную всё вставлялось. Чтоб разобраться где косяк, решил сначала записать макрос через верхнюю панель эксель, и уже потом, шаг за шагом переделывая записанный код под тот что мне нужен, выявить где ошибка.
В результате обнаружил что ошибка возникает когда строки с Insert и Destination находятся внутри одной With (как во 2 и 3 вариантах), а если разделить их (как в 1 варианте), то всё работает. Объясните, это я чего то не знаю о With или это косяк разработчиков?ZetMenChavo
Pelena, дело явно не в этом. Я снял все объединения в столбцах и единственное что поменялось это перестала вылезать ошибка. А сам макрос работает следующим образом: сначала как и нужно вставляется разрыв в нужном месте для нового столбца, затем должно идти растягивание формы с правой стороны на вставленный разрыв, но первый и второй варианты в книге этого не делают. В итоге разрыв остается неотформатированнным.
В прикрепленном файле результат работы первого варианта макроса
Pelena, дело явно не в этом. Я снял все объединения в столбцах и единственное что поменялось это перестала вылезать ошибка. А сам макрос работает следующим образом: сначала как и нужно вставляется разрыв в нужном месте для нового столбца, затем должно идти растягивание формы с правой стороны на вставленный разрыв, но первый и второй варианты в книге этого не делают. В итоге разрыв остается неотформатированнным.
В прикрепленном файле результат работы первого варианта макросаZetMenChavo
ZetMenChavo, привет Все правильно работает. Попробуйте добавить селектов и пройтись пошагово, чтобы увидеть, как изменяются диапазоны. Станет понятно. [vba]
Код
... ElseIf Вариант = 2 Then With [Закреп] With .Offset(0, 1 + 7 * oX) .Select '''''''' H19 .Resize(1, 7).EntireColumn.Insert .Select '''''''' O19 - уехал на 7 столбцов ' Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy Cells(5, .Offset(0, 7).Column).Resize(15, 7).Select Cells(5, .Column).Resize(15, 14).Select End With End With ...
[/vba]
ZetMenChavo, привет Все правильно работает. Попробуйте добавить селектов и пройтись пошагово, чтобы увидеть, как изменяются диапазоны. Станет понятно. [vba]
Код
... ElseIf Вариант = 2 Then With [Закреп] With .Offset(0, 1 + 7 * oX) .Select '''''''' H19 .Resize(1, 7).EntireColumn.Insert .Select '''''''' O19 - уехал на 7 столбцов ' Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy Cells(5, .Offset(0, 7).Column).Resize(15, 7).Select Cells(5, .Column).Resize(15, 14).Select End With End With ...
Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With ' . . .
[/vba]
и вот что выдало в immediate . До вставки $H:$N $O$5:$U$19 $H$5:$U$19 . После $O:$U $V$5:$AB$19 $O$5:$AB$19
Теперь ясно что форматируются попросту не те столбцы которые должны. Вопросы "какого тут происходит?" и "почему ВБА вычесляет именно так?" не исчезли, но теперь зная причину, больше не буду спотыкаться об это.
Ну серьёзно! Это же по сути один и то же код, только 3й работает так как интуитивно понятно а 1й шиворот на выворот. Смайлика фейспалма в адрес майкросовцев не хватает [vba]
Код
If Вариант = 1 Then With [Закреп].Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With ElseIf Вариант = 3 Then With [Закреп] With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert End With With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With End If
[/vba]
nilem, спасиб за наводку Сделал как вы предложили, но немного другим способом, [vba]
Код
' . . . If Вариант = 1 Then With [Закреп].Offset(0, 1 + 7 * oX) Debug.Print .Resize(1, 7).EntireColumn.Address Debug.Print Cells(5, .Offset(0, 7).Column).Resize(15, 7).Address Debug.Print Cells(5, .Column).Resize(15, 14).Address
Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With ' . . .
[/vba]
и вот что выдало в immediate . До вставки $H:$N $O$5:$U$19 $H$5:$U$19 . После $O:$U $V$5:$AB$19 $O$5:$AB$19
Теперь ясно что форматируются попросту не те столбцы которые должны. Вопросы "какого тут происходит?" и "почему ВБА вычесляет именно так?" не исчезли, но теперь зная причину, больше не буду спотыкаться об это.
Ну серьёзно! Это же по сути один и то же код, только 3й работает так как интуитивно понятно а 1й шиворот на выворот. Смайлика фейспалма в адрес майкросовцев не хватает [vba]
Код
If Вариант = 1 Then With [Закреп].Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With ElseIf Вариант = 3 Then With [Закреп] With .Offset(0, 1 + 7 * oX) .Resize(1, 7).EntireColumn.Insert End With With .Offset(0, 1 + 7 * oX) Cells(5, .Offset(0, 7).Column).Resize(15, 7).AutoFill Destination:= _ Cells(5, .Column).Resize(15, 14), Type:=xlFillCopy End With End With End If
Это работает примерно как с формулами. Если вставить/удалить строки или столбцы на листе, то ссылки в формулах изменятся. Всегда удивляюсь, как Excel это делает )
Это работает примерно как с формулами. Если вставить/удалить строки или столбцы на листе, то ссылки в формулах изменятся. Всегда удивляюсь, как Excel это делает )nilem