Concaténer date par VBA

brutor2

XLDnaute Junior
Bonjour à tous,

J'ai un petit souci et j'aurai besoin de votre aide.

C'est surement simple mais je bloque complètement.

J'ai une date dans un classeur source qui est décomposée en 3 colonnes :
Année (colH), Mois (colI), Jour (colJ).
Et je voudrais par VBA recomposer cette date dans un autre classeur dans une seule colonne (colF).

Pour une date j'y arrive en mettant le code :
Code:
wb.Sheets("BD").Range("F2").Value = wbSource.Sheets("Tableau général").Range("J3").Value & "/" & wbSource.Sheets("Tableau général").Range("I3").Value & "/" & wbSource.Sheets("Tableau général").Range("H3").Value

Par contre pour une plage de cellule lorsque je mets :

Code:
wb.Sheets("BD").Range("F2:F2000").Value = wbSource.Sheets("Tableau général").Range("J3:J2001").Value & "/" & wbSource.Sheets("Tableau général").Range("I3:I2001").Value & "/" & wbSource.Sheets("Tableau général").Range("H3:H2001").Value

Cela ne fonctionne pas.

Où est mon erreur ?

Merci de votre attention.

Cordialement

Brutor
 

GBI

XLDnaute Occasionnel
Re : Concaténer date par VBA

Bonjour brutor2,

Un petit fichier avec qlq lignes ainsi que le résultat attendu nous aiderait à mieux t'aider.
Ma connaissance limitée dans les arcanes de VBA m'auraient poussé à utilser une boule plutot qu'un range, mais sans exemple il est difficile de trancher :)
Cdt
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonjour brutor2,

Un petit fichier avec qlq lignes ainsi que le résultat attendu nous aiderait à mieux t'aider.
Ma connaissance limitée dans les arcanes de VBA m'auraient poussé à utilser une boule plutot qu'un range, mais sans exemple il est difficile de trancher :)
Cdt

BonjourGBI, Bonjour le forum,

Voici les fichiers exemples:

les macros sontdans le classeurdestination car le résultat à obtenir se retrouvera dans ce classeur.

La macro essai_Concaterner_une_Cellule() me met bien la date dans la cellule voulue.

Par contre la macro Concaterner_une_Plage() bloque.

Merci de votre aide.

Cordialement.

Brutor
 

Pièces jointes

  • Concatener_date_vba.zip
    32.4 KB · Affichages: 58

Efgé

XLDnaute Barbatruc
Re : Concaténer date par VBA

Bonjour brutor2, GBI,
Une proposition, pas testée, en espérant ne pas m'être emmelé dans les feuilles....
Code:
Sub Concaterner_une_Plage()
[COLOR=seagreen]' Déclaration des variables[/COLOR]
Dim wb As Workbook, wbSource As Workbook
Dim Derligne As Long
 
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
Workbooks.Open Filename:="ClasseurSource.xls"
 
[COLOR=seagreen]' Récupération du nom du classeur[/COLOR]
Set wbSource = ActiveWorkbook
 
wbSource.Activate
Set wb = Workbooks("Classeurdestination.xls")
 
With wbSource.Sheets("Tableau Général")
[COLOR=seagreen]'Pour toute les cellules de la ligne 2 à la dernière utilisée de la feuille[/COLOR] [COLOR=seagreen]Tableau Général[/COLOR]
For i = 2 To .Range("H" & Application.Rows.Count).End(xlUp).Row
   [COLOR=seagreen]'Si la cellule n'est pas vide[/COLOR]
    If .Cells(i, 10).Value <> "" Then
        [COLOR=seagreen]'Trouver la premère cellule non vide de la feuille BD colonne F[/COLOR]
        Derligne = wb.Sheets("BD").Range("F" & Application.Rows.Count).End(xlUp).Row + 1
       [COLOR=seagreen]'On prend les valeurs des cellules et on les copies dans la cellule sur la feuille BD[/COLOR]
        wb.Sheets("BD").Cells(Derligne, 6).Value = .Cells(i, 10).Value & "/" & .Cells(i, 9).Value & "/" & .Cells(i, 8).Value
    End If
