2015-08-27 16 views
5

Qualche idea per cui l'inserimento di punti di interruzione e stop non interrompe più il funzionamento del mio codice vba?VBA Excel Break Point e Stop non funzionano

Il codice gira completamente fino alla fine (l'ho provato) ma ignora i punti di interruzione e Stop.

Anche il passaggio fa semplicemente eseguire il codice nella sua interezza, ignorando i punti di interruzione e gli arresti.

Quando chiudo la cartella di lavoro in cui il problema sembra provenire dallo stesso problema si verifica in altre cartelle di lavoro macro.

se chiudo completamente excel e lo riapre con una cartella di lavoro macro normalmente funzionante, il problema non si verifica fino a quando non riaprire il libro di lavoro problema.

ho aggiunto i punti di interruzione su:

TotP1 = 0 

del codice seguente:

Option Explicit 

Private Country As String 
Private Measure As String 
Private P1 As String 
Private P2 As String 
Private TotP1 As Double 
Private TotP2 As Double 


Sub VennDisplayIt() 

Dim SI() As String 
Dim SICount As Integer 
Dim x As Integer 
Dim OSh As Worksheet 
Dim BrandListBox As Object 
Dim VennGroup As Shape 

TotP1 = 0 
TotP2 = 0 


Set OSh = ThisWorkbook.Sheets("Venn") 

Set BrandListBox = OSh.OLEObjects("BrandListBox").Object 

ReDim SI(2, 0) 

For x = 0 To BrandListBox.ListCount - 1 

    If BrandListBox.Selected(x) = True Then 
     'If UBound(SI) < 4 Then 
      ReDim Preserve SI(2, UBound(SI, 2) + 1) 

      SI(1, UBound(SI, 2)) = BrandListBox.List(x) 
      SI(2, UBound(SI, 2)) = x + 1 
     'End If 

    End If 

Next x 


If UBound(SI, 2) < 2 Then 
    BrandListBox.Selected(BrandListBox.ListIndex) = True 
    Exit Sub 
ElseIf UBound(SI, 2) > 4 Then 
    BrandListBox.Selected(BrandListBox.ListIndex) = False 
    Exit Sub 
End If 

For x = 1 To UBound(SI, 2) 
    OSh.Range("o8").Offset(x, 0).Value = SI(1, x) 
    OSh.Range("o8").Offset(x + 5, 0).Value = SI(1, x) 
Next x 

For x = UBound(SI, 2) + 1 To 4 
    OSh.Range("o8").Offset(x, 0).Value = "" 
    OSh.Range("o8").Offset(x + 5, 0).Value = "" 
Next x 


SICount = UBound(SI, 2) 

For x = 1 To OSh.Shapes.Count 
    If Right(OSh.Shapes(x).Name, 5) = "Group" Then 
    If LCase(OSh.Shapes(x).Name) = SICount & "waygroup" Then 
     Set VennGroup = OSh.Shapes(x) 
     OSh.Shapes(x).Visible = True 
    Else 
     OSh.Shapes(x).Visible = False 
    End If 
    End If 

Next x 

For x = 1 To SICount 

    VennGroup.GroupItems.Item(SICount & "WayBrand" & x).DrawingObject.Text = SI(1, x) 

Next x 


Country = ThisWorkbook.Sheets("Venn").Range("D4").Value 
Measure = ThisWorkbook.Sheets("Venn").Range("E32").Value 
P2 = ThisWorkbook.Sheets("Venn").Range("E31").Value 
P1 = ThisWorkbook.Sheets("Selections").Range("B5").Value 


End Sub 
+1

Puoi mostrare il codice e dove sono posizionati i punti di interruzione? –

+0

Ho appena aggiunto il codice. –

+2

Ho eseguito il codice con un punto di interruzione su "TotP1 = ​​0" e si è rotto esattamente come dovrebbe. Quindi la mia ipotesi è che ci sia effettivamente qualcosa di corrotto in quel libro di esercizi. –

risposta

1

Se i punti di interruzione sono nel codice, allora il codice dovrebbe smettere di correre non appena si colpisce quella linea. Possibili cause del problema:

a) Il codice non raggiunge mai il punto di interruzione. Sembra altamente improbabile visto che stai infrangendo la prima riga del tuo codice. Forse passa attraverso il sub (F8) solo per verificare che stia funzionando come dovrebbe.

