вложенный, если еще не работает статус через целевую ячейку - PullRequest
0 голосов
/ 04 марта 2019

Привет, у меня есть частный подпункт (рабочий лист по изменению), который будет запускать один из 26 макросов на основе значения ячеек.Все, что они делают, это скрывают или отображают определенные строки на основе значения из ячейки, в которой есть формула.

Теперь, когда я вручную изменяю значение ячейки, событие изменения рабочего листа и все макросы работают так, как они есть.подразумевается, НО они не работают, когда значение ячейки изменяется с помощью формулы, точнее их биты делают.

Я установил рабочий лист и диапазон переменных в каждом макросе, а также целевую ячейкув событии изменения рабочего листа должным образом (dim r как диапазон и т. д.)

Код для события изменения рабочего листа приведен ниже - интересно, может ли кто-нибудь определить или помочь, почему это не работает при запускебез ручного изменения значения ячейки

Если я могу избежать этого, я не хочу программно изменять значение в ячейке (если «условие», то r.value = «Значение» 26 раз!)

вот код рабочего листа

Dim r As Range, r1 As Range, r2 As Range, r3 As Range, r4 As Range, r5 As Range, r6 As Range, r7 As Range, r8 As Range
Dim r9 As Range, r10 As Range, r11 As Range, r12 As Range, r13 As Range, r14 As Range, r15 As Range, r16 As Range


Private Sub Worksheet_Change(ByVal Target As Range)    

'Set range for selecting the region
Set r = Range("O19")

'Set facility ranges

Set r1 = Rows("22:24"): Set r2 = Rows("25:27"): Set r3 = Rows("28:30"): Set r4 = Rows("31:33")

'set product line ranges
Set r5 = Rows("37"): Set r6 = Rows("38"): Set r7 = Rows("39"): Set r8 = Rows("40"): Set r9 = Rows("41"): Set r10 = Rows("42"): Set r11 = Rows("43:45")
Set r12 = Rows("46:48"): Set r13 = Rows("49"): Set r14 = Rows("51:52"): Set r15 = Rows("36"): Set r16 = Rows("50")

'Hiding facility Rows based on product line

If r.Value = 1 Then ' Select Facility & all cells hidden
    Application.Run ("Select_Facility")
    ElseIf r.Value = 2 Then ' This is for North America & no Facility
    Application.Run ("NA_NoFacility")
    ElseIf r.Value = 3 Then ' This is for Breen Only
    Application.Run ("Breen")
    ElseIf r.Value = 4 Then ' This is for Conroe Only
    Application.Run ("Conroe")
    ElseIf r.Value = 5 Then ' This is for Lafayette Only
    Application.Run ("Lafayette")
    ElseIf r.Value = 6 Then ' This is for Breen & Conroe Only
    Application.Run ("Breen_Conroe")
    ElseIf r.Value = 7 Then ' This is for Breen & Lafayette Only
    Application.Run ("Breen_Lafayette")
    ElseIf r.Value = 8 Then ' This is for Conroe & Lafayette
    Application.Run ("Conroe_Lafayette")
    ElseIf r.Value = 9 Then ' This is for All North America
    Application.Run ("All_NA")
    ElseIf r.Value = 10 Then ' This is for Europe and no facility
    Application.Run ("Europe_NoFacility")
    ElseIf r.Value = 11 Then 'This is for Gateshead only
    Application.Run ("Gateshead")
    ElseIf r.Value = 12 Then 'This is for Kintore only
    Application.Run ("Kintore ")
    ElseIf r.Value = 13 Then 'This is for Kintore & Gateshead only
    Application.Run ("All_Europe")
    ElseIf r.Value = 14 Then ' This is for Middle East and no facility
    Application.Run ("Europe_NoFacility")
    ElseIf r.Value = 15 Then 'This is for Dubai only
    Application.Run ("Dubai")
    ElseIf r.Value = 16 Then 'This is for Saudi only
    Application.Run ("Saudi")
    ElseIf r.Value = 17 Then 'This is for Dubai and Saudi only
    Application.Run ("Dubai_Saudi")
    ElseIf r.Value = 18 Then ' This is for Far East & no Facility
    Application.Run ("FE_NoFacility")
    ElseIf r.Value = 19 Then ' This is for Loyang Only
    Application.Run ("Loyang")
    ElseIf r.Value = 20 Then ' This is for Tuas Only
    Application.Run ("Tuas")
    ElseIf r.Value = 21 Then ' This is for Perth Only
    Application.Run ("Perth")
    ElseIf r.Value = 22 Then ' This is for Loyang & Tuas Only
    Application.Run ("Loyang_Tuas")
    ElseIf r.Value = 23 Then ' This is for Loyang & Perth Only
    Application.Run ("Loyang_Perth")
    ElseIf r.Value = 24 Then ' This is for Tuas and Perth Only
    Application.Run ("Tuas_Perth")
    ElseIf r.Value = 25 Then ' This is for All far East facilities
    Application.Run ("All_FE")
    ElseIf r.Value = 26 Then ' This is for Global
    Application.Run ("All_Global")
End If

Пользователь может выбрать несколько комбинаций объектов, которые дают мне 26 вариантов - следовательно, 26 вариантов выше- изначально инструкции для скрытия строки были внутри каждой опции ElseIF, но она там тоже не сработала бы.

Способ работы формы заключается в том, что пользователь выбирает регион, а затем выбирает соответствующие средства - это изменитцелевую ячейку дважды, а также исправьте скрытые и видимые строки.из которых пользователь выберет да или нет.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

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

Private Sub Worksheet_Calculate()

'Define the worksheets & Ranges for use in this routine
Dim r As Range: Set r = Range("N19")

'Hiding facility Rows based on product line
Application.Run (Range("AB1").Offset(r.Value).Value)

End Sub

и один из макросов -

Sub Select_Facility()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Supplier Details")

ws.Activate
Rows("22:24").EntireRow.Hidden = True 
Rows("25:27").EntireRow.Hidden = True 
Rows("28:30").EntireRow.Hidden = True 
Rows("31:33").EntireRow.Hidden = True 
Rows("37").EntireRow.Hidden = True 
Rows("38").EntireRow.Hidden = True 
Rows("39").EntireRow.Hidden = True 
Rows("40").EntireRow.Hidden = True 
Rows("41").EntireRow.Hidden = True 
Rows("42").EntireRow.Hidden = True 
Rows("43:45").EntireRow.Hidden = True 
Rows("46:48").EntireRow.Hidden = True 
Rows("49").EntireRow.Hidden = True 
Rows("51:52").EntireRow.Hidden = True 
Rows("36").EntireRow.Hidden = True 
ws.Rows("50").EntireRow.Hidden = True 

End Sub

ВозможноЭто что-то простое, я делаю что-то не так, но .... О, и все строки в приведенном выше списке установлены как скрытые как стандартные, прежде чем я начну.

0 голосов
/ 04 марта 2019

Во-первых, вам нужно поработать с событием Worksheet_Calculate (), как уже упоминалось Сэмом.Но есть кое-что еще: почему вы используете условие if из 26 условий?

Создайте следующий лист (Application_Sheet) с двумя столбцами, что-то вроде этого:

R_Value      Application
      1   Select_Facility
      2       No_Facility
    ...               ...

Вместо сложного предложения if сделайте что-то вроде этого (не проверено):

Application.Run(Range(Application_Sheet!B1).Offset(r.Value).Value)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...