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 05/12/2011, 13h26   #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 copier avec le même format de cellules

Bonjour à toutes et à tous,

J'ai le code ci dessous qui copie la valeur de cellules d'un classeur dans un autre, cependant le format source (format nombre à 3 décimales) n'est pas conservé et il est transformé en format texte dans le classeur de destination qu'elqu'un peut il me dire pourquoi? j'ai essayé le code formatNum "0.00" ça n'a pas marché
merci d'avance
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
Sub envoiprod()
    Dim wsDevis As Worksheet
    Dim wbArchive As Workbook
    Dim wsArchive As Worksheet
 
    Set wsDevis = ThisWorkbook.Worksheets("Devis")
    Set wbArchive = Workbooks.Open("C:\Users\tpomies\Desktop\VBA\TabProd.xlsx")
    Set wsArchive = wbArchive.Worksheets("Ptour")
 
    Dim premiereLigneVide As Integer
    premiereLigneVide = wsArchive.Cells(wsArchive.Rows.Count, 1).End(xlUp).Row + 1
 
    Dim Num_Fact As String
    Dim Nom_client As String
    Dim Nom_Chantier As String
    Dim Nb_Pierre As Integer
    Dim Reference_Produit As String
    Dim Qualité As String
    Dim Longueur As String
    Dim Epaisseur As String
    Dim Hauteur As String
    Dim Quantité As String
    'Dim Volume As String
 
 
    Num_Fact = wsDevis.Range("F19").Value
    Nom_client = wsDevis.Range("J13").Value
    Nom_Chantier = wsDevis.Range("H21").Value
    Nb_Pierre = wsDevis.Range("F21").Value
 
 
    Dim iRow As Integer
 
    For iRow = PREMIERE_LIGNE To DERNIERE_LIGNE
        If wsDevis.Cells(iRow, 1).Value <> 0 Then
            Reference_Produit = wsDevis.Cells(iRow, 3).Value
            Selection.NumberFormat = "0.000"
            Qualité = wsDevis.Cells(iRow, 2).Value
            Selection.NumberFormat = "0.000"
            Longueur = wsDevis.Cells(iRow, 4).Value
            Selection.NumberFormat = "0.000"
            Epaisseur = wsDevis.Cells(iRow, 5).Value
            Selection.NumberFormat = "0.000"
            Hauteur = wsDevis.Cells(iRow, 6).Value
            Selection.NumberFormat = "0.000"
            Quantité = wsDevis.Cells(iRow, 7).Value
            Selection.NumberFormat = "0.0"
            'Volume = wsDevis.Cells(iRow, 10).Value
 
 
            wsArchive.Cells(premiereLigneVide, 1).Value = Num_Fact
            wsArchive.Cells(premiereLigneVide, 2).Value = Nom_client
            wsArchive.Cells(premiereLigneVide, 3).Value = Nom_Chantier
            wsArchive.Cells(premiereLigneVide, 4).Value = Nb_Pierre
            wsArchive.Cells(premiereLigneVide, 7).Value = Qualité
            wsArchive.Cells(premiereLigneVide, 8).Value = Reference_Produit
            wsArchive.Cells(premiereLigneVide, 9).Value = Longueur
            wsArchive.Cells(premiereLigneVide, 10).Value = Epaisseur
            wsArchive.Cells(premiereLigneVide, 11).Value = Hauteur
            wsArchive.Cells(premiereLigneVide, 12).Value = Quantité
 
            'wsArchive.Cells(premiereLigneVide, 13).Value = Volume
 
 
 
            premiereLigneVide = premiereLigneVide + 1
        End If
    Next iRow
    wbArchive.Saved = False
    wbArchive.Close
End Sub
Longueur, épaisseur ect doivent être en format nombre.
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 13h35   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
bonjour,
il faut éviter d'utiliser l'objet selection pour autre chose qu'une interaction (saisie..paramétres.. ) avec l'utilisateur..

de plus applique ton format de cellule directement à la cellule destination

Code :
 wsArchive.Cells(premiereLigneVide, 9).NumberFormat = "0.0"
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 13h36   #3
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Peut-être :

Code :
1
2
3
4
    For iRow = PREMIERE_LIGNE To DERNIERE_LIGNE
        If wsDevis.Cells(iRow, 1).Value <> 0 Then
            Reference_Produit = wsDevis.Cells(iRow, 3).Value
            Reference_Produit.NumberFormat = "0.000"
etc.
au lieu de :

Code :
1
2
3
4
    For iRow = PREMIERE_LIGNE To DERNIERE_LIGNE
        If wsDevis.Cells(iRow, 1).Value <> 0 Then
            Reference_Produit = wsDevis.Cells(iRow, 3).Value
            Selection.NumberFormat = "0.000"
puisque, si j'ai bien lu, tu sélectionnes rien (et c'est bien !).
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 05/12/2011, 14h25   #4
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 693
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 693
Points : 1 445
Points : 1 445
Bonjour,

Pour appliquer le format voulu dans le classeur de destination, tu peux utiliser la forme
Code :
wsArchive.Cells(premiereLigneVide, 8).Value = Format(Reference_Produit, "0.000")
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 05/12/2011, 16h49   #5
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 ok merci

ok merci à tous
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 21h11   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
@ gfzt82 :

La fonction "Format" renvoie une chaîne texte, ce qui n'est peut-être pas approprié, dans ce cas (c'est l'équivalent de la fonction Excel "TEXTE").
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 22h35   #7
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 693
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 693
Points : 1 445
Points : 1 445
@ Daniel.C

