Remplacez SI(ESTNA(…) par SI.NON.DISP()

SI.NON.DISPO fait partie de la série de fonctions SI.

Elle permet de tester si le premier argument de la fonction retourne une valeur d'erreur #N/A, et le deuxième argument renvoie la valeur si c'est le cas.

Cette fonction est plus rapide à écrire que SI(ESTNA()), et je pense, plus rapide à exécuter.

C'est aussi l'occasion de revoir ces deux posts qui expliquent comment ajouter un raccourci de saisie pour remplacer iiii par :

=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)

Pour l'ajouter directement en VBA (faire un double clic pour tout sélectionner):

Application.AutoCorrect.AddReplacement "iiii", "=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)"

Vous pouvez coller le code dans la fenêtre exécution (dans VBE, Ctrl+g, coller le code et appuyer sur entrée) ou bien le mettre dans une macro. Ensuite, en tapant iiii [espace], vous aurez tout de suite la formule. Il ne reste plus qu'à double-cliquer sur les différents arguments et sélectionner la zone qui vous intéresse.

Zoom sur la fenêtre exécution en VBA

Affichage

Dans l'éditeur de VBA (ALT+F11), vous pouvez afficher la fenêtre Exécution. Ctrl + g fonctionne aussi :

Vous pouvez faire un double-clic dans le titre de la fenêtre pour pouvoir la déplacer rapidement, ou bien la remettre en bas du code.

Aussi, CTRL+Espace fonctionne pour rapidement taper du code (intellisense).

Exemples

Une fois cette fenêtre affichée, il est ensuite possible d'exécuter le code que vous entrerez. Cependant, ce code ne doit ni être déclaratif, ni sur plusieurs lignes (pas de Dim, Option Explicit, If, For...Next).

Par exemple, si vous tapez Msgbox "Test", puis vous appuyez sur Entrée, une boîte de dialogue va s'afficher.

Voici d'autres exemples intéressants :

?Activeworkbook.Worksheets.Count Nombre de feuilles dans le classeur actif
?range("A1").Formula
?range("A1").FormulaLocal
Traduction de la formule en A1, en Anglais et dans la langue "locale" d'excel.
For Each sh In Worksheets:Debug.Print sh.Name:Next Liste toutes les feuilles du classeur. Le ":" simule un retour à la ligne et permet d'éviter la limitation de l'interdiction de plusieurs lignes dans la fenêtre exécution.
NomDeLaMacro avec les variablesExécute la macro avec les variables spécifiées.
NomVariable = 12Change la valeur d'une variable, excellent pour rapidement avancer dans une boucle. Mettez au préalable un point d'arrêt dans la boucle.
?ActiveWorkbook.Path Chemin du fichier
?12+15Comme calculatrice
Application.AutoCorrect.AddReplacement "iiii", "=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)"Permet de remplacer iiii par la formule "=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)"
Plus d'infos ici et ici.

Suivre l'exécution de votre code principal

Durant l'exécution du code principal, vous pouvez aussi suivre les valeurs de certaines variables.

Soit directement dans la fenêtre d'exécution

Si vous exécutez le code pas à pas, vous pouvez demander la valeur d'une variable (en complément à l'ajout d'espions)

Soit avec Debug.Print

Par exemple, en utilisant Debug.Print "quelque chose", "quelque chose" va apparaître dans la fenêtre exécution.

Voici un exemple qui permet de créer un log de l'exécution de votre code.

 Sub test123()<br />     Dim i As Integer, j As Integer<br />     For i = 1 To 3<br />         Debug.Print "i= " & i<br />         j = i * 10<br />         Debug.Print "j =" & j<br />     Next<br /> End Sub 

D'où le résultat une fois le code exécuté.

En pratique, on utilise ces techniques pour débugguer un code, par exemple, en listant les différentes valeurs d'une variable.

Vider la fenêtre exécution

Vous pouvez manuellement vous placer dans la fenêtre, puis CTRL+A et ensuite Supprimer.

Il semble que vider cette fenêtre en VBA soit plus difficile qu'il n'y parait. Voici un lien qui en parle : http://dailydoseofexcel.com/archives/2004/06/09/clear-the-immediate-window/

Pour aller plus loin, n'hésitez pas à investir dans mes formations sur excel et VBA :

Sources :
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/use-the-immediate-window
https://www.excelcampus.com/vba/vba-immediate-window-excel/



Parcourez rapidement une table

Une des frustrations lorsque l'on travaille sur une table avec de nombreuses colonnes, est de pouvoir rapidement se déplacer d'une colonne à une autre.

Voici un petit code qui va prendre deux minutes à installer et qui peut vous rendre de grands services.

Vous pouvez télécharger ici le fichier.

Voici la procédure en vidéo :

Procédure détailllée

  • Ouvrez le fichier excel (sauvegardé en .xlsm pour avoir les macros)
  • Ajoutez un userform
  • Ajouter une listbox
  • Dans la fenêtre propriété (touche F4), renommez l'userform (ufDeplacement) et la listbox (ListBoxColonnes)
  • Clic droit sur l'userform pour accéder au code
  • Collez le code ci-dessous :
Option Explicit

Private Sub ListBoxColonnes_Click()
    Application.Goto Cells(ActiveCell.Row, _
        ActiveSheet.ListObjects("Tableau1").HeaderRowRange.Column + _
        Me.ListBoxColonnes.ListIndex), True
End Sub

Private Sub UserForm_Initialize()
Me.ListBoxColonnes.List = _
    Application.WorksheetFunction.Transpose( _
        ActiveSheet.ListObjects("Tableau1").HeaderRowRange)
End Sub
  • Finalement, insérez un nouveau module et collez le code suivant pour lancer l'userform
Sub AfficherufDeplacement()
    ufDeplacement.Show
End Sub