Next i
[COLOR=seagreen]'Fermeture du classeur source[/COLOR]
wbSource.Close
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Cordialement
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonjour Efgé,
Bonjour le forum,

Bonjour brutor2, GBI,
Une proposition, pas testée, en espérant ne pas m'être emmelé dans les feuilles....
Code:
Sub Concaterner_une_Plage()
[COLOR=seagreen]' Déclaration des variables[/COLOR]
Dim wb As Workbook, wbSource As Workbook
Dim Derligne As Long
 
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
Workbooks.Open Filename:="ClasseurSource.xls"
 
[COLOR=seagreen]' Récupération du nom du classeur[/COLOR]
Set wbSource = ActiveWorkbook
 
wbSource.Activate
Set wb = Workbooks("Classeurdestination.xls")
 
With wbSource.Sheets("Tableau Général")
[COLOR=seagreen]'Pour toute les cellules de la ligne 2 à la dernière utilisée de la feuille[/COLOR] [COLOR=seagreen]Tableau Général[/COLOR]
For i = 2 To .Range("H" & Application.Rows.Count).End(xlUp).Row
   [COLOR=seagreen]'Si la cellule n'est pas vide[/COLOR]
    If .Cells(i, 10).Value <> "" Then
        [COLOR=seagreen]'Trouver la premère cellule non vide de la feuille BD colonne F[/COLOR]
        Derligne = wb.Sheets("BD").Range("F" & Application.Rows.Count).End(xlUp).Row + 1
       [COLOR=seagreen]'On prend les valeurs des cellules et on les copies dans la cellule sur la feuille BD[/COLOR]
        wb.Sheets("BD").Cells(Derligne, 6).Value = .Cells(i, 10).Value & "/" & .Cells(i, 9).Value & "/" & .Cells(i, 8).Value
    End If
Next i
[COLOR=seagreen]'Fermeture du classeur source[/COLOR]
wbSource.Close
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Cordialement

Merci pour les explications dans le code (je vais pouvoir étudier de plus près à tête reposée)
Cela me donne un résultat approchant de ce que je recherche, à deux petit s détails près:

C'est que le départ de la cellule source est en ligne 3 alors que la destination est en ligne 2.
Du coup j'ai dans la cellule F2 du classeur destination la valeur "Jour/Mois/Année" de la ligne 2 du classeur source (cellule titre).

Quel paramètre doit-on changer dans ta macro?

De plus si la macro a déjà été utilisée, il recommence la manip en remplissant les champs à la première cellule vide et donc à la suite des autres données.
Comment être sur qu'il répète la manip toujours sur la même plage de cellules de F2:F2000 du classseur destination car le fichier source sera modifié journalièrement ?

Merci tout de même pour cette avancée et de ton attention...

Cordialement.

brutor
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Concaténer date par VBA

Re
Une version qui devrait résoudre les deux problèmes(en Rouge la modif pour le numéro de ligne):
Code:
Sub Concaterner_une_Plage()
' Déclaration des variables
Dim wb As Workbook, wbSource As Workbook
Dim Derligne As Long
 
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
Workbooks.Open Filename:="ClasseurSource.xls"
 
[COLOR=seagreen]' Récupération du nom du classeur[/COLOR]
Set wbSource = ActiveWorkbook
 
wbSource.Activate
Set wb = Workbooks("Classeurdestination.xls")
[COLOR=seagreen]'Remise à blanc de la colonne F (De F2 à la fin de la colonne) de la feuille BD[/COLOR]
[COLOR=seagreen]'(pour éviter le problème d'ajout de lignes)[/COLOR]
wb.Sheets("BD").Range("F2:F" & Range("F" & Application.Rows.Count).End(xlUp).Row).ClearContents
With wbSource.Sheets("Tableau Général")
[COLOR=seagreen]'Pour toute les cellules de la ligne 3 à la dernière utilisée de la feuille Tableau Général[/COLOR]
For i = [COLOR=red][B]3 [/B][/COLOR]To .Range("H" & Application.Rows.Count).End(xlUp).Row
 [COLOR=seagreen]  'Si la cellule n'est pas vide[/COLOR]
    If .Cells(i, 10).Value <> "" Then
        [COLOR=seagreen]'Trouver la premère cellule non vide de la feuille BD colonne F[/COLOR]
        Derligne = wb.Sheets("BD").Range("F" & Application.Rows.Count).End(xlUp).Row + 1
      [COLOR=seagreen] 'On prend les valeurs des cellules et on les copies dans la cellule sur la feuille BD[/COLOR]
