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 :

PB erreur variant ou object


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Par défaut PB erreur variant ou object
    Bonjour à tous,

    bébutant en VBA, j'ai fait un programme et il bug à un endroit mais je ne comprend pas sa remarque la voici : "un appel de fonction dans la partie gauche de l'affectation doit renvoyer variant ou object" au niveau de la partie en rouge
    Pouvez-vous m'eclairer et me donner des pistes possibles Merci
    voici le code en VBA 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
    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
    Private Sub IDENTIFICATION_Click()
     
    Dim nblivreretard, nbjourretard As Integer
    Dim i, j, dureeretard As Integer
    Dim dateretour As Date
    Dim error As Boolean
     
     
    Sheets("stocklivre").Select
    Call statut 'module de traitement de l'état du doc
     
    'macro pour déterminer le retard si il existe des clients
     
    Sheets("Stocklivre").Select
     
    i = 2
    Do While (Worksheets("stocklivre").Cells(i, 1) <> "")
    dateretour = CDate(Cells(i, "G"))
        If Cells(i, "E") = "Emprunté" And dateretour < Date Then
            dureeretard = Date - dateretour
            Cells(i, "H") = dureeretard
            Cells(i, "H").Select
            Selection.Interior.Color = 255
            Selection.Font.Bold = True
        Else: Cells(i, "H") = ""
        End If
        i = i + 1
    Loop
     
    'utiliser la feuille excel Saisie comme element permettant de faire des recherches dans la base client
    'afin de faire apparaitre certains éléments du profil du client
    'ensuite ouvrir le code d'identification du livre
     
    Sheets("Saisie").Select
     
    If Not (IsNumeric(idclt)) Then
    Unload IDENTIFICATIONCLIENT
    MsgBox ("Le code d'identification du client se compose de 1 à 5 chiffres. Reportez-vous à la carte du client")
    IDENTIFICATIONCLIENT.Show
     
    End If
     
    'formule pour vérifier que le code saisi existe version client
     
    Sheets("base clients").Select
    point1:
    i = 2
    error = False
     
    Do While (Worksheets("base clients").Cells(i, 2) <> "")
        If CInt(idclt.Value) <> CInt(Worksheets("base clients").Cells(i, 1).Value) Then
        error = True
        i = i + 1
        End If
     
    Loop
     
    If error = True Then
      MsgBox = "Le code saisi n'existe pas dans la base de donnée. Veuillez en ressaisir un. Merci"[/COLOR][/B]Endif
     If= 1 Then GoTo point1
     
     
    Sheets("saisie").Select
    Range("B3").Value = IDENTIFICATIONCLIENT.idclt.Value

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut sianto57 et bonne année à tous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bébutant en VBA, j'ai fait un programme et il bug à un endroit mais je ne comprend pas sa remarque
    Ouais, moi non plus... ni ton sujet
    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
    Private Sub IDENTIFICATION_Click()
     
    Dim nblivreretard As Integer, nbjourretard As Integer
    Dim i As Long, j As Integer, dureeretard As Integer
    Dim dateretour As Date
    Dim error As Boolean
     
    Sheets("stocklivre").Select
    Call statut 'module de traitement de l'état du doc
     
    'macro pour déterminer le retard si il existe des clients
    Sheets("Stocklivre").Select
     
    i = 2
    Do While Cells(i, 1) <> ""
        dateretour = CDate(Cells(i, "G"))
        If Cells(i, "E") = "Emprunté" And dateretour < Date Then
            dureeretard = Date - dateretour
            With Cells(i, "H")
                .Value = dureeretard
                .Interior.Color = 255
                .Font.Bold = True
            End With
        Else
            Cells(i, "H") = ""
        End If
        i = i + 1
    Loop
     
    'utiliser la feuille excel Saisie comme element permettant de faire des recherches dans la base client
    'afin de faire apparaitre certains éléments du profil du client
    'ensuite ouvrir le code d'identification du livre
     
    Sheets("Saisie").Select
     
    If Not (IsNumeric(idclt)) Then
        Unload IDENTIFICATIONCLIENT
        MsgBox ("Le code d'identification du client se compose de 1 à 5 chiffres. Reportez-vous à la carte du client")
        IDENTIFICATIONCLIENT.Show
    End If
     
    'formule pour vérifier que le code saisi existe version client
     
    Sheets("base clients").Select
    point1:
    i = 2
    error = True
    Do While (Worksheets("base clients").Cells(i, 2) <> "")
        If CInt(idclt.Value) = CInt(Worksheets("base clients").Cells(i, 1).Value) Then
            error = False
            i = i + 1
            Exit For
        End If
    Loop
     
    If error = True Then
        MsgBox "Le code saisi n'existe pas dans la base de donnée. Veuillez en ressaisir un. Merci"
        GoTo point1
    End If
     
    Sheets("saisie").Select
    Range("B3") = IDENTIFICATIONCLIENT.idclt.Value
    Le code un peu modifié. Mais regarde les remarques suivantes, ça pourrait aider. Ou précise ton problème.

    Un dépannage, c'est un peu comme reconstruire le code. Mais si on ne sait pas ce qu'il veut dire exactement, on est obligé d'interprêter. Et une interprétation vaut ce qu'elle vaut : de très bonne à "à coté de la plaque".

    Il faut déclarer chaque variable dans son type : dans ta déclaration, nblivreretard, i et j sont déclarés en Variant.

    Pour i : tu t'en sert en variable de ligne => peut atteindre 65536. Dans ce cas, tu dépassera la capacité de Integer. Il faut prendre l'habitude de déclarer en Long pour les variables risquant de dépasser la limite de Integer.
    Pas obligatoire, mais la perte de RAM (2 octets) sera largement compensée par le temps économisé à ne pas rechercher une panne qui peut apparaître des années plus tard, quand tu ne sais plus ce que devait faire le code qui fonctionnaît et que tu n'as pas modifié.

    Personnellement, je ne traite pas les boucle en DO While
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 2
    Do While (Worksheets("stocklivre").Cells(i, 1) <> "")
    j'utiliserai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 2 to Worksheets("stocklivre").Cells(i, 1).end(xldown).row
    Ou plus exactement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 2 to Worksheets("stocklivre").Cells(i, 1).end(xlup).row
    Je ne comprends pas ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Do While (Worksheets("base clients").Cells(i, 2) <> "")
        If CInt(idclt.Value) <> CInt(Worksheets("base clients").Cells(i, 1).Value) Then
        error = True
        i = i + 1
        End If
     
    Loop
     
    If error = True Then
    en admettant que le code correspondant à idcit soit en ligne 3 de Worksheets("base clients") colonne 1
    (perso, je préfère travailler en variable X, ça me semble plus lisible et plus différentiable de 1 que i);
    i=2 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=2+1
    i=3 =>do While... = faux => (idcit<>A3):Faux =>
    i=3 =>do While... = faux => (idcit<>A3):Faux => etc... pas près de finir!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Do While (Worksheets("base clients").Cells(i, 2) <> "")
        If CInt(idclt.Value) <> CInt(Worksheets("base clients").Cells(i, 1).Value) Then
        error = True
        End If
        i = i + 1  
    Loop 
    If error = True Then
    i=2 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=2+1
    i=3 =>do While... = faux => (idcit<>A3):Faux => Error ne change pas => i=3+1
    i=4 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=4+1 etc... : si j'ai 32000 lignes, je les testes, jusqu'à la dernière, alors que mon but (supposé d'après le code) est juste de changer un booléen si idcit apparaît au moins une fois dans la colonne. Je préfère ma méthode qui positionne la variable à Vrai au départ, et que si elle la trouve, elle met à faux avant de sortir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If error = True Then
      MsgBox = "Le code saisi n'existe pas dans la base de donnée. Veuillez en ressaisir un. Merci" Endif
     If= 1 Then GoTo point1
    Je suppose que c'est là l'erreur, le code ne voulant rien dire :
    - MsgBox = C'est erronnée comme syntaxe. MsgBox ("...") ou MsgBox "..."
    - If=1 then : veut pas dire grand chose, manque des éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B3").Value = IDENTIFICATIONCLIENT.idclt.Value
    Me gène : soit tu emploies le nom "informatique" des feuilles, soit tu les désignes par le nom des onglets. Sinon, un jour t'auras une erreur de nom et tu mettras du temps à trouver ta panne.

    Tu utilises beaucoup de Select : on peut généralement les éliminer : ils sont sources de ralentissement et peuvent faire buger la macro en cas de module de classe feuille. Mais n'ayant qu'un extrait de la macro, je ne sais pas s'il n'y a pas un impératif (comme pour le tri).

    Tu te dis débutant en VBA : fais un algo sur une feuille de papier et le faire tourner à la main, pour t'assurer que ton raisonnement est correct.
    Quand tu apprends à conduire, tu ne vas pas directement sur un circuit de compétition. Tu apprends à démarrer, puis à passer la première, puis la seconde avant de commencer à foncer.

    Plus tu donnes moins de données, moins on peut plus t'aider.
    Ne jamais hésiter à se relire et à vérifier que sans le tableau, juste avec le sujet, un extérieur au problème comprendra ce qui bloque. Si trop d'infos tue l'info, pas assez n'autorise que les magiciens et autres devins à tenter de répondre
    A+
    PS
    Bonne et Heureuse Année 2010 à tous

Discussions similaires

  1. appel de fonction dans la partie gauche doit renvoyer variant ou object
    Par dante33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/01/2008, 14h16
  2. Réponses: 1
    Dernier message: 30/08/2007, 14h47
  3. Erreur IFS : Dangling Object AV Cleanup Agent
    Par jf4db dans le forum Administration
    Réponses: 2
    Dernier message: 30/07/2007, 18h01
  4. 8i sur Linux : Erreur loadin shared object file
    Par NGONGO ETABA dans le forum Oracle
    Réponses: 2
    Dernier message: 24/03/2006, 11h40
  5. Réponses: 6
    Dernier message: 15/01/2005, 23h34

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