Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/01/2012, 16h51   #1
Nouveau Membre du Club
 
Inscription : octobre 2011
Messages : 106
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 106
Points : 38
Points : 38
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 :
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 :
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 :
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
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 18h14   #2
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 874
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 874
Points : 10 740
Points : 10 740
Envoyer un message via MSN à jpcheck
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 :
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 :
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
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 12h02   #3
Nouveau Membre du Club
 
Inscription : octobre 2011
Messages : 106
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 106
Points : 38
Points : 38
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 :
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 :
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.
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 13h04   #4
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 874
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 874
Points : 10 740
Points : 10 740
Envoyer un message via MSN à jpcheck
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)
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 13h25   #5
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 695
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 695
Points : 1 447
Points : 1 447
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.
gFZT82 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 13h29   #6
Nouveau Membre du Club
 
Inscription : octobre 2011
Messages : 106
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 106
Points : 38
Points : 38
ok merci à jpcheck et gFZT82,

j'ai suivi les conseils de jpcheck et ça marche cette fois merci
Code :
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
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h42.


 
 
 
 
Partenaires

Hébergement Web