Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Некорректная работа With - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Некорректная работа With (Макросы/Sub)
Некорректная работа With
ZetMenChavo Дата: Понедельник, 22.08.2022, 22:18 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Столкнулся со странным поведение 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
Дата добавления - 22.08.2022 в 22:18
Pelena Дата: Вторник, 23.08.2022, 08:03 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 18555
Репутация: 4202 ±
Замечаний: ±

Excel 2016 & Mac Excel
Здравствуйте.
Какую именно ошибку выдаёт?
У меня на пустом листе все три варианта отработали без ошибок.
Приложите файл с ошибкой


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
Какую именно ошибку выдаёт?
У меня на пустом листе все три варианта отработали без ошибок.
Приложите файл с ошибкой

Автор - Pelena
Дата добавления - 23.08.2022 в 08:03
ZetMenChavo Дата: Вторник, 23.08.2022, 14:37 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Pelena, оставил скриншот ошибки на листе. Между вариантами можно переключаться в самом макросе.
К сообщению приложен файл: 2899501.xlsm(347.4 Kb)


Сообщение отредактировал ZetMenChavo - Вторник, 23.08.2022, 14:40
 
Ответить
СообщениеPelena, оставил скриншот ошибки на листе. Между вариантами можно переключаться в самом макросе.

Автор - ZetMenChavo
Дата добавления - 23.08.2022 в 14:37
Pelena Дата: Вторник, 23.08.2022, 18:30 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 18555
Репутация: 4202 ±
Замечаний: ±

Excel 2016 & Mac Excel
Эта ошибка говорит о том, что мешают объединенные ячейки


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЭта ошибка говорит о том, что мешают объединенные ячейки

Автор - Pelena
Дата добавления - 23.08.2022 в 18:30
ZetMenChavo Дата: Вторник, 23.08.2022, 18:56 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Pelena, дело явно не в этом. Я снял все объединения в столбцах и единственное что поменялось это перестала вылезать ошибка.
А сам макрос работает следующим образом:
сначала как и нужно вставляется разрыв в нужном месте для нового столбца,
затем должно идти растягивание формы с правой стороны на вставленный разрыв, но первый и второй варианты в книге этого не делают.
В итоге разрыв остается неотформатированнным.

В прикрепленном файле результат работы первого варианта макроса
К сообщению приложен файл: 3040013.xlsm(346.1 Kb)
 
Ответить
СообщениеPelena, дело явно не в этом. Я снял все объединения в столбцах и единственное что поменялось это перестала вылезать ошибка.
А сам макрос работает следующим образом:
сначала как и нужно вставляется разрыв в нужном месте для нового столбца,
затем должно идти растягивание формы с правой стороны на вставленный разрыв, но первый и второй варианты в книге этого не делают.
В итоге разрыв остается неотформатированнным.

В прикрепленном файле результат работы первого варианта макроса

Автор - ZetMenChavo
Дата добавления - 23.08.2022 в 18:56
ZetMenChavo Дата: Пятница, 26.08.2022, 18:15 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Так и не нашлось того, кто объяснил бы, что не так рабоатет? :(
 
Ответить
СообщениеТак и не нашлось того, кто объяснил бы, что не так рабоатет? :(

Автор - ZetMenChavo
Дата добавления - 26.08.2022 в 18:15
nilem Дата: Суббота, 27.08.2022, 23:12 | Сообщение № 7
Группа: Авторы
Ранг: Старожил
Сообщений: 1610
Репутация: 559 ±
Замечаний: 0% ±

Excel 2013, 2016
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]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение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]

Автор - nilem
Дата добавления - 27.08.2022 в 23:12
ZetMenChavo Дата: Воскресенье, 28.08.2022, 02:23 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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
                
                .Resize(1, 7).EntireColumn.Insert
                
                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й шиворот на выворот. Смайлика фейспалма в адрес майкросовцев не хватает :D
[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]


Сообщение отредактировал ZetMenChavo - Воскресенье, 28.08.2022, 02:27
 
Ответить
Сообщение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
                
                .Resize(1, 7).EntireColumn.Insert
                
                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й шиворот на выворот. Смайлика фейспалма в адрес майкросовцев не хватает :D
[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]

Автор - ZetMenChavo
Дата добавления - 28.08.2022 в 02:23
nilem Дата: Воскресенье, 28.08.2022, 06:05 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1610
Репутация: 559 ±
Замечаний: 0% ±

Excel 2013, 2016
Это работает примерно как с формулами. Если вставить/удалить строки или столбцы на листе, то ссылки в формулах изменятся. Всегда удивляюсь, как Excel это делает )


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеЭто работает примерно как с формулами. Если вставить/удалить строки или столбцы на листе, то ссылки в формулах изменятся. Всегда удивляюсь, как Excel это делает )

Автор - nilem
Дата добавления - 28.08.2022 в 06:05
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Некорректная работа With (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2022 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!