IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Simplification d'un code


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut Simplification d'un code
    Bonjour à tous,
    J'expose ici à nouveau mes problèmes........... Peut être, j'espère, saurez vous m'aider

    J'ai un code, qui fonctionne très bien mais très très répétitif, que je souhaiterais simplifier.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Dim Nb As Integer
     
    Private Sub combobox1_change() 'Choix du type d'instruction
        ComboBox1.Visible = True
        CommandButton2.Visible = True
        Label2.Visible = True
     
        If ComboBox1 = "Marches dégradées" Then
            tot = Sheets("MD").Range("A2").End(xlDown).Row
            Randomize   'Initialiser le générateur de nombres aléatoires
            Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                While Sheets("MD").Cells(Nb, 2) <> ""
                    Randomize   'Initialiser le générateur de nombres aléatoires
                    Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                Wend
            Sheets("MD").Cells(Sheets("MD").Range("A1").End(xlDown).Row + 1, 3) = Nb
            Label2.Caption = Sheets("MD").Cells(Nb, 1)
            If Sheets("MD").Cells(Nb, 4).Value <> "" Then
                Label3.Visible = True
                Label4.Visible = True
                Label3.Caption = "Ancien n° d'avis : " & Sheets("MD").Cells(Nb, 4)
                Label4.Caption = Sheets("MD").Cells(Nb, 5)
                Me.Height = 200
            End If
        ElseIf ComboBox1 = "Instructions d'exploitation" Then
            tot = Sheets("IE").Range("A2").End(xlDown).Row
            Randomize   'Initialiser le générateur de nombres aléatoires
            Nb = Int(tot * Rnd) + 1  'Nombre aléatoire entier entre 4 et tot
                While Sheets("IE").Cells(Nb, 2) <> ""
                    Randomize   'Initialiser le générateur de nombres aléatoires
                    Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                Wend
            Sheets("IE").Cells(Sheets("IE").Range("A1").End(xlDown).Row + 1, 3) = Nb
            Label2.Caption = Sheets("IE").Cells(Nb, 1)
            If Sheets("IE").Cells(Nb, 4).Value <> "" Then
                Label3.Visible = True
                Label4.Visible = True
                Label3.Caption = "Ancien n° d'avis : " & Sheets("IE").Cells(Nb, 4)
                Label4.Caption = Sheets("IE").Cells(Nb, 5)
                Me.Height = 200
            End If
        ElseIf ComboBox1 = "Instructions de sécurité" Then
            tot = Sheets("IS").Range("A2").End(xlDown).Row
            Randomize   'Initialiser le générateur de nombres aléatoires
            Nb = Int(tot * Rnd) + 1  'Nombre aléatoire entier entre 4 et tot
                While Sheets("IS").Cells(Nb, 2) <> ""
                    Randomize   'Initialiser le générateur de nombres aléatoires
                    Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                Wend
            Sheets("IS").Cells(Sheets("IS").Range("A1").End(xlDown).Row + 1, 3) = Nb
            Label2.Caption = Sheets("IS").Cells(Nb, 1)
            If Sheets("IS").Cells(Nb, 4).Value <> "" Then
                Label3.Visible = True
                Label4.Visible = True
                Label3.Caption = "Ancien n° d'avis : " & Sheets("IS").Cells(Nb, 4)
                Label4.Caption = Sheets("IS").Cells(Nb, 5)
                Me.Height = 200
            End If
        End If
    End Sub
    Clairement, je fais exactement 3x la même chose en fonction du choix de mon combobox1.

    J'ai donc essayé de simplifier de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Dim Nb As Integer
    Dim TypeInst As String
     
    Private Sub combobox1_change() 'Choix du type d'instruction
        ComboBox1.Visible = True
        CommandButton2.Visible = True
        Label2.Visible = True
     
        If ComboBox1 = "Marches dégradées" Then
            TypeInst = "MD"
        ElseIf ComboBox1 = "Instructions d'exploitation" Then
            TypeInst = "IE"
        ElseIf ComboBox1 = "Instructions de sécurité" Then
            TypeInst = "IS"
        End If
     
            tot = Sheets(TypeInst).Range("A2").End(xlDown).Row
            Randomize   'Initialiser le générateur de nombres aléatoires
            Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                While Sheets(TypeInst).Cells(Nb, 2) <> ""
                    Randomize   'Initialiser le générateur de nombres aléatoires
                    Nb = Int(tot * Rnd) + 2  'Nombre aléatoire entier entre 2 et tot
                Wend
            Sheets(TypeInst).Cells(Sheets(TypeInst).Range("A1").End(xlDown).Row + 1, 3) = Nb
            Label2.Caption = Sheets(TypeInst).Cells(Nb, 1)
            If Sheets(TypeInst).Cells(Nb, 4).Value <> "" Then
                Label3.Visible = True
                Label4.Visible = True
                Label3.Caption = "Ancien n° d'avis : " & Sheets(TypeInst).Cells(Nb, 4)
                Label4.Caption = Sheets(TypeInst).Cells(Nb, 5)
                Me.Height = 200
            End If
    End Sub
    Mais j'ai ce message d'erreur qui s'affiche :
    Nom : Sans titre.png
Affichages : 127
Taille : 3,3 Ko

    et le déboggeur qui me souligne la ligne 17 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            tot = Sheets(TypeInst).Range("A2").End(xlDown).Row

    Savez vous quel est le problème ou avez une solution plus efficace?

    Merci d'avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    à quoi est égal TypeInst au moment de l'erreur ?

    Si tu as fait une erreur de saisie sur tes If ComboBox1 = "xxx" il sera vide, donc feuille non valide.
    eric

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Merci de vous interessé à mon problème.

    La variable au moment de l'erreur est à "".

    Je viens donc de comprendre mon problème. A l'ouverture de l'Userform, dans mon combobox1, j'y affiche un caption : "Choisir le type de procédure à lire".
    Ma ligne de code 17 fait donc référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        tot = Sheets("Choisir le type de procédure à lire").Range("A2").End(xlDown).Row
    qui est bien sur une feuille qui n'existe pas.....

    J'ai donc corrigé de cette manière et ca semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        If ComboBox1 = "Marches dégradées" Then
            TypeInst = "MD"
        ElseIf ComboBox1 = "Instructions d'exploitation" Then
            TypeInst = "IE"
        Else
            TypeInst = "IS"
        End If
    Comme quoi, parfois, on a la solution sous le nez, mais on arrive pas à la voir!!! Et le coup de pouce de la communauté nous sauve!!

    Merciiii

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    J'aurais plutôt gardé les 3 tests et ajouté
    Pour sortir plutôt que de traiter sur une feuille non explicitement choisie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Simplification d'un code php
    Par sff dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/08/2008, 14h35
  2. simplification d'un code
    Par lolo93 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/04/2008, 11h38
  3. Réponses: 2
    Dernier message: 30/05/2007, 15h04
  4. Simplification de mon code?
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 31/01/2007, 16h50
  5. [VBA-E] Aide pour simplification de mon code.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/05/2006, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo