Ошибка метода «Диапазон объекта»_worksheet» на VBA

У меня возникли проблемы с указанным выше сообщением об ошибке (сбой диапазона методов листа объекта). По сути, я пытаюсь выполнить большой набор задач каждый раз, когда изменяется какой-либо из нескольких входных данных на листе. Это модель возврата к прибыли поставщика на основе целевой рекомендованной розничной цены и различных затрат и наценок в каждом штате.

Я включил скриншоты ошибки. После детального тестирования я решил, что это не из-за проблемы с именованным диапазоном. Это похоже на то, как если бы макрос не мог обработать больше определенного количества входных ячеек. Вот что я имею в виду. Сначала вы видите рабочую версию (с целью поиска 4 состояний из AL, ID, IA, ME). Второй скриншот — пример нерабочей версии, в которой добавлено еще одно состояние (MI). ОДНАКО, если я, скажем, заменю МЕНЯ на МИ, оставив 4 состояния, макрос снова заработает. Вот откуда я знаю, что это не проблема с именованным диапазоном, и подозреваю, что это что-то другое. Всего у меня есть 17 состояний для расчета, поэтому мне нужно добавить еще много входных ячеек и соответствующих строк ниже для поиска цели.

Что может быть причиной этой ошибки?

Я относительно новичок в VBA, поэтому я не только помог мне устранить ошибку, но и открыл способы очистить код и сделать его более аккуратным.

Заранее спасибо!

[пример рабочего кода]

Private Sub Worksheet_Change(ByVal Target As Range)

Dim inputCells As Range
Set inputCells = Range("ControlTgtSRP, " & _
"AL_ADA, AL_Broker, AL_Freight, AL_NetProfit, AL_SRP, " & _
"ID_ADA , ID_Broker, ID_Freight, ID_NetProfit, ID_SRP, " & _
"IA_ADA , IA_Broker, IA_Freight, IA_NetProfit, IA_SRP, " & _
"ME_ADA , ME_Broker, ME_Freight, ME_NetProfit, ME_SRP")

If Not Application.Intersect(Range(Target.Address), inputCells) Is Nothing Then

    Range("AL_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("AL_NetProfit")
    Range("ID_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("ID_NetProfit")
    Range("IA_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("IA_NetProfit")
    Range("ME_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("ME_NetProfit")


End If
End Sub

[пример нерабочего кода - единственная разница заключается в добавлении логики к поиску цели для дополнительного состояния]

Private Sub Worksheet_Change(ByVal Target As Range)

Dim inputCells As Range
Set inputCells = Range("ControlTgtSRP, " & _
"AL_ADA, AL_Broker, AL_Freight, AL_NetProfit, AL_SRP, " & _
"ID_ADA , ID_Broker, ID_Freight, ID_NetProfit, ID_SRP, " & _
"IA_ADA , IA_Broker, IA_Freight, IA_NetProfit, IA_SRP, " & _
"ME_ADA , ME_Broker, ME_Freight, ME_NetProfit, ME_SRP, " & _
"MI_ADA , MI_Broker, MI_Freight, MI_NetProfit, MI_SRP")

If Not Application.Intersect(Range(Target.Address), inputCells) Is Nothing Then

    Range("AL_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("AL_NetProfit")
    Range("ID_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("ID_NetProfit")
    Range("IA_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("IA_NetProfit")
    Range("ME_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("ME_NetProfit")
    Range("MI_SRP").GoalSeek Goal:=Range("ControlTgtSRP"), ChangingCell:=Range("MI_NetProfit")


End If
End Sub

См. выше. Протестировано на наличие проблем с именованным диапазоном (например, опечаток). Это не проблема. Похоже, это как-то связано с просьбой к макросу выполнить расчет по слишком большому количеству входных ячеек?

Я просмотрел ряд других подобных вопросов, уже заданных на сайте, но, похоже, не смог найти ни одного с той же проблемой, вызывающей ошибку.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При написании Range(rngString) длина rngString не может превышать 255 символов.

В вашем рабочем примере длина строки равна 228. В неудачном примере — 282.

Самое простое решение — объединить два или более диапазонов, каждый из которых имеет длину строки менее 255 символов:

Set inputCells = Union( _
    Range("ControlTgtSRP, " & _
          "AL_ADA, AL_Broker, AL_Freight, AL_NetProfit, AL_SRP, " & _
          "ID_ADA , ID_Broker, ID_Freight, ID_NetProfit, ID_SRP"), _
    Range("IA_ADA , IA_Broker, IA_Freight, IA_NetProfit, IA_SRP, " & _
          "ME_ADA , ME_Broker, ME_Freight, ME_NetProfit, ME_SRP, " & _
          "MI_ADA , MI_Broker, MI_Freight, MI_NetProfit, MI_SRP"))

Фантастика. Это сработало! Спасибо за помощь.

Tyler Kosnik 08.08.2024 18:26

Другие вопросы по теме