Страницы: 1
RSS
Ошибка 400 при обращении к Range
 
Всем добрый день.
Странные вещи стали твориться у меня там, где все должно быть гладко.
Есть два листа, пытаемся скопировать данные из одного в другой. Активным является Sh2.
Код
    Dim ws0 As Worksheet
    Dim ws2 As Worksheet
    
    Set ws0 = ThisWorkbook.Sheets("Sh1")
    Set ws2 = ThisWorkbook.Sheets("Sh2")
    
    ws0.Range(Cells(1, 1), Cells(3, 1)).Copy
    
    ws2.Cells(5, 1).Activate
    ws2.Paste

ws0.Range(Cells(1, 1), Cells(3, 1)).Copy вызывает ошибку 400.


Причем на месте Copy может быть что угодно. Системе категорически разонравился метод обращения к Range через Cells.
Аналогичное обращение на текущем листе не выдает никакой ошибки.

Признателен за любую помощь.
 
Цитата
Alex K написал:
Системе категорически разонравился метод обращения к Range через Cells.
Нет, это юзер виноват
Код
ws0.Range(Cells(1, 1), Cells(3, 1)).Copy
  ws2.Cells(5, 1).Activate
    ws2.Paste
' Так
 ws0.Range(Cells(1, 1), Cells(3, 1)).Copy
   ws2.Activate
  ws2.Cells(5, 1).Activate
    ws2.Paste
' Или так
 ws0.Range(Cells(1, 1), Cells(3, 1)).Copy ws2.Cells(5, 1)
Изменено: doober - 16.12.2020 21:58:14
 
невозможно обратиться к диапазону одного листа, задавая его двумя ячейками другого листа  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Большое спасибо, но нет, если б все было так просто, я бы не стал беспокоить общественность.
Я ж специально написал: ошибка возникает на самом первом операторе Copy, до попыток что-то сделать с данными в буфере.
Операции копирования с одного листа в другой часто ведут себя капризно, но в данном случае Activate тут точно ни при чем.
Приведенные вами примеры точно так же выдают ошибку 400.
Подозреваю, что слетела какая-то системная настройка.
 
Цитата
Alex K написал:
Подозреваю, что слетела какая-то системная настройка.
замените пользователя за компьютером
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал: невозможно обратиться к диапазону одного листа, задавая его двумя ячейками другого листа  
Можете меня обозвать любыми словами, я заранее соглашусь.
Тем не менее, буду признателен, если предложите свой вариант кода, который не будет генерировать ошибку 400.

Вот собственно проблемный файл.
Среда - Excel 2019.
 
а что за задачу вы решаете?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Всем спасибо. Причину проблемы нашел: код находился в листе Sh2.
Когда вынес его в отдельный модуль, ошибка 400 исчезла.
Кстати, сам никогда не цеплял код к отдельным листам, всегда использовал отдельные модули и PERSONAL.
Столкнулся с проблемой, когда копался в чужом коде. Задача состоит в том, чтобы минимизировать число селектов и активейтов, вот и начал экспериментировать.
 
если на момент выполнения строки
ws0.Range(Cells(1, 1), Cells(3, 1)).Copy
активен лист Sh2 эта строка упадет по ошибки в какой бы модуль вы не затолкали макрос с этой строкой
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
не возможно обратиться к диапазону одного листа, задавая его двумя ячейками другого листа
Alex K, Вам же уже написали, невозможно.....
Вы запускаете макрос с листа ws2. Ячейки (Cells(1, 1), Cells(3, 1)) на каком листе находятся? Если не указать конкретный лист, то макрос эти ячейки воспринимает как активного листа, т.е ws2. Но вы указываете что диапазон копирования на листе ws1. ws1.Range(, а теперь ячейки ограничивающие этот диапазон находятся на ws2. Что вам должен сказать Excel? Вот он и выдаёт вам 400.
Запишите так
Код
    With ws1
    .Range(.Cells(1, 1), .Cells(3, 1)).Copy
    End With

Или так

Код
ws1.Range(ws1.Cells(1, 1), ws1.Cells(3, 1)).Copy
Изменено: gling - 16.12.2020 22:44:21
 
Цитата
Ігор Гончаренко написал: если на момент выполнения строкиws0.Range(Cells(1, 1), Cells(3, 1)).Copy активен лист Sh2 эта строка упадет по ошибки
Да, но тут есть нюанс: если вызывать операцию из отдельного модуля, то генерируется другая ошибка - Method 'Range' of Object '_Worksheet' failed. Я на нее уже насмотрелся и знаю, что делать. А вот с 400 столкнулся впервые за 10+ лет.
 
Цитата
Alex K написал:
Я на нее уже насмотрелся и знаю, что делать
не уверен. Вот здесь я подробно расписывал данный нюанс: Как обратиться к диапазону из VBA
рекомендую ознакомиться - тогда поймете, почему без указания перед Cells родительского листа выпадает в ошибку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
gling написал:
Вы запускаете макрос с листа ws2. Ячейки (Cells(1, 1), Cells(3, 1)) на каком листе находятся?
Спасибо за комментарий.
Век живи - ...
Я всегда работал, исходя из того, что в конструкции Range(Cells()) ячейки, указанные в Cells, находятся на том же листе, что и Range.
Исходя из этого неправильного предположения, написал километры страниц кода, и они работали правильно.
Просто перед обращением к данной конструкции всегда приходилось делать Activate того листа, где находится нужный Range.
 
Код
With ws2
   .Range(.Cells(1, 1), .Cells(3, 1)) =5
End With

И не надо принудительно активировать
 
я бы перед Range точку не ставил, это лишний символ в данной конструкции
написано в бреду, пожалуйста, не обращайте внимания (может осложнение после коронавипуса?)
Изменено: Ігор Гончаренко - 17.12.2020 19:56:58
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
я бы перед Range точку не ставил, это лишний символ в данной конструкции
Игорь, если вызов конструкции будет из модуля листа(притом не того, в котором эти самые Cells) - то будет ошибка :) Если точку не ставить, то как минимум явно указывать другого родителя для этого Range:
Код
Application.Range(.Cells(1, 1), .Cells(3, 1)) =5
Изменено: Дмитрий(The_Prist) Щербаков - 17.12.2020 19:16:00
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
спасибо, Дима!
извините, забираю свои слова взад
что-то перемкнуло рассматривать Range как функцию, которая вернет Range того листа, которому принадлежат ячейки
а Range - это обьект, а не функция, и должен иметь общего хозяина с ячейками, которые определяют его границы
Изменено: Ігор Гончаренко - 17.12.2020 19:57:32
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх