Страницы: 1
RSS
VBA: как вызвать ячейку с номером ряда Nothing
 
Друзья, не могу никак разрешить проблему с предыдущих тем (писал по поводу вырезания и вставления строк на одном листе).
С макросом (назвал его Archive) разобрался, написал. Но, извините за выражение, работает один раз, потом ошибки на Insert либо на объявление ячейки "zx" для CurrentRegion перед циклом Do...Loop- делается Empty. На лист "ПЛК", где работает данный макрос Archive, выведен еще один работающий при изменениях листа макрос. Есть предположение, что они конфликтуют.
Очень прошу помощи, сроки горят, файл прикладываю.
 
Запускал макрос Archive раз 10 подряд - ошибки не воспроизвелись
Согласие есть продукт при полном непротивлении сторон
 
Бывает, CurrentRegion глючит.
 
Подскажите, а что Вы хотите получить вот этой конструкцией?
p3 = CR2.Row + CR2.CurrentRegion.Rows.Count - 1
особенно в части, выделенной красным. Ведь CR2 у Вас и так уже CurrentRegion относительно ячейки Cells(zx1, 2)
Согласие есть продукт при полном непротивлении сторон
 
Цитата
vadik-ceo написал:
На лист "ПЛК", где работает данный макрос Archive, выведен еще один работающий при изменениях листа макрос. Есть предположение, что они конфликтуют.
Нет, там обработка событий отключается (application.EnableEvents = False).
 
vadik-ceo, попробовал. Макрос запускается без вылетов. Какие конкретно Ваши действия вызывают ошибку? Может быть, Вы свой макрос второй раз с другого листа запускаете (он привязан к поиску конкретных данных в активном листе).

Цитата
На лист "ПЛК", где работает данный макрос Archive, выведен еще один работающий при изменениях листа макрос. Есть предположение, что они конфликтуют.
Не исключено. Т.к. насколько я понимаю Worksheet_Change() не отслеживает действия макросов. А да, события тоже выключены, так что "макрос, работающий при изменениях листа" просто не запускается, и, значит, не конфликтует...

Вообще, код хронически нуждается в рефакторинге и приведении к читаемому виду. Такие "деревья" из вложенных If Then - это нечто... Но рефакторить в цейтноте, конечно, уже поздно.
Изменено: Irregular Expression - 02.04.2018 10:25:52
 
Коллеги, прилагаю скрин, проблема не решена.
Есть предположение, что если ставить янв и факт в начале диапазона и в конце, то файл падает напрочь.
 
Sanja, я с помощью данного кода ищу последнюю строку в CurrentRegion, чтобы цикл проверял каждый раз каждую строку в диапазоне.
 
vadik-ceo,
Цитата
Коллеги, прилагаю скрин, проблема не решена.
Лучше напишите что конкретно Вы сделали для получения такой реакции программы, т.к. у других Ваш макрос запускается без ошибок (уж не знаю, правильно при этом работает или нет, но не вылетает точно). Или хотя бы на какую строку кода ругается интерпретатор.
 
Irregular Expression, я бы рад поправить код, да знаний не хватает. Пока что могу только тривиальнейшим образом все делать.
 
Irregular Expression,
я поставил янв и факт в столбцы 19 и 21 соответственно в первую строку диапазона Текущие заявки (строка 75) и в конец (строка 91) плюсом накидал таких же примеров в центр диапазона на рандом. Выдает такую ошибку
 
vadik-ceo, Вы вопрос поняли? Чтобы Вам помогли поправить Ваш код, надо понять, что конкретно Вас в этом коде не устраивает. Вот у Вас появилось сообщение об ошибке:
1) Что Вы делали со своим файлом перед этим? С какого активного листа запускали макрос?
2) Вы пробовали при сообщении об ошибке нажать Debug? Какую строку кода интерпретатор при этом подсвечивает жёлтым?