b) I punti di interruzione sono stati cancellati. Qualsiasi linea con un punto di interruzione dovrebbe apparire come evidenziato in rosso sul tuo IDE. I punti di interruzione possono essere facilmente cancellati, ad es. chiudendo e aprendo la cartella di lavoro (uno screenshot sarebbe davvero utile).

c) il tuo libro di esercizi è rotto in qualche modo. È improbabile che rompa qualcosa di fondamentale come fermarsi ai punti di interruzione e continuare a funzionare normalmente. Sei sicuro che il tuo codice sia effettivamente in esecuzione?

+0

Ciao, sembra che sia C). Non posso passare attraverso il codice poiché questo è parte del problema. tuttavia i miei punti di rottura sono decisamente al loro posto ed evidenziati in rosso. il codice è sicuramente in esecuzione poiché ho messo un test proprio alla fine per modificare una cella e ha funzionato. Ho appena trasferito tutto in una nuova cartella di lavoro e sembra che funzioni per il momento. –

+0

Ok, felice di essere d'aiuto :) – Kaz

4

Non ho mai sentito parlare di Stop non funziona, ma ho sentito parlare e sperimentato la cosa di punto di interruzione molte volte. Quando si compila VBA, crea un p-code, che viene utilizzato dall'interprete. Hai il livello di sintassi VBA che puoi vedere e il livello p-code che non puoi vedere. Quando i punti di interruzione smettono di funzionare, è perché il p-code è stato danneggiato. Non so come o perché sia ​​successo, ma è successo.

La soluzione è di esportare, rimuovere e reimportare tutti i moduli. Esportandoli crea un file .bas (testo normale, in realtà). Quando reimportate, il p-code viene rigenerato da zero. Se hai più di un paio di moduli, ottieni CodeCleaner (componente aggiuntivo gratuito) che verrà esportato e reimportato automaticamente.

+1

Non solo non ho mai sperimentato che 'Stop' (come scritto nel codice) non funzioni, ma ogni volta che ho il problema (frequente) di punti di interruzione che non rompono l'esecuzione e/o il codice gli aggiornamenti non vengono mostrati all'esecuzione, aggiungendo un singolo 'Stop' lo risolve istantaneamente. Dal momento che non esiste una vera scritta "Stop" nel codice @OliverHumphreys, mi chiedo se in realtà stia parlando di "Stop" o di pensare a punti di interruzione/condizionale "F9". – Tibo

0

Se una delle impostazioni è deselezionata, i punti di interruzione non funzioneranno. "File/opzioni/Database corrente/Opzioni applicazione/Usa tasti speciali di accesso" devono essere controllati

1

Solo per "secondo" Commento di Tibo: Ho avuto un problema in cui avevo un modulo con circa 5 diverse subroutine. Uno di essi (collegato a un evento del pulsante) non si interrompeva quando si imposta un punto di interruzione. in 10 anni di scrittura VBA, non l'ho mai visto accadere. È interessante notare che i breakpoint hanno funzionato su tutte le altre subroutine in quella forma. Dopo molti grattacapi e ricerche, mi sono imbattuto in questo post e nel commento di Tibo. Ho aggiunto un comando "Stop" alla subroutine interessata, ho eseguito la procedura (si è interrotta come avrebbe dovuto) e quindi i punti di interruzione hanno iniziato a funzionare di nuovo! Spero che questo aiuti qualcuno in futuro.

1

Basta condividere una cosa divertente che mi è successa nel caso in cui aiuti qualcuno. L'errore che ho fatto è stato che ho semplicemente preso il codice di un metodo di qualcuno pensato per l'evento open della cartella di lavoro e incollato nell'area di codice oggetto excel Sheet1. Quindi non c'era alcuna possibilità che il metodo Workbook_Open venisse licenziato.

Private Sub Workbook_Open() 
    Stop 
    On Error Resume Next 
    Call ActiveSheet.Worksheet_Activate 
    On Error GoTo 0 
End Sub 

Quello che ho dovuto fare è incollare questo metodo dopo aver fatto doppio clic su ThisWorkbook nodo sotto Microsoft Excel Objects nel riquadro del progetto, come illustrato di seguito:

enter image description here

Nota: effetto collaterale di copia-incolla il codice di altri può essere a volte freaky.