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 :

Problème de déclaration de variables types [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Par défaut Problème de déclaration de variables types
    Bonjour à tous,

    je rencontre un petit souci, j'ai voulu clarifier un code en déclarant des variables publiques. Cela a marché sauf sur une procédure qui ne marche plus comme avant sans que cela ait un rapport avec les variables déclarées en "public". je mets le code qui marchait avant et celui qui ne marche plus maintenant.

    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
    Sub A_infosdevis()
     
    Num_Fact = Range("F19").Value
        Date_Fact = Range("L5").Value
            Nom_client = Range("J13").Value
                Montant_DevisHT = Range("M57").Value
                    Montant_DevisTTC = Range("M59").Value
                Indice_Devis = Range("G19").Value
             Nom_Chantier = Range("H21").Value
        Nb_Pierre = Range("F21").Value
     Cub1 = Range("P23").Value
     Cub2 = Range("P24").Value
     Cub3 = Range("P25").Value
     Cub4 = Range("P26").Value
     Cub5 = Range("P27").Value
     
    Application.Workbooks.Open "C:\Users\tpomies\Desktop\VBA\Atest\Testcc2011.xlsm"
     
    Sheets("Pilote").Activate
        Range("A3").Select
    If Range("A4").Value <> "" Then ActiveCell.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
     
            ActiveCell.Value = Num_Fact
          ActiveCell.Offset(0, 1).Value = Date_Fact
          ActiveCell.Offset(0, 2).Value = Indice_Devis
          ActiveCell.Offset(0, 7).Value = Nom_client
          ActiveCell.Offset(0, 8).Value = Nom_Chantier
          ActiveCell.Offset(0, 9).Value = Montant_DevisHT
          ActiveCell.Offset(0, 14).Value = Nb_Pierre
          ActiveCell.Offset(0, 17).Value = Cub1
          ActiveCell.Offset(0, 18).Value = Cub2
          ActiveCell.Offset(0, 19).Value = Cub3
          ActiveCell.Offset(0, 20).Value = Cub4
          ActiveCell.Offset(0, 21).Value = Cub5
     
     
     
     
    Call Hyperlink
     
    Dim Wbs As Workbook
    Set Wbs = Workbooks("Testcc2011.xlsm")
    Wbs.Activate
     
    Wbs.Saved = False
     
    Application.DisplayAlerts = True
     
    Wbs.Close
     
     
    End Sub
    Sur cette procédure le fait de ne pas déclarer un type aux variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Num_Fact = Range("F19").Value
        Date_Fact = Range("L5").Value
            Nom_client = Range("J13").Value
                Montant_DevisHT = Range("M57").Value
                    Montant_DevisTTC = Range("M59").Value
                Indice_Devis = Range("G19").Value
             Nom_Chantier = Range("H21").Value
        Nb_Pierre = Range("F21").Value
     Cub1 = Range("P23").Value
     Cub2 = Range("P24").Value
     Cub3 = Range("P25").Value
     Cub4 = Range("P26").Value
     Cub5 = Range("P27").Value
    ne pose aucun souci

    Et le problème dans la nouvelle procédure (qui est quasi la même ) est qu'il m'écrit erreur de compilation "Variable non définie"
    Je ne comprends pas pourquoi. De plus quand je déclare les types single il me fait une erreurs si la valeur de la cellule est vide ("") a-t-on un moyen de contourner ça?

    merci aux courageux qui pourraient m'aider .

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Sub A_infosdevis()
     
     
    'Dim Montant_DevisHT As Single
    'Dim Montant_DevisTTC As Single
    'Dim Indice_Devis As String, Cub1 As Single, Cub2 As Single, Cub3 As Single
    'Dim Cub4 As Single, Cub5 As Single, Poidspart1 As Single, Poidspart2 As Single
    'Dim Poidspart3 As Single, Poidspart4 As Single
    'Dim Poidspart5 As Single, PoidsTotal As Single
    'Dim NbrePal As Single
    'Dim TVA1 As String, TVA2 As String
     
    Dim lhts As Integer
    Dim Rhts As Range
    Dim Plagex As Range
    Dim MDevisHT As Single
    Dim MDevisTTC As Single
    Dim a As Range
    Dim la As Integer
     
    Const xcolht = 13
     
     ThisWorkbook.Worksheets("Devis").Activate
     
    Set Plagex = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
     
    For Each Rhts In Plagex
        If Rhts.Value = "Totalht" Then
            lhts = Rhts.Row
            End If
            Next
     
     MDevisHT = Worksheets("Devis").Cells(lhts, xcolht).Value
     MDevisTTC = Worksheets("Devis").Cells((lhts + 2), xcolht).Value
     
    Num_Fact = Range("F19").Value
        Date_Fact = Range("L5").Value
            Nom_client = Range("J13").Value
                Montant_DevisHT = MDevisHT  'Erreur de compilation variable non définie
                    Montant_DevisTTC = MDevisTTC
                Indice_Devis = Range("G19").Value
             Nom_Chantier = Range("H21").Value
        Nb_Pierre = Range("F21").Value
     Cub1 = Range("P23").Value
     Cub2 = Range("P24").Value
     Cub3 = Range("P25").Value
     Cub4 = Range("P26").Value
     Cub5 = Range("P27").Value
    Poidspart1 = Range("Q23").Value
    Poidspart2 = Range("Q24").Value
    Poidspart3 = Range("Q25").Value
    Poidspart4 = Range("Q26").Value
    Poidspart5 = Range("Q27").Value
    PoidsTotal = Range("R23").Value
    NbrePal = Range("O20").Value
    TVA1 = Range("S23").Value
    TVA2 = Range("T23").Value
     
    Application.Workbooks.Open "Z:\Gestion entreprise\VBA\Atest\CC2011T.xlsx"
     
    Sheets("Pilote").Activate
     
        Range("A3").Select
    If Range("A4").Value <> "" Then ActiveCell.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
     
            ActiveCell.Value = Num_Fact
          ActiveCell.Offset(0, 1).Value = Date_Fact
          ActiveCell.Offset(0, 2).Value = Indice_Devis
          ActiveCell.Offset(0, 7).Value = Nom_client
          ActiveCell.Offset(0, 8).Value = Nom_Chantier
          ActiveCell.Offset(0, 9).Value = Montant_DevisHT
          ActiveCell.Offset(0, 14).Value = Nb_Pierre
          ActiveCell.Offset(0, 17).Value = Cub1
          ActiveCell.Offset(0, 18).Value = Cub2
          ActiveCell.Offset(0, 19).Value = Cub3
          ActiveCell.Offset(0, 20).Value = Cub4
          ActiveCell.Offset(0, 21).Value = Cub5
          ActiveCell.Offset(0, 35).Value = Poidspart1
          ActiveCell.Offset(0, 36).Value = Poidspart2
          ActiveCell.Offset(0, 37).Value = Poidspart3
          ActiveCell.Offset(0, 38).Value = Poidspart4
          ActiveCell.Offset(0, 39).Value = Poidspart5
          ActiveCell.Offset(0, 40).Value = PoidsTotal
          ActiveCell.Offset(0, 41).Value = NbrePal
          ActiveCell.Offset(0, 42).Value = TVA1
          ActiveCell.Offset(0, 43).Value = TVA2
     
     
    Call Hyperlink
     
    Sheets("Pilote1").Activate
    Range("A3").Select
    If Range("A4").Value <> "" Then ActiveCell.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
     
            ActiveCell.Value = Num_Fact
          ActiveCell.Offset(0, 1).Value = Date_Fact
          ActiveCell.Offset(0, 2).Value = Indice_Devis
          ActiveCell.Offset(0, 7).Value = Nom_client
          ActiveCell.Offset(0, 8).Value = Nom_Chantier
          ActiveCell.Offset(0, 9).Value = Montant_DevisHT
          ActiveCell.Offset(0, 14).Value = Nb_Pierre
          ActiveCell.Offset(0, 17).Value = Cub1
          ActiveCell.Offset(0, 18).Value = Cub2
          ActiveCell.Offset(0, 19).Value = Cub3
          ActiveCell.Offset(0, 20).Value = Cub4
          ActiveCell.Offset(0, 21).Value = Cub5
          ActiveCell.Offset(0, 35).Value = Poidspart1
          ActiveCell.Offset(0, 36).Value = Poidspart2
          ActiveCell.Offset(0, 37).Value = Poidspart3
          ActiveCell.Offset(0, 38).Value = Poidspart4
          ActiveCell.Offset(0, 39).Value = Poidspart5
          ActiveCell.Offset(0, 40).Value = PoidsTotal
          ActiveCell.Offset(0, 41).Value = NbrePal
          ActiveCell.Offset(0, 42).Value = TVA1
          ActiveCell.Offset(0, 43).Value = TVA2
     
    Call Hyperlink1
     
    Set wbs = Workbooks("CC2011T.xlsx")
    wbs.Activate
     
    wbs.Saved = False
     
    Application.DisplayAlerts = True
     
    wbs.Close
     
    End Sub

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Hello,

    si je puis me permettre une remarque, je trouve que le recours à une variable pour chaque re-copie me parait etre une peu superflue.

    Il s'agirait selon moi de passer directement d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Date_Fact as Date 'inexistant dans ton code
    Date_Fact = Range("L5").Value
    ActiveCell.Offset(0, 1).Value = Date_Fact
    à un plus prosaique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Offset(0, 1).Value = Range("L5").Value
    2 points sur lesquels j'attire ton attention:
    - etre plus carré sur les utilisations de Range, en specifiant a chaque fois si necessaire le workbook et la worksheet dans laquelle on souhaite utiliser le range
    - l'utilisation de ActiveCell peut poser problème en cas de clic de ton utilisateur en cours de manipulation
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Par défaut Merci pour la réponse
    Bonjour jpCheck,

    merci pour ta réponse. Je comprends ce que tu me dis. Ma question demeure pourquoi cela ne fonctionne plus(car avant que je chamboule tout en voulant déclarer des variables en Public pour clarifier l'ensemble des procédures (je ne sais pas ce qui m'a pris ) cela marchait sans avoir à déclarer les types)?

    Maintenant :
    Num_Fact, Date_Fact, Nom_client sont déclarées en Public X as String en Option explicit.

    ça coince à partir de Montant_DevisHT Jusqu'à TVA2 (c'est ça qui est nouveau) il me demande de les déclarer en variables. bon je vois pas pourquoi maintenant et pas avant j'ai essayer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Thisworkbook.worksheets("Devis")
    Num_Fact = Range("F19").Value
        Date_Fact = Range("L5").Value
            Nom_client = Range("J13").Value
                Montant_DevisHT = Range("M57").Value
                    Montant_DevisTTC = Range("M59").Value
                Indice_Devis = Range("G19").Value
             Nom_Chantier = Range("H21").Value
        Nb_Pierre = Range("F21").Value
    ' etc.
    End with
    Mais cela ne change rien

    alors j'ai tous déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Dim Montant_DevisHT As Single
    'Dim Montant_DevisTTC As Single
    'Dim Indice_Devis As String, Cub1 As Single, Cub2 As Single, Cub3 As Single
    'Dim Cub4 As Single, Cub5 As Single, Poidspart1 As Single, Poidspart2 As Single
    'Dim Poidspart3 As Single, Poidspart4 As Single
    'Dim Poidspart5 As Single, PoidsTotal As Single
    'Dim NbrePal As Single
    'Dim TVA1 As String, TVA2 As String
    Le nouveau problème qui est apparu (qui n'est pas un gros problème mais c'était mieux quand y en avait pas) est que le type ne supporte visiblement pas les cellules vide ("")
    Alors ça m'embète faut que je fasse des conversion de nombre avec le format et tout et tout ce qui n'était pas nécessaire avec ma version brouillon.
    Bon enfin si quelqu'un comprend pourquoi je rencontre ce problème et qu'il a l'amabilité de m'expliquer je le remercie d'avance.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    On appelle cela du blindage de saisie

    Si un utilisateur peut oublier une valeur dans un formulaire/feuille, il faut pouvoir lui indiquer qu'une valeur doit etre entrée, ou alors forcer par le code la valeur (si vide alors 0)
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    L’instruction « Option Explicit » impose la déclaration explicite de toutes les variables.
    Si tu ne connais pas le type de ta variable, tu peux utiliser le type variant.
    (ou Dim x puisque le type variant est le type par défaut).

    Cordialement.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Par défaut
    ok merci à jpcheck et gFZT82,

    j'ai suivi les conseils de jpcheck et ça marche cette fois merci
    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
     
            ActiveCell.Value = Num_Fact
          ActiveCell.Offset(0, 1).Value = Date_Fact
          ActiveCell.Offset(0, 2).Value = Indice_Devis
          ActiveCell.Offset(0, 7).Value = Nom_client
          ActiveCell.Offset(0, 8).Value = Nom_Chantier
          ActiveCell.Offset(0, 9).Value = MDevisHT
          ActiveCell.Offset(0, 14).Value = ThisWorkbook.Worksheets("Devis").Range("F21").Value 'Nbre Pierre
          ActiveCell.Offset(0, 17).Value = ThisWorkbook.Worksheets("Devis").Range("P23").Value 'Cub1
          ActiveCell.Offset(0, 18).Value = ThisWorkbook.Worksheets("Devis").Range("P24").Value 'Cub2
          ActiveCell.Offset(0, 19).Value = ThisWorkbook.Worksheets("Devis").Range("P25").Value 'Cub3
          ActiveCell.Offset(0, 20).Value = ThisWorkbook.Worksheets("Devis").Range("P26").Value 'Cub4
          ActiveCell.Offset(0, 21).Value = ThisWorkbook.Worksheets("Devis").Range("P27").Value 'Cub5
          ActiveCell.Offset(0, 35).Value = ThisWorkbook.Worksheets("Devis").Range("Q23").Value 'Poidspart1
          ActiveCell.Offset(0, 36).Value = ThisWorkbook.Worksheets("Devis").Range("Q24").Value 'Poidspart2
          ActiveCell.Offset(0, 37).Value = ThisWorkbook.Worksheets("Devis").Range("Q25").Value 'Poidspart3
          ActiveCell.Offset(0, 38).Value = ThisWorkbook.Worksheets("Devis").Range("Q26").Value 'Poidspart4
          ActiveCell.Offset(0, 39).Value = ThisWorkbook.Worksheets("Devis").Range("Q27").Value 'Poidspart5
          ActiveCell.Offset(0, 40).Value = ThisWorkbook.Worksheets("Devis").Range("R23").Value 'PoidsTotal
          ActiveCell.Offset(0, 41).Value = ThisWorkbook.Worksheets("Devis").Range("O20").Value 'NbrePal
          ActiveCell.Offset(0, 42).Value = ThisWorkbook.Worksheets("Devis").Range("S23").Value 'TVA1
          ActiveCell.Offset(0, 43).Value = ThisWorkbook.Worksheets("Devis").Range("T23").Value 'TVA2

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

Discussions similaires

  1. Problème à la déclaration d'un type local
    Par Tchaill39 dans le forum Langage
    Réponses: 5
    Dernier message: 11/09/2007, 14h46
  2. [Configuration] Problème de déclaration de variable en php5
    Par domray dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/04/2007, 01h22
  3. problème d'overflow avec variable type double
    Par ben83 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 15/02/2007, 09h55
  4. Réponses: 8
    Dernier message: 03/11/2006, 15h55
  5. Réponses: 1
    Dernier message: 27/07/2005, 17h08

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