2013-07-03 3 views
2

У меня есть код VBA, который обновляет значения многих ячеек на основе значения предыдущей ячейки. На данный момент я могу заставить его работать на один ряд информации. Тем не менее, я бы хотел, чтобы он работал более нескольких строк. Я пишу и копирую + вставляя фрагменты кода, так что есть хороший шанс, что это просто отсутствие согласованности.Имейте процесс работы для более чем одной строки в VBA

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim rwIndex As Integer 
For rwIndex = 4 To 400 
If Target.Address = Cells(rwIndex, 3) Then 

    If Range(Target.Address).Value = "Intrinsic" Then 
     Dim LYVMessage 
     LYVMessage = "Enter Last Year's Value" 
     Cells(rwIndex, 5).Value = InputBox(LYVMessage) 
    Else 
     Cells(rwIndex, 5).Value = "NA" 
     Cells(rwIndex, 6).Value = "NA" 
     Cells(rwIndex, 9).Value = "NA" 
     Cells(rwIndex, 10).Value = "NA" 
     Cells(rwIndex, 11).Value = "NA" 
     Cells(rwIndex, 12).Value = "NA" 
     Cells(rwIndex, 7).Value = "NA" 
     Cells(rwIndex, 8).Value = "NA" 
     QMessage = "Enter whether Quantity is a Fixed Variable (1) or Random Variable (Logistic or Triangular)" 
     Cells(rwIndex, 13).Value = InputBox(QMessage) 
     PMessage = "Either Enter a Fixed Value for Price, or Enter Whether it is a Random Variable (Logistic or Triangular)" 
     Cells(rwIndex, 14).Value = InputBox(PMessage) 
    End If 
End If 
Next rwIndex 
End Sub 

Когда я обновляю клетки-мишени, я получаю ошибку, которая говорит: «Ошибка компиляции: Sub или функция не определена.»

Может ли кто-нибудь сказать мне, что происходит?

+0

Где вы размещали этот код? Он должен идти на ЛИСТ и НЕ в модуле, так как это событие изменения –

+0

Это не сотовый, а ячейки с S. Но этот код тоже не будет приседать. Вы хотите изменить значения только в том случае, если вы что-то изменили в столбце C и между строками 4 и 400? Это оно? –

+0

Это в листе. И да, я только хочу, чтобы значения менялись, если что-то в столбце C было изменено. – Chris

ответ

0

Несколько проблем: это не «сотовый», а «ячейки». Также этот код должен быть в коде рабочего листа, а не в модуле. И он ничего не сделает, как есть ...

Вот код, который должен делать то, что я понял, вы хотите изменить: измените значения, если вы измените ячейку в столбце «C», которая находится между строками 4 и 400 включительно

Private Sub Worksheet_Change(ByVal Target As Range) 

Application.ScreenUpdating = False ' Turn screen updating off 
Application.EnableEvents = False ' Turn the events off to avoid trigerring this macro within this macro when changing cell values 

Dim r As Integer, c As Integer 
Dim Message As String 

' Get the Target cell's row and column (the cell you just modified and that triggered this macro) 
r = Target.Row 
c = Target.Column 

' If the target cell is in column 3 and between rows 4 and 400 included 
If c = 3 And (r > 3 And r < 401) Then 

    If Target.Value = "Intrinsic" Then 

     Message = "Enter Last Year's Value" 
     Cells(r, 5).Value = InputBox(Message) 

    Else 
     Cells(r, 5).Value = "NA" 
     Cells(r, 6).Value = "NA" 
     Cells(r, 9).Value = "NA" 
     Cells(r, 10).Value = "NA" 
     Cells(r, 11).Value = "NA" 
     Cells(r, 12).Value = "NA" 
     Cells(r, 7).Value = "NA" 
     Cells(r, 8).Value = "NA" 

     Message = "Enter whether Quantity is a Fixed Variable (1) or Random Variable (Logistic or Triangular)" 
     Cells(r, 13).Value = InputBox(Message) 

     Message = "Either Enter a Fixed Value for Price, or Enter Whether it is a Random Variable (Logistic or Triangular)" 
     Cells(r, 14).Value = InputBox(Message) 

    End If 

End If 

' Turn events and screen updating back on 
Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Sub 
+0

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

+0

Просто примечание о том, что «NA» можно установить в этих ячейках за один раз: «Союз (ячейки (r, 5), ячейки (r, 6), ячейки (r, 9) и т. Д.). Значение =« NA »' –

0

В строке 4 вашего кода вы сравниваете адрес целевой ячейки (String) с ячейкой (диапазон).

Вместо этого:

If Target.Address = Cells(rwIndex, 3) Then 

вы должны попробовать этот

If Target.Address = Cells(rwIndex, 3).Address Then 

Надежда, которая работает !!!

Смежные вопросы