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

  1. #1
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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 émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    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 ?
    Cordialement

    Docmarti.

  3. #3
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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 émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    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 :
    Cordialement

    Docmarti.

  5. #5
    Expert éminent
    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
    Points : 6 871
    Points
    6 871
    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 émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    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
    Cordialement

    Docmarti.

  7. #7
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par forum2015 Voir le message
    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)
    si tu clique sur debug puis passe le curseur sur les 2 variables
    - number_of_line_in_the_database
    - number_of_column_in_the_database

    qu'elles sont leur valeurs ? je ne vois pas ou tu renseigne ces variables




    Citation Envoyé par forum2015 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("BASE TOTAL")
    (..)
        base(i, j) = .cells(i + 3, j + 1)
    pour que ton With soit utile il faut que tu rajoute un point devant tous les objets cells, range concerné ...

  9. #9
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    Les 4 variables : number_of_line, number_of_column, number_of_line_in_the_database, number_of_column_in_the_database
    sont calculés dans une procédure avant (variable déclaré en haut de module).

    Voici le code (tout est bon normalement, j'ai vérifié avec des MsgBox) :

    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
    'Decide if the update is feasible or not
    Sub updatefeasible()
     
    'Number of lines and columns in the database
    With Sheets("BASE TOTAL")
            number_of_line_in_the_database = .Range("A" & Rows.Count).End(xlUp).Row
            number_of_column_in_the_database = .cells(2, Columns.Count).End(xlToLeft).Column
     
    End With
     
    'Number of lines and columns in the sheet Nuevos informaciones
    With Sheets("Nuevos informaciones")
            number_of_line = .Range("A" & Rows.Count).End(xlUp).Row
            number_of_column = .cells(2, Columns.Count).End(xlToLeft).Column
     
    End With
     
    'If they are no lines in the sheet, send message of error
    If number_of_line < 3 Then
    MsgBox "Error : There is no data in the sheet Nuevos informaciones"
     
    'If they are more column in the new sheet than in the database, ask for deleting the columns absente of the database
    ElseIf number_of_column > number_of_column_in_the_database Then
            MsgBox "There is more columns in the sheet Nuevos informaciones than in the database." & Chr(10) & "Please, delete the columns absente of the database."
     
    'begin the updating'
    Else: creationtable
    creationbase
     
    End If
     
    End Sub
    Les valeurs sont par ailleurs respectivement 18, 55, 657 et 55.

    J'ai rajouté le point à cells et sa marche niquel maintenant
    Le pb d'erreur était uniquement du à un pb de feuille active mal renseigné je pense.
    Ce qui est étonnant (cest pas la 1ère fois) c'est que la ligne surligné en jaune n'est pas ligne qui comprend l'erreur !

    Concernant ta demande "debug puis passe le curseur sur les 2 variables" je n'ai pas réussi. J'ai bien un onglet debogage mais après quand je clique sur compiler il bug et quand je clique sur compiler pas à pas il ne se passe rien...

    Theze, j'ai implanté ta méthode pour remplir le tableau sans faire de boucle et de nouveau sa bug. Sa me renvoi "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)
    Le code général étant (déclaration en début de module de Public testt() ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
     
    With Sheets("BASE TOTAL")
     
    ReDim testt(number_of_line_in_the_database - 3, number_of_column_in_the_database - 1)
     
        'en partant de A3
        testt = .Range(cells(3, 1), cells(number_of_line_in_the_database, number_of_column_in_the_database))
     
    End With
     
    End Sub

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    pour le débogage inspire toi du tutoriel

    Le débogage sous Visual Basic 6, par DarkVader
    Le débogage sous Visual Basic 6, par DarkVader

    c'est le même principe en VBA .. lorsqu'une erreur apparaît tu appuis sur continuer et tu peu ensuite voir la valeur de tes variables en passant le curseur dessus...

  11. #11
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    Finalement sa ne marche pas bbil. J'ai supprimé les MsgBox que j'avais mis après avoir rajouté le point pour vérifier que cela marche et de nouveau sa me renvoit la même erreur (erreur 9) au meme endroit (redim).
    Comme je disais, l'erreur apparait ponctuellement sans raison.

    Est ce que vous voulez le code en entier ?

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    essai tout d'abord de vérifier que tes 2 variables number_of_.... sont bien initialisé , lorsque le problème arrive clique sur le bouton "Debug" de la fenêtre qui te signale l'erreur 9 , puis passe le curseur de la souris sur les deux variables dans ton code histoire de contrôler leur valeurs.

  13. #13
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    Je compile et sa bug. Ensuite, dans la procédure ou je calcule les valeurs de number_of, il me renvoit bien les bonnes valeurs avec un MsgBox et ensuite en mettant la flèche de la souris dessus.

    Par contre, la procédure suivante ou je rempli le tableau table, lorsque je met la fleche de la souris sur number_of, rien n'est indiqué quant à la valeur...

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par forum2015 Voir le message
    Je compile et sa bug.
    ???



    Citation Envoyé par forum2015 Voir le message
    je met la fleche de la souris sur number_of, rien n'est indiqué quant à la valeur...
    la fenêtre apparait "vide" ..?

    tu as peu-être un problème de déclaration de variable .. as tu placé en haut de toutes tes pages de codes la ligne "Option Explicit" qui devrait être obligatoire pour les débutants... (ou pour les pros qui manquent de rigueur..)

  15. #15
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    J'ai utilisé le debug en mode pas à pas en rajoutant la création de 2 variables pour voir si elles apparaissent dans la fenetre des variables locales.

    Tout d'abord, les 1ere procedures fontionnent très bien. Le bug semble venir avec la procédure creationtable.

    J'ai rajouté une variable (integer) juste avant le lancement de la procédure creationtable. J'ai rajouté une autre variable (integer) juste après le lancement de la procédure creationtable.

    La 1ere variable est bien repéré, pas la 2nd. Ce qui signifie qu'excel bug dès le lancement de creationtable, il ne fait strictement rien dès le départ de cette procédure...


    D'ailleurs, l'erreur a maintenant changé. Il ne me renvoit plus erreur 9 mais "erreur de compilation : variable non définie" en surlignant en jaune Sub creationtable et en surlignant en blue la variable j de la boucle for.

    Pour rappel mon 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
    61
    62
    63
    64
    65
    66
    67
     
    Option Explicit
    Dim number_of_column As Integer
    Dim number_of_line As Integer
    Dim number_of_column_in_the_database As Integer
    Dim number_of_line_in_the_database As Integer
    Dim positioncolumn As Long
    Dim positioncolumndatabase As Long
    Dim positiondoctor As Integer
    Dim positiondoctordatabase As Integer
    Public base()
    Public table()
     
    'Decide if the update is feasible or not
    Sub updatefeasible()
     
    'Number of lines and columns in the database
    With Sheets("BASE TOTAL")
            number_of_line_in_the_database = .Range("A" & Rows.Count).End(xlUp).Row
            number_of_column_in_the_database = .cells(2, Columns.Count).End(xlToLeft).Column
     
    End With
     
    'Number of lines and columns in the sheet Nuevos informaciones
    With Sheets("Nuevos informaciones")
            number_of_line = .Range("A" & Rows.Count).End(xlUp).Row
            number_of_column = .cells(2, Columns.Count).End(xlToLeft).Column
     
    End With
     
    'If they are no lines in the sheet, send message of error
    If number_of_line < 3 Then
    MsgBox "Error : There is no data in the sheet Nuevos informaciones"
     
    'If they are more column in the new sheet than in the database, ask for deleting the columns absente of the database
    ElseIf number_of_column > number_of_column_in_the_database Then
            MsgBox "There is more columns in the sheet Nuevos informaciones than in the database." & Chr(10) & "Please, delete the columns absente of the database."
     
     
    'begin the updating'
    Else:
    'variable test
    Dim variablezero As Integer
    creationtable
     
    End If
     
    End Sub
     
    'procedure which copies the new sheet in a tab, called table, so as to reduce the time of calcul
    Sub creationtable()
     
    With Sheets("Nuevos informaciones")
     
    'variable test
    Dim variableun As Integer
     
    ReDim table(number_of_line - 3, number_of_column - 1)
            For j = 0 To number_of_column - 1
                For i = 0 To number_of_line - 3
                    table(i, j) = .cells(i + 3, j + 1)
                Next i
            Next j
     
    End With
     
    End Sub

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par forum2015 Voir le message
    ... mais "erreur de compilation : variable non définie" en surlignant en jaune Sub creationtable et en surlignant en blue la variable j ...
    et bien le message est clair non tu n'as pas déclaré ta variable J , il faut déclarer toutes les variables , rajoute dans ta procédure créationTable la ligne

    ce n'est surement pas la cause de ton problème mais commence par corriger toutes les erreurs visibles avant de chercher l'erreur cachée qui te cause problème...

  17. #17
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    Effectivement les boucles tournent si on déclare les variables des 2 boucles (i et j). Etonnant quand même car je pensais que dans le cas d'une boucle, ce n'était pas la peine de déclarer la variable de la boucle...

    Mais du coup l'erreur suivante est de nouveau l'erreur 9 concernant le ReDim :p
    Sachant, qu'avec des messages box, j'ai vérifié qu'excel va bien jusqu'au ReDim mais il bloque à ce moment précis.

    Merci pour ton aide bbil

    Tiens d'un coup sa marche. J'ai fait le mode pas à pas et j'ai pu faire toute les boucles. Le programme a compilé entièrement, mais l'erreur va revenir. C'est ponctuel, c'est sa que je ne comprend pas...

    Et avec la solution de Therez qui consiste à ne pas utiliser de boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table = .Range(cells(3, 1), cells(number_of_line, number_of_column))
    Dans tous les cas j'ai l'erreur avec le redim qui apparait !

  18. #18
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par forum2015 Voir le message
    ...
    Dans tous les cas j'ai l'erreur avec le redim qui apparait !
    et j'attends toujours que tu nous dise les valeurs de tes 2 fameuses variables au moment de ton erreur ...

  19. #19
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    En mode pas à pas, avec la fenetre des variables j'ai :
    number_of_line = 18
    number_of_column = 55
    number_of_line_in_the_database = 55
    number_of_column_in_the_database = 657

    Et quand je met le pointeur de la souris sur ces variables dans le redim, j'ai bien les meme valeurs. Mais la sa compile, alors qu'il y a 10 min sa compilait pas...

  20. #20
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    J'ai essayé à plusieurs reprises ce week-end de compiler et je n'ai plus d'erreurs. Donc on va dire que tout va bien dans le meilleur des mondes actuellement.

    Si je puis me permettre, j'aurais une nouvelle question

    Voici la situation d'usage (simplifiée)

    Je dispose d'une feuille excel "Feuil1". Je crée un table monodimensionnel (appelé table, attention il ne s'agit pas d'un tableau excel qui apparait à l'écran mais bien d'un table contenant tout plein de variables) dans lequel je copie l'ensemble des données de la Feuil1 afin de diminuer par la suite le temps de calcul.
    Mon but ici est de déterminer les champs vides de caractères de mon table.
    Je voudrais rédiger un code du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
     
    For i = 0 to derniereLigneDuTable
    'If table(i,0) est vide then
    'procedure...
    Else
    'procedure...
    End If
    Next i
     
    End Sub
    Ce qui m'intéresse, c'est comment écrire en VBA la condition "If table(i,0) est vide". Car je n'arrive pas actuellement à utiliser les fonctions LIKE "*" ou IsEmpty avec un champ d'un tableau (apparemment, cela ne marche qu'avec des chaines de caractères ou des range).

    Merci à ceux qui m'aideront

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 16h37
  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, 14h41
  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, 19h47
  4. Réponses: 2
    Dernier message: 05/08/2009, 16h08
  5. Réponses: 5
    Dernier message: 22/12/2008, 10h20

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