Réorganiser de maniére automatique sur une nouvelle feuille
Bonjour a tous,
Dans le cadre de mon travail je dois réorganiser chaque jour des données que je recois sur une feuille excel; ce travail est chronophage, fastidieux et ininteressant.
Les données que je recois sont toujours organisées de la meme maniere. Voila ce que je dois faire dans l'ordre chronologique :
copier la colonne 10 pour la coller sur une nouvelle feuille en colonne 1
copier la colonne 2 et 3 pour la coller sur la nouvelle feuille en colonne 2 et 3
copier la colonne 13 '' '' '' 4
'' '' 24 " " " 5
" " 11 " " 6
copier la colonne 21 pour la coller sur la nouvelle feuille en colonne 7
trier ensuite la nouvelle feuille dans l'ordre décroissant en fonction de la colonne 6.
Je commence a peine a travailler avc excel donc soyez clément avec moi dans vos explications.
pour résoudre ce probleme, j'ai essayé de m'initier au VBA et j'ai commencé a réaliser le programme suiant :
Sub CopierDonnees()
Dim Entree As Workbook, Sortie As Workbook
Nomfichierentree = Application.GetOpenFilename("Fichier Excel (*.xls), *.xsl")
' On verifie que l'on a selectionné un nom de classeur
If Nomfichierentree <> False Then
' On ouvre le classeur
Set Entree = Workbooks.Open(Nomfichierentree)
NomFichierSortie = Application.GetOpenFilename("Fichier Excel (*.xls), *.xsl")
If NomFichierSortie <> False Then
Set Sortie = Workbooks.Open(NomFichierSortie)
' Ici j'ai du commnce a mettre cellule par cellule car je ne sais pas comment le faire avec toute une colonne
Sortie.Worksheets("Feuil1").Cells(2, 1) = Entree.Worksheets("Feuil1").Cells(2, 10)
Sortie.Worksheets("Feuil1").Cells(3, 1) = Entree.Worksheets("Feuil1").Cells(3, 10)
Sortie.Worksheets("Feuil1").Cells(4, 1) = Entree.Worksheets("Feuil1").Cells(4, 10)
' On ferme le classeur
Sortie.Close
End If
' On ferme le second
Entree.Close
End If
Vous comprendrez que je me tourne vers vous car tel que j'ai commencé ca va etre chaud je crois ^^ en plus j'ai un probleme, le contenu de certaines cellules est une date et quand je fais le transfert via le VBA ca me donne une suite de chiffres qui n'a pas de sens...
Merci beaucoup pour l'aide que vous pourrez m'offrir !
Bonjour
Avec un fichier ce serait plus facile mais vous pouvez essayer comme ceci en remplaçant les 3 lignes ci-dessous par le code proposé
Sortie.Worksheets("Feuil1").Cells(2, 1) = Entree.Worksheets("Feuil1").Cells(2, 10)
Sortie.Worksheets("Feuil1").Cells(3, 1) = Entree.Worksheets("Feuil1").Cells(3, 10)
Sortie.Worksheets("Feuil1").Cells(4, 1) = Entree.Worksheets("Feuil1").Cells(4, 10)
Dim dlg As Integer
With Entree.Worksheets("Feuil1")
dlg = .Range("A" & .Rows.Count).End(xlUp).Row
.Range(.Cells(2, 1), .Cells(dlg, 1)).Copy Sortie.Worksheets("Feuil1").Cells(2, 10)
.Range(.Cells(3, 1), .Cells(dlg, 1)).Copy Sortie.Worksheets("Feuil1").Cells(3, 10)
.Range(.Cells(4, 1), .Cells(dlg, 1)).Copy Sortie.Worksheets("Feuil1").Cells(4, 10)
End With
J'ai supposé que :
- Le fichier Entree comporte le code
- Les données sont copiées depuis le fichier Entree vers le fichier Sortie
Si Entree comporte le code Copierdonnees vous pourriez remplacer le nom Entree par THISWORKBOOK. PLus simple car vous ne devez pas declarer ENTREE via SET = ...
Tout cela à vérifier vu que je n'ai pas accès au fichier
Cordialement
Bonjour
Coucou Dan
pwskeud a écrit :... en plus j'ai un probleme, le contenu de certaines cellules est une date et quand je fais le transfert via le VBA ca me donne une suite de chiffres qui n'a pas de sens...
Petite précision : pour Excel c'est la notion de temps qui n'a pas de sens !
Comme tout système informatique, il utilise des nombres et donc traduit nos dates en nombres.
Aujourd'hui pour Excel c'est 42964.
Il suffit d'appliquer le format date à tes colonnes pour qu'elles apparaissent sous la forme habituelle.
Bonjour Dan,
Tout d'abord un grand merci pour ta réponse!
Si j'ai bien compris tu introduis une variable dlg grace a Dim ! C'est top grace a ca pas besoin de lister toutes les cellules, il n'y a plus qu'a faire une rotation ensuite c'est top pour traiter de plus gros fichier !
je m'en suis cependant sorti en créant une variable (as integrer et as variant) colonnes dans laquelle j'ai stocké ce qui m'interessait dans l'ordre! Grace a vous j'ai ensuite mis la fonction with mais pas a votre maniére puisque cela me demander de lister ensuite tt les cellules... J'ai rajouté une boucle for a l'interieur et j'ai ensuite fait tourner!
par contre dans mon programme j'ai bien compris l'utilité de mettre THISWORKBOOK puisque ça évite de devoir créer avant une feuille vierge mais je ne maitrise pas trop la syntaxe. J'ai donc mis a la place :
Set Entree = Source.Worksheets(1).UsedRange.EntireRow
Au final ca me donne aprés avoir introduit toutes mes variables (et ça marche trés bien) :
Colonnes = Array(, 10, 2, 3, 13, 4, 24, 11, 6)
NomSource = Application.GetOpenFilename("Fichier Excel (*.xls), *.xls")
If NomSource = False Then Exit Sub
Set Source = Workbooks.Open(NomSource)
Set Entree = Source.Worksheets(1).UsedRange.EntireRow
Set Sortie = Workbooks.Add(xlWBATWorksheet)
With Sortie.Worksheets(1)
For Colonne = 1 To UBound(Colonnes)
Entree.Columns(Colonnes(Colonne)).Copy .Cells(1, Colonne)
Next Colonne
End With
Source.Close
End Sub
Ce faisant j'ai aussi évité le probléme des dates sous excel puisque j'ai crée colonnes en varaint et integrer mais grace a vous, 78Chris j'ai compris qu'un logiciel ne sait pas ce qu'est le temps!
Vraiment, un grand merci, vous venez de me faire gagner un temps trés précieux a moi et mes collégues qui font la meme chose!
Re
Pour 78chris, je n'avais pas lu cette ligne concernant les dates.
Pour pwskeud
par contre dans mon programme j'ai bien compris l'utilité de mettre THISWORKBOOK puisque ça évite de devoir créer avant une feuille vierge mais je ne maitrise pas trop la syntaxe.
This workbook t'évite de déclarer le classeur dans lequel tu exécutes la macro.
En relisant ton code, je ne vois pas très bien le rapport entre les deux codes du fil mais bon si cela fonctionne...
Cordialement