Bien vu !
Effectivement, c'est une boulette ...

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 13h13   #8
Nouveau Membre du Club
 
Inscription : octobre 2011
Messages : 106
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 106
Points : 38
Points : 38
bonjour à tous et merci de votre sollicitude.

J'ai essayé toutes vos solutions et malheureusement aucune n'a fonctionnée
la méthode DanielC donne une erreur de compilation : erreur de qualificateur,
la méthode Bbil ne change rien.
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
Option Explicit
 
Private Const PREMIERE_LIGNE = 23
Private Const DERNIERE_LIGNE = 54
 
Sub envoiprod()
    Dim wsDevis As Worksheet
    Dim wbArchive As Workbook
    Dim wsArchive As Worksheet
 
    Set wsDevis = ThisWorkbook.Worksheets("Devis")
    Set wbArchive = Workbooks.Open("C:\Users\tpomies\Desktop\VBA\TabProd.xlsx")
    Set wsArchive = wbArchive.Worksheets("Ptour")
 
    Dim premiereLigneVide As Integer
    premiereLigneVide = wsArchive.Cells(wsArchive.Rows.Count, 1).End(xlUp).Row + 1
 
    Dim Num_Fact As String
    Dim Nom_client As String
    Dim Nom_Chantier As String
    Dim Nb_Pierre As Integer
    Dim Reference_Produit As String
    Dim Qualité As String
    Dim Longueur As String
    Dim Epaisseur As String
    Dim Hauteur As String
    Dim Quantité As String
    'Dim Volume As String
 
 
    Num_Fact = wsDevis.Range("F19").Value
    Nom_client = wsDevis.Range("J13").Value
    Nom_Chantier = wsDevis.Range("H21").Value
    Nb_Pierre = wsDevis.Range("F21").Value
 
 
    Dim iRow As Integer
 
    For iRow = PREMIERE_LIGNE To DERNIERE_LIGNE
        If wsDevis.Cells(iRow, 1).Value <> 0 Then
            Reference_Produit = wsDevis.Cells(iRow, 3).Value
 
            Qualité = wsDevis.Cells(iRow, 2).Value
 
            Longueur = wsDevis.Cells(iRow, 4).Value
 
            Epaisseur = wsDevis.Cells(iRow, 5).Value
 
            Hauteur = wsDevis.Cells(iRow, 6).Value
 
            Quantité = wsDevis.Cells(iRow, 7).Value
 
            'Volume = wsDevis.Cells(iRow, 10).Value
 
 
            wsArchive.Cells(premiereLigneVide, 1).Value = Num_Fact
            wsArchive.Cells(premiereLigneVide, 2).Value = Nom_client
            wsArchive.Cells(premiereLigneVide, 3).Value = Nom_Chantier
            wsArchive.Cells(premiereLigneVide, 4).NumberFormat = "0.0"
            wsArchive.Cells(premiereLigneVide, 4).Value = Nb_Pierre
            wsArchive.Cells(premiereLigneVide, 7).NumberFormat = "0.0"
            wsArchive.Cells(premiereLigneVide, 7).Value = Qualité
 
            wsArchive.Cells(premiereLigneVide, 8).Value = Reference_Produit
 
            wsArchive.Cells(premiereLigneVide, 9).NumberFormat = "0.000"
            wsArchive.Cells(premiereLigneVide, 9).Value = Longueur
 
            wsArchive.Cells(premiereLigneVide, 10).NumberFormat = "0.000"
            wsArchive.Cells(premiereLigneVide, 10).Value = Epaisseur
 
            wsArchive.Cells(premiereLigneVide, 11).NumberFormat = "0.000"
            wsArchive.Cells(premiereLigneVide, 11).Value = Hauteur
 
            wsArchive.Cells(premiereLigneVide, 12).NumberFormat = "0.000"
            wsArchive.Cells(premiereLigneVide, 12).Value = Quantité
 
            'wsArchive.Cells(premiereLigneVide, 13).Value = Volume
 
 
 
            premiereLigneVide = premiereLigneVide + 1
        End If
    Next iRow
    wbArchive.Saved = False
    wbArchive.Close
End Sub
Pour être plus clair je mets en pièces jointes le classeur de destinationTabProd.xlsx

Merci pour votre aide.
tompom3108 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 16h08   #9
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Bonjour,

essai d'inverser les deux lignes :
Code :
1
2
            wsArchive.Cells(premiereLigneVide, 9).NumberFormat = "0.000"
            wsArchive.Cells(premiereLigneVide, 9).Value = Longueur
applique le format après avoir affecté la valeur...

Code :
1
2
3
 
            wsArchive.Cells(premiereLigneVide, 9).Value = Longueur
            wsArchive.Cells(premiereLigneVide, 9).NumberFormat = "0.000"
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/12/2011, 17h24   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 693
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 693
Points : 1 445
Points : 1 445
Bonjour,

Il faut que tu modifies le type de variable dans la partie déclaration

Code :
1
2
3
4
5
6
    Dim Reference_Produit As String
    Dim Qualité As Single
    Dim Longueur As Single
    Dim Epaisseur As Single
    Dim Hauteur As Single
    Dim Quantité As Single
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 07h50   #11
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 ok

D'accord avec les variables As Single ça marche, merci beaucoup gFZT82
et bBil à plus
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 15h28.


 
 
 
 
Partenaires

Hébergement Web