Ошибка времени выполнения '9': нижний индекс вне диапазона - только когда Excel VBE закрыт - PullRequest
5 голосов
/ 26 мая 2011

Все,

Я столкнулся с ошибкой с некоторым кодом VBA в макросе Excel.Вот рабочий процесс, который я пытаюсь:

  • У меня есть модуль, который запускает код для создания нового листа, форматирования его и добавления набора значений
  • в этом же модуле.определить диапазон ячеек на основе последней заполненной строки (которая всегда будет отличаться в зависимости от предыдущих шагов)
  • Как только я знаю этот диапазон, я использую приведенный ниже код для записи во вновь созданный модуль кода рабочих таблицтак что я могу настроить 'change_event'.Я хочу, чтобы change_event запускался только при изменении значений в только что определенном диапазоне: `

    Dim Startline As Long
    Startline = 1
    Dim x As Integer
    x = Errors.Count - 1
    
    Dim rng As Range
    Set rng = Range("D" & LastRow - x & ":" & "D" & LastRow)
    
           With ThisWorkbook.VBProject.VBComponents(VRS.CodeName).CodeModule
            Startline = .CreateEventProc("Change", "Worksheet") + 1
            .InsertLines Startline, "Dim rng As Range "
            Startline = Startline + 1
            .InsertLines Startline, "Set rng = Range(" & """" & CStr(rng.Address) & """" & ")"
            Startline = Startline + 1
            .InsertLines Startline, "If Target.Count > 1 Then Exit Sub"
            Startline = Startline + 1
            .InsertLines Startline, "If Intersect(Target, rng) Is Nothing Then Exit Sub"
            Startline = Startline + 1
            .InsertLines Startline, "MsgBox (""Value Changed!..."") "
           End With
    

Код работает и записывает следующее в модуль кода указанного рабочего листа.:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Range("D58:D62")
If Target.Count > 1 Then Exit Sub  
If Intersect(Target, rng) Is Nothing Then Exit Sub
MsgBox ("Value Changed!...") 
End Sub`

Этот код также работает, и окно сообщения появляется при изменении ячеек в диапазоне.Однако при закрытом VBE будет выдано сообщение об ошибке:

Run-time error '9': Subscript out of range

Нажатие на отладку выводит меня на строку:

With ThisWorkbook.VBProject.VBComponents(WS.CodeName).CodeModule

Но на самом деле выдаетошибка в следующей строке:

Startline = .CreateEventProc("Change", "Worksheet") + 1

1 Ответ

2 голосов
/ 27 мая 2011

Я не уверен, почему вы получаете эту ошибку, но вот другой подход, который позволит избежать этого

Sub Main()

    Dim ws As Worksheet
    Dim rng As Range
    Dim sCode As String

    Set ws = ThisWorkbook.Worksheets.Add
    Set rng = ws.Range("D1:D10")

    sCode = "Private Sub Worksheet_Change(ByVal Target As Range)" & vbNewLine & vbNewLine
    sCode = sCode & vbTab & "Dim rng As Range" & vbNewLine & vbNewLine
    sCode = sCode & vbTab & "Set rng = Me.Range(" & """" & rng.Address & """" & ")" & vbNewLine & vbNewLine
    sCode = sCode & vbTab & "If Target.Count > 1 Then Exit Sub" & vbNewLine
    sCode = sCode & vbTab & "If Intersect(Target, rng) Is Nothing Then Exit Sub" & vbNewLine & vbNewLine
    sCode = sCode & vbTab & "MsgBox (""Value Changed!..."") " & vbNewLine
    sCode = sCode & "End Sub"

    ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule.AddFromString sCode

End Sub
...