[COLOR=seagreen]     '(i -1 car les données sources sont en lignes 3 et la BD est en ligne 2)[/COLOR]
        wb.Sheets("BD").Cells(Derligne, 6).Value = .Cells(i - 1, 10).Value & "/" & .Cells(i - 1, 9).Value & "/" & .Cells(i - 1, 8).Value
    End If
Next i
[COLOR=seagreen]'Fermeture du classeur source[/COLOR]
wbSource.Close
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Cordialement
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonsoir Efgé,
Bonsoir le forum,

Le nouveau code donne le même résultat...

La ligne 3 de la feuille Tableau Général se reporte toujours sur la ligne 3 de la feuille BD au lieu de se mettre dans la ligne 2.

Et une répétition de la macro remet les mêmes données à la suite des autres.

Vois-tu d'où cela peut venir?

Merci de ton attention.

Cordialement.

Brutor
 

ROGER2327

XLDnaute Barbatruc
Re : Concaténer date par VBA

Bonsoir à tous
Pas certain d'avoir tout compris, mais, à tout hasard :
Code:
[COLOR="DarkSlateGray"][B]Sub Concaterner_une_Plage()
Dim wb As Workbook, wbSource As Workbook, oDat, i&
   Application.ScreenUpdating = False
   Application.DisplayAlerts = False
   Workbooks.Open Filename:="ClasseurSource.xls"
   With ActiveWorkbook
      oDat = .Sheets("Tableau Général").Range("H3:J2001").Value
      For i = 1 To UBound(oDat, 1)
         oDat(i, 1) = DateSerial(oDat(i, 1), oDat(i, 2), oDat(i, 3))
      Next i
      .Close
   End With
   Workbooks("Classeurdestination.xls").Sheets("BD").Range("F2:F2000").Value = oDat
   Application.ScreenUpdating = True
   Application.DisplayAlerts = True
End Sub[/B][/COLOR]
ROGER2327
#3573


Mercredi 11 Merdre 137 (Saint Memnon, vidangeur, SQ)
9 Prairial An CCXVIII
2010-W21-5T20:08:06Z
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonsoir ROGER 2327, Bonsoir Efgé,

Bonsoir le forum,

Bravo Roger tu as presque tout compris !!!

Cela m'affiche bien le résultat voulu et remet bien à jour si l'on rajoute une date dans le dossier source, mais pour les cellules vides il me met la date du 30/11/1999.

Comment éviter cela et que les cellules vides restent vides.

Merci de votre aide si précieuse à tous.

Cordialement.

Brutor
 

ROGER2327

XLDnaute Barbatruc
Re : Concaténer date par VBA

Re...
Code:
[COLOR="DarkSlateGray"][B]Sub Concaterner_une_Plage()
Dim wb As Workbook, wbSource As Workbook, oDat, i&
   Application.ScreenUpdating = False
   Application.DisplayAlerts = False
   Workbooks.Open Filename:=ThisWorkbook.Path & "\ClasseurSource.xls"
   With ActiveWorkbook
      oDat = .Sheets("Tableau Général").Range("H3:J2001").Value
      For i = 1 To UBound(oDat, 1)
         If Not IsEmpty(oDat(i, 1)) Then oDat(i, 1) = DateSerial(oDat(i, 1), oDat(i, 2), oDat(i, 3))
      Next i
      .Close
   End With
   Workbooks("Classeurdestination.xls").Sheets("BD").Range("F2:F2000").Value = oDat
   Application.ScreenUpdating = True
   Application.DisplayAlerts = True