Вообще, пока результат у меня таков: на листе ПЛК всё выполняется без ошибок. На других листах, вот это:
Код
Set zx = Range("B:B").Find("Текущие заявки")
If Not zx Is Nothing Then r = zx.Offset(1, 0).Row
Set CR0 = Cells(r, 2).CurrentRegion
Вызывает вылет по Application-defined or Object defined error.
Разбираем по-строчно:
1) ячейка с текущими заявками не найдена на листе, zx = Nothing
2) не выполняется, т.к. Nothing,
3) пытаемся вызвать на активном листе с рядом Nothing и столбцом 2 - ошибка, т.к. Nothing - не номер ряда.
 
Irregular Expression,
1) Запустил макрос  Archive после открытия файла - отработал на ура. Вставил снова в строку, следующую за строкой "Текущие заявки" янв и факт в столбцы 19 и 21.
2) Лист один и тот же - ПЛК
3) Debug делал, выделяет строку Rows(j3+1).Insert
 
vadik-ceo,
Цитата
1) Запустил макрос  Archive после открытия файла - отработал на ура. Вставил снова в строку, следующую за строкой "Текущие заявки" янв и факт в столбцы 19 и 21.
2) Лист один и тот же - ПЛК
Сделал, всё работает без ошибок. Что вставляли?

Цитата
3) Debug делал, выделяет строку Rows(j3+1).Insert
Перед выделяемой строкой вбейте строку:
Код
MsgBox "j3 = " & j3
Увидите, какое значение находится в переменной j3 перед ошибкой. С вероятностью 90% это ответит на Ваш вопрос. Либо там слишком большое число, либо слишком маленькое, либо никакого, либо не целое.
Изменено: Irregular Expression - 02.04.2018 11:05:39
 
Irregular Expression,
Вставил вместо имеющегося "фев" значение "янв" и вместо "план" "факт", чтобы проверить, как его вставит
Касательно меседжа, сейчас попробую.
 
Irregular Expression,
Вставил меседж, отработал, показал строки. Поменял месяц на "янв" и на "факт", как писал выше, выдает следующую ошибку (на картинке).
Выделяет строку
Код
Set zx = Range("B:B").Find("Текущие заявки")
 
vadik-ceo,
Цитата
Вставил меседж, отработал, показал строки. Поменял месяц на "янв" и на "факт", как писал выше, выдает следующую ошибку (на картинке).
Выделяет строку
См. ответ #12. Я уже писал Вам об этой ошибке и её причинах. Nothing - неудачный номер ряда ;).
Изменено: Irregular Expression - 02.04.2018 11:32:49
 
Irregular Expression,
Не пойму все же, почему в первый раз он находит "Текущие заявки", во второй раз нет... Он ведь на листе и остается.
С какой стороны тогда лучше зайти? Как исправить мне или переписать? Подскажите пожалуйста..
 
Цитата
vadik-ceo написал:
Подскажите
исправлейте пока не начнет работать как нужно.
как только начало работать как нужно - больше ничего не исправляйте
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
Цитата vadik-ceo  написал:Подскажитеисправлейте пока не начнет работать как нужно.как только начало работать как нужно - больше ничего не исправляйте
Так а что исправить?)))
 
vadik-ceo,
Цитата
Не пойму все же, почему в первый раз он находит "Текущие заявки", во второй раз нет... Он ведь на листе и остается.
С какой стороны тогда лучше зайти? Как исправить мне или переписать? Подскажите пожалуйста..
Почитать про работу метода Find и подумать. Find - это обычная форма поиска в Excel. Поищите через поиск "Текущие заявки" до и после выполнения макроса.
В первый раз у Вас поиск строки "Текущие заявки", допустим, происходит на листе, а второй раз - где (не в Selection ли, часом?) и с какой позиции?
Изменено: Irregular Expression - 02.04.2018 11:56:55
 
