Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Florent69

XLDnaute Nouveau
Bonjour à tous,

Je me permets de venir avec mon petit caba plein de questions de "noob".

J'ai trouvé des éléments de réponse sur ce forum concernant la manip que je désire faire mais pris par le temps, je n'arrive pas à concaténer les lignes de codes qui s'aglutinent.

J'ai deux fichiers Excel distincts (un "source" et un "synthèse")
De mon premier fichier, je désirerai récupérer le contenu de certaines cellules pour les mettre dans le deuxième fichier mais dans un ordre différent (que l'on m'impose au taf).
En plus simple, chaque ligne de mon tableau "source" est fait de la mêmê manière, un nom auquel je fais correspondre @ IP, @mac, Login etc...
On me demande de recréer un fichier de synthèse "des comptes avec login" avec les mêmes données mais dans un ordre différent au sein de la ligne.
De plus, j'ai des lignes à ne pas prendre en compte (colonne ou je n'ai pas de login par exemple - ce sont les imprimantes)
Et ce qui me fait le plus soucis c'est la gestion de mes "écrans". J'ai créé des colonnes dans mon fichier "source" regroupant pour l'utilisateur, si il a un 17", un 19" ou un 22" - en gros sur la ligne de l'utilisateur j'ai mis un "1" dans la case correspondante.
On me demande de créer une ligne pour chaque écran en nommant la ligne "22 ou 19 ou 17", et la je vois même pas comment cela peut être réalisable :-(

Je débute un VB et j'avoue me noyer complétement.

Mille mercis par avance si vous avez des pistes.

Ci-joint mon fichier source.

Bonne journée à vous.
 

Pièces jointes

  • Source.xls
    33.5 KB · Affichages: 23
  • Source.xls
    33.5 KB · Affichages: 28
  • Source.xls
    33.5 KB · Affichages: 29

Modeste

XLDnaute Barbatruc
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Bonjour Florent69 et bienvenue parmi nous,

Je débute un VB et j'avoue me noyer complétement.
La natation n'étant pas mon fort, j'ai bien peur de sombrer en même temps que toi, si tu ne nous en dis pas un peu plus: tu parles d'un ordre différent pour afficher les données, dans un second fichier ... Il nous faudrait cet autre fichier, pour bien comprendre ... ou alors quelque chose m'échappe!?

Il faudrait par ailleurs que tu précises ce que tu entends par "en nommant la ligne 22 ou 19 ou 17"
 

Florent69

XLDnaute Nouveau
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Merci Modeste pour ta réponse.
En effet, en grammaire je nage aussi apparement car mon explication est incompréhensible en effet...bref.
Le fichier de destination est vierge pour l'instant...donc sans grand interet.
J'ai réussi a faire ce que je voulais pour le collage dans le désordre avec ce code

"Lin" étant ma ligne de mon fichier source
et "Lin2" ma ligne de mon fichier destination

classeurSource.Sheets("Feuil1").Cells(Lin, 24).Copy classeurDestination.Sheets("Feuil1").Cells(Lin2, 22)
classeurSource.Sheets("Feuil1").Cells(Lin, 26).Copy classeurDestination.Sheets("Feuil1").Cells(Lin2, 8)
classeurSource.Sheets("Feuil1").Cells(Lin, 30).Copy classeurDestination.Sheets("Feuil1").Cells(Lin2, 24)

Comme vu dans le fichier "source" que j'ai mis, j'ai une colonne pour chaque type d'écran (les 17", les 19" et les 22")
Ce que je désirai c'etait que lorsque le script voit dans une ligne un "1" dans la colonne correspondant à un des types d'écran il ne reporte pas la valeur comme auparavant mais créé une ligne intitulée "écran 17" ou" "ecran 19" etc...
En gros mon patron veuille que chaque ligne correponde à un type de materiel (une ligne pour le PC, une pour l'écran, une pour le scanne etc...)

J'espere avoir ete plus clair, ce dont je doute :/

Merci encore par avance
 

Modeste

XLDnaute Barbatruc
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Re,

J'espere avoir ete plus clair, ce dont je doute :/
Si tu doutes toi-même, imagine ce qu'il en est pour nous! En tout cas, pour moi ... mais si quelqu'un y voit plus clair, surtout qu'il/elle n'hésite pas.
Tu considères le fichier "destination" sans intérêt pour nous ... sauf si on y retrouve l'ordre des colonnes (que nous ne connaissons toujours pas!).
Quand tu écris: "classeurSource.Sheets("Feuil1").Cells(Lin, 24).Copy classeurDestination.Sheets("Feuil1").Cells(Lin2, 22)", nous aprenons 2 choses: il y aurait une 24e colonne dans le fichier source (pas dans ton exemple) et il faudrait copier le contenu de cette colonne, dans la 22e colonne du classeur destination.
Le mieux que tu puisses faire, au départ de ton exemple, serait de nous créer un fichier destination avec les colonnes dans l'ordre de ton choix (tu n'auras plus qu'à adapter, par la suite) et le résultat qu'on devrait retrouver, au départ des lignes présentes dans ton fichier source.

... Moi, j'dis ça, mais tu en fais ce que bon te semble ;)
 

Florent69

XLDnaute Nouveau
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Bonjour et merci pour ton interet Modeste.

J'ai essayer d'être plus compréhensible cette fois, j'ai joint les deux fichiers. (source et destination)
Dans le destination, j'ai mis ce à quoi je voudrais arriver.
Un petit tableau vaut mieux qu'un grand discours ^^
 

Pièces jointes

  • Source.xls
    33.5 KB · Affichages: 28
  • Destination.xls
    44.5 KB · Affichages: 28
  • Source.xls
    33.5 KB · Affichages: 23
  • Destination.xls
    44.5 KB · Affichages: 32
  • Source.xls
    33.5 KB · Affichages: 37
  • Destination.xls
    44.5 KB · Affichages: 35

Modeste

XLDnaute Barbatruc
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Bonjour Florent, le forum,

J'ai d'abord essayé de "coller" le plus possible à ton "style de programmation" ... et puis j'ai renoncé. Non pas que le mien soit meilleur, simplement on a tous nos petites habitudes et nos travers, auxquels on s'accroche, même si ce n'est pas une bonne idée :eek:

Bref, le code ci-dessous est à coller dans un module standard du classeur Destination (tu associeras ensuite cette macro à ton bouton, si elle te convient). Comme je pressentais que tu risquais d'avoir un volume de données conséquent, j'ai travaillé avec un tableau: des copies cellule par cellule d'un classeur à l'autre risquent de ralentir beaucoup.
VB:
Sub recopie()
    
'ouvrir le classeur source (en lecture seule)
Set classeurSource = Application.Workbooks.Open("D:\Macro_agicentre\source.xls", , True)
'définir le classeur destination
Set dest = ThisWorkbook.Sheets("Feuil1")
Application.ScreenUpdating = False
Dim monTablo()
With classeurSource.Sheets("Feuil1")
    'repérage dernière cellule non vide en colonne B du fichier Source
    derLigne = .Cells(65000, 2).End(xlUp).Row
    For lig = 5 To derLigne
        If .Cells(lig, 3) <> "" Then
            ReDim Preserve monTablo(3, i) 'on redimensionne le tableau pour ajouter des données
            monTablo(1, i) = .Cells(lig, 5)
            monTablo(2, i) = .Cells(lig, 3)
            monTablo(3, i) = .Cells(lig, 7)
            i = i + 1
            For Col = 9 To 11 'on vérifie la présence d'une valeur dans les colonnes "écran"
                If .Cells(lig, Col) <> "" Then
                    ReDim Preserve monTablo(3, i)
                    monTablo(0, i) = .Cells(4, Col)
                    monTablo(2, i) = .Cells(lig, 3)
                    i = i + 1
                End If
            Next Col
        End If
    Next lig
End With
dest.Cells(7, 2).Resize(i, 4) = Application.Transpose(monTablo) 'on "colle" les données du tableau
classeurSource.Close False
Application.ScreenUpdating = True
End Sub

Par rapport à ton code, deux petites choses:
- quand tu écris: "Dim Lin, Col, IntRep, Num As Integer", seule la dernière variable prend le type Integer. En vba, le type doit être défini pour chacune des variables.
- j'ai préféré ne pas utiliser la boucle qui repérait le mot "fin" sous le dernier login: le jour où tu oublies de l'ajouter, la macro risque de tourner pendant fort longtemps :rolleyes:

Fais des tests sur le fichier source que tu avais déposé ici, pour vérifier si ça fonctionne comme tu le souhaitais. Si c'est bien le cas, tu n'auras plus qu'à nous dire si tu as des questions pour adapter à ton fichier réel.
Si ce n'est pas le cas ... ben dis-le aussi ;)
 

Florent69

XLDnaute Nouveau
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Whaou, je suis bluffé par la simplicité du code que tu as réalisé et surtout de son efficacité...un gouffre nous sépare ^^
Donc dans un premier temps, mille mercis :)
En effet cela fonctionne comme je le désire, j'ai donc essayer de rajouter encore une colonne pour tendre vers la réalité de mon vrai fichier. Mais là c'est le drame ^^
Ci dessous ton code avec un petit ajout d'une ligne avec son commentaire.
Lorsque montablo est collé dans le ficheir destinataire, ma colonne rajoutée de s'ajoute pas :/
Ou ai-je blairé ?

Merci encore !!!

Code:
Private Sub CommandButton1_Click()
'ouvrir le classeur source (en lecture seule)
 Set classeurSource = Application.Workbooks.Open("D:\Macro_agicentre\source.xls", , True)
 'définir le classeur destination
 Set dest = ThisWorkbook.Sheets("Feuil1")
 Application.ScreenUpdating = False
 Dim monTablo()
 With classeurSource.Sheets("Feuil1")
     'repérage dernière cellule non vide en colonne B du fichier Source
    derLigne = .Cells(65000, 2).End(xlUp).Row
     For lig = 5 To derLigne
         If .Cells(lig, 3) <> "" Then 
             ReDim Preserve monTablo(4, i) 'on redimensionne le tableau pour ajouter des données
            monTablo(1, i) = .Cells(lig, 5)
             monTablo(2, i) = .Cells(lig, 3)
             monTablo(3, i) = .Cells(lig, 7)
             monTablo(4, i) = .Cells(lig, 8) 'je crée une 4ème colonne dans "monTablo" avec le contenue de ma 8ème colonne venant de source. (com Florent)
             i = i + 1
             For Col = 9 To 11 'on vérifie la présence d'une valeur dans les colonnes "écran"
                If .Cells(lig, Col) <> "" Then
                     ReDim Preserve monTablo(4, i)
                     monTablo(0, i) = .Cells(4, Col)
                     monTablo(2, i) = .Cells(lig, 3)
                     i = i + 1
                 End If
             Next Col
         End If
     Next lig
 End With
 dest.Cells(7, 2).Resize(i, 4) = Application.Transpose(monTablo) 'on "colle" les données du tableau
 classeurSource.Close False
 Application.ScreenUpdating = True
 
End Sub
 

Modeste

XLDnaute Barbatruc
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Re,

Pas testé, mais peut-être dans les dernières lignes: "dest.Cells(7, 2).Resize(i, 4) =..." le 4 du Resize correspond au nombre de colonnes de la nouvelle plage ... avec une colonne de plus, je te laisse deviner :D
 

Florent69

XLDnaute Nouveau
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

OMFG !!!!
Je suis un B***E !!!
En effet, c'était bien ça :)
Encore merci merci beaucoup, mais je pense que je ne vais pas tarder à abuser de toi encore ^^ (informatiquement hein).
Allez hop, au boulot maintenant que tu m'as maché le travail !

Merci encore et bonne fin de journée à toi (et au forum)
 

Florent69

XLDnaute Nouveau
Re : Copier cellule (ligne par ligne) Excel vers autre fichier Excel

Bonjour Modeste et au forum,

Je reviens vers toi pour une petite interrogation existentielle...
Dans cette partie du code, dans la création du "tableau virtuel - MonTablo" je me heurte à des problèmes.
Ils sont liés au fait que mon exemple n'était pas assez parlant quand je te l'ai envoyé.
Premièrement, les colonnes de mon tableau source ne sont pas contigues.
Deuxièmement, quand je mets "monTablo(1,i)=.cells(lig,5)" et etc, c'est donc que je suis sensé connaitre le nombre de ligne et les incrémenter "à la main" dans cette partie du code, hors j'en ai 269 de lignes :/

Je me permets de joindre les "vrais fichiers" sur lesquels je vais travailler cette fois...si jamais tu as le temps de jeter un oeil.

D'avance, encore mille merci.

cordialement,


Code:
If .Cells(lig, 26) <> "" Then
             ReDim Preserve monTablo(4, i) 'on redimensionne le tableau pour ajouter des données
             monTablo(1, i) = .Cells(lig, 5)
              monTablo(2, i) = .Cells(lig, 3)
              monTablo(3, i) = .Cells(lig, 7)
              monTablo(4, i) = .Cells(lig, 8) 'je crée une 4ème colonne dans "monTablo" avec le contenue de ma 8ème colonne venant de source. (com Florent)
              i = i + 1
              For Col = 9 To 11 'on vérifie la présence d'une valeur dans les colonnes "écran"
                 If .Cells(lig, Col) <> "" Then
                      ReDim Preserve monTablo(4, i)
                      monTablo(0, i) = .Cells(4, Col)
                      monTablo(2, i) = .Cells(lig, 3)
                      i = i + 1
                  End If
 

Pièces jointes

  • Destination.xls
    25.5 KB · Affichages: 26
  • suivi.xls
    157 KB · Affichages: 23
  • Destination.xls
    25.5 KB · Affichages: 23
  • suivi.xls
    157 KB · Affichages: 24
  • Destination.xls
    25.5 KB · Affichages: 28
  • suivi.xls
    157 KB · Affichages: 21
Dernière édition:

Discussions similaires

Réponses
5
Affichages
213

Statistiques des forums

Discussions
312 270
Messages
2 086 681
Membres
103 370
dernier inscrit
pasval