2011-05-26 52 views
5

Todo,error de tiempo de ejecución '9': Subíndice fuera del intervalo - sólo cuando se cierra Excel VBE

Estoy frente a un error con un poco de código VBA en una macro de Excel. Aquí está el flujo de trabajo que intento:

  • he un módulo que se ejecuta el código para crear una nueva hoja de cálculo, el formato y añadir en un puñado de valores
  • dentro de este mismo módulo, determino un rango de celdas basadas en la última fila poblada (que siempre será diferente dependiendo de los pasos anteriores)
  • Una vez que conozco este rango, uso el siguiente código para escribir en la hoja de trabajo recién creada, así puedo configurar un 'change_event'. Sólo quiero lo change_event para disparar cuando los valores en el rango acabo determinado se cambian: `

    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 
    

funciona el código, y escribe lo siguiente en el CodeModule de la hoja de cálculo especificada:

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` 

Este código también funciona, y el cuadro de mensaje aparece cuando se cambian las celdas del rango. Sin embargo, con el VBE cerrado se producirá el error:

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

Golpear depuración me lleva a la de la línea:

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

Pero en realidad arroja el error en la línea siguiente:

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

Ok, así que modifiqué el código para simplemente eliminar todo el código de la hoja de cálculo especificada y volver a escribir en lugar de eliminar y escribir cada vez. Esto evita que aparezca el error, pero abre automáticamente el VBE en su lugar ... Utilizo la línea siguiente para cerrar el VBE ... aunque no es muy ingenioso. Estoy abierto a una solución más elegante: Application.VBE.MainWindow.Visible = False – gg7aph

+0

Posible duplicado de [VBA changing sheet codename Run-Time Error 9: Subíndice fuera de rango] (http://stackoverflow.com/questions/ 41022319/vba-changing-sheet-codename-run-time-error-9-subscript-out-of-range) – ThunderFrame

Respuesta

2

no estoy seguro de por qué recibe ese error, pero aquí hay otro enfoque que evitarlo

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 
Cuestiones relacionadas