А такое вообще возможно (это просто немного за гранью моего понимания). Моя логика прямолинейна - запускаем макрос один раз, нашел, ок. Второй раз, это новая процедура (типа абсолютно такая же как первая). Причем ведь тут проблема какая - если вставить два "янв" и "факт" в начало диапазона двумя первыми строками, то он ругается. А если в середине где-нибудь, то работает без ошибок постоянно.
 
Ваша прямолинейная логика должна учитывать возможные разные начальные условия, в которых предстоит работать макросу.
метод Find при опущенных некоторых параметрах в текущем сеансе использует параметры прошлого сеанса - и это может существенно влиять на результат поиска.
все проблемы в КРИВОМ КОДЕ, нормально написанный код должен учитывать ВСЕ возможные сюрпризы в данных и адекватно на них реагировать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
а вообще на вопрос:
Цитата
как вызвать ячейку с номером ряда Nothing
ответ:
нет в Excel способа обратиться к ячейке находящейся в ряду Nothing. нет ряда - нет ячеек в нем.
и тему на этом можно закрыть.
готовьте след., волнующий Вас вопрос.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
vadik-ceo,
Цитата
А такое вообще возможно (это просто немного за гранью моего понимания). Моя логика прямолинейна - запускаем макрос один раз, нашел, ок. Второй раз, это новая процедура (типа абсолютно такая же как первая).
На будущее: возьмите любую книжку по рефакторингу/"чистому" коду - откроете для себя много нового.
А пока, в качестве заплаты: разберитесь, почему Find у Вас не находит ничего и возвращает Nothing после Ваших манипуляций. Скорее всего, из-за выделения.

А вот Вам "невмещаемое знание" из оф.документации по Range.Find:
Цитата
Параметры для LookIn, LookAt, SearchOrder_и _MatchByte сохраняются каждый раз при использовании этого метода. Если не указать значения для этих аргументов и вызвать метод повторно, сохраненные значения будут использоваться. Задание этих аргументов изменяет параметры в диалоговом окне Найти и изменение параметров в диалоговом окне Найти меняет сохраненные значения, которые будут использоваться методом, если аргументы не указаны. Чтобы избежать проблем, задайте эти аргументы явно при каждом использовании этого метода.
Возможно, в этом дело ;)? https://msdn.microsoft.com/ru-ru/vba/excel-vba/articles/range-find-method-excel
 
Цитата
Ігор Гончаренко написал:
ответ:нет в Excel способа обратиться к ячейке находящейся в ряду Nothing. нет ряда - нет ячеек в нем.и тему на этом можно закрыть. готовьте след., волнующий Вас вопрос.
Я ведь и не говорю, что код идеален, понимаю, что есть много недоработок и прочего. Затем и обратился сюда за помощью. Понимаю, что код должен учитывать все. Но еще раз повторюсь, я не владею advanced навыками в VBA и только учусь, поэтому нуждаюсь в помощи.
 
Irregular Expression,
Обязательно сейчас прочитаю и постараюсь понять. Спасибо Вам огромное!
 
макрос, который не решает задачу, для решения которой он был написан - это по умолчанию КРИВОЙ МАКРОС.
я в #24 дал прямой ответ на Ваш вопрос в теме, повторюсь,
в ряду Nothing нет ячеек (собственно, даже нет самого ряда), не возможно в несуществующем ряду обратиться к несуществующим в нем ячейкам.
сформулируйте и задайте другой вопрос.
и помните, при формулировании вопроса: описываете исходные данные (лучше приложить файл), описываете задачу, которую нужно решить и только потом, можете рассказать как Вы пытались ее решить и что не получилось.

такой способ позволяет в сообщении #2 получить ответ на Ваш вопрос. а путь, которым пошли Вы - это под 30 сообщений в теме и 0 результатовь и перспективы очень смутные...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
vadik-ceo, само название темы некорректное.  Хорошо ответил Игорь в #24: невозможно "вызывать" ячейку из ряда, который не существует.
Попробуйте переформулировать задачу и название.
Страницы: 1
Наверх