У меня возникли проблемы с указанным выше сообщением об ошибке (сбой диапазона методов листа объекта). По сути, я пытаюсь выполнить большой набор задач каждый раз, когда изменяется какой-либо из нескольких входных данных на листе. Это модель возврата к прибыли поставщика на основе целевой рекомендованной розничной цены и различных затрат и наценок в каждом штате.
Я включил скриншоты ошибки. После детального тестирования я решил, что это не из-за проблемы с именованным диапазоном. Это похоже на то, как если бы макрос не мог обработать больше определенного количества входных ячеек. Вот что я имею в виду. Сначала вы видите рабочую версию (с целью поиска 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
См. выше. Протестировано на наличие проблем с именованным диапазоном (например, опечаток). Это не проблема. Похоже, это как-то связано с просьбой к макросу выполнить расчет по слишком большому количеству входных ячеек?
Я просмотрел ряд других подобных вопросов, уже заданных на сайте, но, похоже, не смог найти ни одного с той же проблемой, вызывающей ошибку.
При написании 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"))
Фантастика. Это сработало! Спасибо за помощь.