2015-11-12 7 views
9

Ho una discreta quantità di variabili globali e per tenerne traccia durante il debug, utilizzo gli orologi. Tuttavia è fastidioso aggiungerli tutti ancora e ancora all'inizio di ogni sessione. C'è un modo per salvarli e caricarli? O se non è possibile aggiungerli tramite codice?Come posso salvare manualmente gli orologi VBA o aggiungerli tramite codice?

Questa domanda riguarda gli orologi per le espressioni nella finestra Editor VBA (vedere screenshot). Screenshot

+1

Si potrebbe aggiungere questi come commenti nel codice (in alto) e poi copia/incolla questi in lLa orologi – MiguelH

+0

si può spostarli in una classe come proprietà, poi hanno la proprietà lasciate funzione di debug.? VARIABLE_NAME, VALUE? –

+0

@MiguelH Sembra molto tempo per me. Selezione di contesto e proprietà ogni volta. – ChrisUnbroken

risposta

4

Non è molto carina, ma è possibile utilizzare Application.SendKeys per aggiungere orologi. Non ho idea se le impostazioni internazionali della lingua influenzano i tasti di scelta rapida. Quanto segue vale per l'inglese.

La limitazione è che è possibile utilizzare solo cose come Modulo corrente o Tutti i moduli (ad esempio, scorrere fino in fondo o completamente verso il basso), ma non un altro specifico modulo per l'ambito. Probabilmente potresti risolvere questa limitazione usando il VBIDE per scoprire quanti moduli ci sono ecc, e quindi quante volte scorrere verso l'alto per un particolare modulo. Non ho fatto questo per il codice qui sotto come questa è una prova di concetto - Lascio la parte divertente a voi :-)

Uso: chiamata AddWatch sub con gli argomenti specificati. È possibile aggiungerli a un sottotitolo che si chiama quando si avvia una nuova sessione, come illustrato nel mio "HelloNewSession()"

Il VBE deve essere a fuoco quando viene eseguito il codice. È possibile farlo manualmente o utilizzare l'oggetto VBIDE per impostare lo stato attivo.

Option Explicit 

Enum enumWatchType 
    WatchExpression 
    BreakWhenTrue 
    BreakWhenChange 
End Enum 
Enum enumProceduresType 
    AllProcedures 
    Caller 
End Enum 
Enum enumModuleType 
    AllModules 
    CurrentModule 
    ThisWorkbook 
End Enum 

Public testVar As Boolean 
Sub HelloNewSession() 
    AddWatch "testVar = True", AllProcedures, CurrentModule, BreakWhenTrue 
    testVar = True 
End Sub 

Sub AddWatch(_ 
    expression As String, _ 
    Optional proceduresType As enumProceduresType = enumProceduresType.Caller, _ 
    Optional moduleType As enumModuleType = enumModuleType.CurrentModule, _ 
    Optional watchType As enumWatchType = enumWatchType.WatchExpression) 

    Dim i As Long 

    Application.SendKeys "%DA" 
    Application.SendKeys getEscapedSendkeysText(expression) 
    If proceduresType = enumProceduresType.AllProcedures Then 
     Application.SendKeys "%p" 
     For i = 1 To 1000 'You could use VBIDE to count the valid types to actually scroll up the right number of times! 
      Application.SendKeys "{UP}" 
     Next 
    End If 
    If moduleType = enumModuleType.AllModules Then 
     Application.SendKeys "%m" 
     For i = 1 To 1000 'You could use VBIDE to count the valid types to actually scroll up the right number of times! 
      Application.SendKeys "{UP}" 
     Next 
    ElseIf moduleType = enumModuleType.ThisWorkbook Then 
     Application.SendKeys "%m" 
     For i = 1 To 1000 'You could use VBIDE to count the valid types to actually scroll up the right number of times! 
      Application.SendKeys "{DOWN}" 
     Next 
    End If 
    Select Case watchType 
     Case enumWatchType.WatchExpression 
      Application.SendKeys "%w" 
     Case enumWatchType.BreakWhenTrue 
      Application.SendKeys "%t" 
     Case enumWatchType.BreakWhenChange 
      Application.SendKeys "%c" 
    End Select 

    Application.SendKeys "~" 

End Sub 
Function getEscapedSendkeysText(ByVal text As String) As String 
    Dim char As String, i As Long 
    Const chars As String = "~%+^()[]" 
    For i = 1 To Len(chars) 
     char = Mid$(chars, i, 1) 
     text = Replace(text, char, "{" & char & "}") 
    Next 
    getEscapedSendkeysText = text 
End Function 
+0

Qual è il segno $ nell'espressione Mid $ (chars, i, 1) per? L'aiuto VBA visualizza Mid senza di esso. Grazie per la lunga risposta, sto cercando di implementarlo. Contrassegnerà come accettato se tutto funziona :) – ChrisUnbroken

+0

@ChrisUnbroken praticamente la stessa cosa. Restituisce una stringa anziché una variante. A causa della conversione implicita del tipo in VBA, la differenza è trascurabile. Infatti, non ho fatto sostituire $ (..). Non sono sicuro del motivo per cui ho usato l'uno o l'altro;) –

+0

in modo da poter sempre usare il segno $ per ottenere una variabile con il tipo esplicito nel wrapper della variante? Hai forse un link che spiega questo in dettaglio? – ChrisUnbroken

7

In una classe chiamata WatchedVariables, si potrebbe avere

Option Explicit 

Private str_Variable1_Prev As String 
Private str_Variable1 As String 

Public Property Let strVariable1(value As String) 
    str_Variable1_Prev = str_Variable1 
    str_Variable1 = value 
    If str_Variable1 <> str_Variable1_Prev Then 
     Debug.Print "Variable 1 has changed" 
    Else 
    End If 
End Property 

allora si sarebbe accedere le variabili guardato, in questo modo clsWatchedVariables.strVariable1 = "nathan"

Tuttavia, questo può aiutare Find specific text in VBA watch list

+1

Il problema con questo è che quando si esegue la query di codice se c'è stata una modifica? Avresti bisogno di eseguire chiamate in questa classe dappertutto (ammesso che potresti utilizzare le condizioni del compilatore per avere solo la performance durante lo sviluppo) –

+1

imposteresti la classe come pubblica, dichiarata all'apertura, poi invece myVar = 1 sarebbe clsWatchedVars.myVar = 1, quindi nella finestra immediata vedresti la modifica. –