End Sub[/B][/COLOR]
peut-être ?​
ROGER2327
#3575


Mercredi 11 Merdre 137 (Saint Memnon, vidangeur, SQ)
9 Prairial An CCXVIII
2010-W21-5T20:39:01Z
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonsoir ROGER 2327, Bonsoir Efgé,
Bonsoir le forum,

Génial Roger, c'est tout à fait cela.
Merci de ton aide et de votre attention à tous.

J'avoue que je vais avoir du mal à saisir les nuances de ta macro et à la reproduire dans un autre cas de figure, mais elle me servira souvent je n'en doute pas...

Bonne soirée et à bientôt.

Cordialement.

Brutor
 

ROGER2327

XLDnaute Barbatruc
Re : Concaténer date par VBA

Re...
(...)
J'avoue que je vais avoir du mal à saisir les nuances de ta macro et à la reproduire dans un autre cas de figure, mais elle me servira souvent je n'en doute pas...
(...)
En cas de besoin d'un commentaire sur un point précis, n'hésitez pas à demander...
Bonne continuation,
ROGER2327
#3578


Mercredi 11 Merdre 137 (Saint Memnon, vidangeur, SQ)
9 Prairial An CCXVIII
2010-W21-5T21:04:43Z
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Re...
En cas de besoin d'un commentaire sur un point précis, n'hésitez pas à demander...
Bonne continuation,
ROGER2327
#3578

Alors je vais me permettre de solliciter ton explication.

A quoi correspond la variable oDat et i& pourquoi les trouve-t-on sans le as quelque chose
oDat semble correspondre à la plage de cellules du fichier source

Peux-tu m'expliquer aussi que font exactement les fonctions UBound et DateSerial et à quoi correspondent les arguments les accompagnant (i,1) (i,2) et (i,3)

Merci encore

Cordialement.

Brutor
 

ROGER2327

XLDnaute Barbatruc
Re : Concaténer date par VBA

Re...
  1. n& est une abréviation remplaçant n As Long.
  2. oDat déclaré sans type équivaut à oDat As Variant ; cette variable prend effectivement toute les valeurs de la plage de données H3:J2001 dans le classeur source, sous forme d'un tableau à 1999 lignes et 3 colonnes.
  3. UBound(tableau, dim) renvoie la plus grande valeur de l'indice correspondant à la dimension dim du tableau. La formulation est assez bizarre, mais c'est comme ça !
    Pratiquement, UBound(oDat,1) renvoie 1999, qui est le nombre de lignes de données. UBound(oDat,2) (inutilisé dans cette procédure) renvoie 3, qui est le nombre de colonnes de données. Pour plus de détail, voir l'aide de VBA.
  4. DateSerial(année, mois, jour) renvoie le numéro de série de la date jour/mois/année tout comme le fait la fonction Excel =DATE(année;mois;jour). Là aussi, voir l'aide de VBA pour plus de détail.
  5. DateSerial(oDat(i, 1), oDat(i, 2), oDat(i, 3)) doit se comprendre comme DateSerial(valeur de la ligne i, colonne 1 du tableau oDat (c'est une année) , valeur de la ligne i, colonne 2 du tableau oDat (c'est un mois), valeur de la ligne i, colonne 3 du tableau oDat (c'est un jour)).
Voilà...​
ROGER2327
#3580


Mercredi 11 Merdre 137 (Saint Memnon, vidangeur, SQ)
9 Prairial An CCXVIII
2010-W21-5T22:05:22Z
 

brutor2

XLDnaute Junior
Re : Concaténer date par VBA

Bonsoir Roger,

Merci pour toutes ces explications très précises.

Tout devient plus clair et je vais me plonger dans l'aide pour approfondir les différents éléments.

Merci de ta patience et de ton aide.

Je vais me coucher une fois de plus en ayant appris beaucoup ce soir grâce à toi.

Bonne nuit et encore merci.

et merci à Efgé.

Bonne continuation.

Cordialement.

Brutor
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 453
Messages
2 088 551
Membres
103 881
dernier inscrit
malbousquet