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 :

Erreur de compilation : Sub ou Function non définie [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 58
    Par défaut Erreur de compilation : Sub ou Function non définie
    Bonjour tout le monde,

    Je suis en train de coder un programme en VBA afin d'actualiser automatiquement une base de données et lors de la compilation de mon code, excel me répond qu'il y a une "erreur de compilation : Sub ou Function non définie". Je ne comprends pas pk il me répond cela et ou se trouve l'erreur, j'ai beau chercher sur internet, je ne trouve pas la solution.

    Voici le code en question qui pose problème :

    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
    'procedure that update the database by treating all the new datas
    Sub updateall()
     
    For i = 0 To number_of_line - 3
     
    determinetypeofpatient (i)
     
        If typeofpatient = "newpatient" Then
                patientnew (i)
     
        ElseIf typeofpatient = "existingpatient" Then
                patientexisting (i)
     
        Else
                MsgBox "Error with the patient number " & i & "." & Chr(10) & "Please, deal with it manually."
     
        End If
     
    Next i
     
    End Sub
     
    'procedure that decides if the patient whose number of line is "values" is new or not and return a string "newpatient" or "existingpatient"
    Sub determinetypeofpatient(ByVal values As Integer)
     
    Dim typeofpatient As String
    Dim positionlinepatientexisting As Integer
     
    For i = 0 To number_of_line_in_the_database - 3
        If base(i, positioncolumndatabase - 1) = table(values - 3, positioncolumn - 1) Then
            typeofpatient = existingpatient
            positionlinepatientexisting = i
            Exit For
     
        ElseIf i = number_of_line_in_the_database - 3 Then
            typeofpatient = newpatient
     
        Else
     
        End If
     
    Next i
     
    End Sub
    Qq remarques sur mon code :
    • number_of_line et number_of_line_in_the_database sont des integer déclarés en début de module
    • patientexisting (i)et patientnew(i) sont des procédures du reste de mon code qui prennent comme argument un integer (i)
    • base et table sont 2 tableaux que j'ai crée auparavant (les bornes des boucles sont bonnes)


    Lorsqu'excel m'indique l'erreur, il en profite pour surligner en jaune la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub determinetypeofpatient(ByVal values As Integer)
    J'espère que vous pourrez m'aider à trouver l'erreur ! Car vraiment je ne sais pas quoi faire.

    J'en profite pour poser une question assez simple. Si on veut utiliser un tableau dans plusieurs procédures, faut-il nécessairement le déclarer en début de module ou le fait de le déclarer dans une procédure ne pose pas de problème ?

    Merci à vous

  2. #2
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonsoir

    Citation Envoyé par forum2015 Voir le message

    Lorsqu'excel m'indique l'erreur, il en profite pour surligner en jaune la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub determinetypeofpatient(ByVal values As Integer)
    Quelle est la ligne en bleu dans cette procédure? Car c'est la ligne surlignée en bleu qui cause cette erreur.

    Quand tu parles de déclarer un tableau, c'est un Range ou une table ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 58
    Par défaut
    La ligne surligné en bleue est la ligne suivante, en particulier, seul le mot "base" est surligné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If base(i, positioncolumndatabase - 1) = table(values - 3, positioncolumn - 1) Then
    Voila le code dans lequel je crée table, j'ai vérifié auparavant, ce tableau fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'procedure which copies the sheet BASE TOTAL in a tab, called base, so as to reduce the time of calcul
    Sub creationbase()
     
    Dim base()
     
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
            For j = 0 To number_of_column_in_the_database - 1
                For i = 0 To number_of_line_in_the_database - 3
                    base(i, j) = cells(i + 3, j + 1)
                Next i
            Next j
     
    End Sub
    Et quand je parle de déclarer un tableau, je parle d'un table. En gros je dois actualiser une base de donnée (BASE TOTAL) à partir de nouvelles données (Feuil2). Pour diminuer le temps de calcul car il va y avoir bc de comparaison, de recherches etc... je crée 2 tableaux (des table comme tu dis), un pour chaque page (leur noms sont base pour BASE TOTAL et table pour Feuil2) ou je copie-colle les valeurs et j'utilise ensuite ces tableaux pour les calculs.

    Merci pour tes remarques

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par forum2015 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Sub creationbase()
     
    Dim base()
     
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
            For j = 0 To number_of_column_in_the_database - 1
                For i = 0 To number_of_line_in_the_database - 3
                    base(i, j) = cells(i + 3, j + 1)
                Next i
            Next j
     
    End Sub
    Supprimer Dim base() dans cette procédure et dans toute autre procédure du projet s'il y a lieu.
    Déclare Base ainsi en haut d'un module standard avant toute procédure :

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    J'en profite pour poser une question assez simple. Si on veut utiliser un tableau dans plusieurs procédures, faut-il nécessairement le déclarer en début de module ou le fait de le déclarer dans une procédure ne pose pas de problème ?
    Si tu déclare un tableau au niveau procédure, sa portée ne sera que dans cette procédure et une fois le code entièrement exécuté, le tableau est détruit mais par contre, tu peux le passer en argument de proc en proc.

    Pour affecter les valeurs d'une plage à un tableau, tu n'est pas obliger de boucler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub creationbase()
     
        Dim base()
     
        ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
     
        'en partant de A3
        base = Range(Cells(3, 1), Cells(number_of_line_in_the_database, number_of_column_in_the_database))
     
        'ici par exemple, pour remettre les valeurs dans la feuille une ligne en dessous
        'Range(Cells(number_of_line_in_the_database + 2, 1), Cells(number_of_line_in_the_database + UBound(base, 1) + 1, number_of_column_in_the_database)).Value = base
     
    End Sub
    Hervé.

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    [EDIT] Ce Post a été modifié[/EDIT]

    Pour rendre facile la programmation d'un tableau en VBA pour Excel :


    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
    'En haut d'un module standard
    Public Base() As Variant 'Le tableau s'appelle Base
     
    'N'importe ou dans le projet
    Sub TableauFacileBase()
     
     
    Set f = ThisWorkbook.Worksheets("Feuil3") 'à Adapter
     
    Set DebutDuTableau = f.Range("A2") 'à Adapter
     
    NombreDeLignes = 3: NombreDeColonnes = 5 'à Adapter
     
    Base = DebutDuTableau.Range(f.Cells(1, 1), f.Cells(NombreDeLignes, NombreDeColonnes)).Value
     
    ' Tes Calculs
    For i = 1 To UBound(Base, 1)  '  ou For i = 1 to NombreDeLignes ' C'est équivalent
     For j = 1 To UBound(Base, 2)  '  ou For i = 1 to NombreDeColonnes  ' C'est équivalent
     
     
     Base(i, j) = Base(i, j) + 1 'Exemple de Calcul
     
     '5 lignes temporaires pour comparer Range et Tableau()
     'DebutDuTableau.Cells(i, j) = Base(i, j) 'Modifier le Range
     DebutDuTableau.Parent.Parent.Activate
     DebutDuTableau.Parent.Activate
     DebutDuTableau.Cells(i, j).Select
     MsgBox Base(i, j)
     
     
     Next
    Next
    Stop
    'Pour transférer ensuite le tableau sur la feuille, la ligne suivante suffira;
    DebutDuTableau.Range(f.Cells(1, 1), f.Cells(UBound(Base, 1), UBound(Base, 2))).Value = Base
     
    End Sub

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 58
    Par défaut
    Merci pour vos réponses à tout les deux.

    DocMarti concernant ta 1ère réponse, j'ai donc changé et mis Public base() en début de module.
    Mais maintenant quand je compile la procédure qui remplie le tableau base (voir code ci dessous de nouveau), ca ne marche plus. Ca me répond "erreur 9 : l'indice n'appartient pas à la sélection" et la ligne soulignée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
    Code (Public base() en debut de module) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'procedure which copies the sheet BASE TOTAL in a tab, called base, so as to reduce the time of calcul
    Sub creationbase()
     
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
            For j = 0 To number_of_column_in_the_database - 1
                For i = 0 To number_of_line_in_the_database - 3
                    base(i, j) = cells(i + 3, j + 1)
                Next i
            Next j
     
    End Sub
    J'ai essayé de préciser la feuille active (BASE TOTAL) de 2 facon différente, au cas ou, mais sa n'a pas fonctionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub creationbase()
     
    With Sheets("BASE TOTAL")
     
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
     For j = 0 To number_of_column_in_the_database - 1
                For i = 0 To number_of_line_in_the_database - 3
                    base(i, j) = cells(i + 3, j + 1)
                Next i
     Next j
     
    End With
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub creationbase()
     
    ReDim base(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
     For j = 0 To number_of_column_in_the_database - 1
                For i = 0 To number_of_line_in_the_database - 3
                    base(i, j) = With Sheets("BASE TOTAL").cells(i + 3, j + 1)
                Next i
     Next j
     
    End Sub

    Theze, merci pour ta remarque. Sans la boucle, tu penses que le calcul est plus rapide ? Il me semble bien selon moi. Je vais l'implanter, mais il faut d'abord résoudre le pb d'erreur 9 avec le ReDim

    Enfin, DocMarti pour revenir sur ton dernier commentaire, il y a certains points que je ne comprend pas dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DebutMonTableau = f.Range("A2")
    Qu'est ce que DebutMonTableau ? A quoi sert-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableau = DebutMonTableau.Range(f.Cells(1, 1), f.Cells(NombreDeLignes, NombreDeColonnes)).Value
    La tu redimensionne ton tableau non ?


    Merci à tous les deux

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

Discussions similaires

  1. [XL-2007] Erreur de compilation : sub ou fonction non définie
    Par Marine38500 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/02/2014, 17h37
  2. [XL-2007] Erreur compilation : Sub ou Fonction non définie
    Par DSE76 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 02/07/2013, 15h41
  3. [XL-2007] Erreur de compilation : Sub ou Function non définie
    Par pimpom81 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 27/03/2013, 20h47
  4. Réponses: 2
    Dernier message: 05/08/2009, 17h08
  5. Réponses: 5
    Dernier message: 22/12/2008, 11h20

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