Copier/coller des données de plusieurs feuilles sur une seule (VBA)
Bonjour,
Après une journée de recherche à tester 36 000 solutions sans parvenir au résultat souhaité, je m'en remet à vous ;
Je vous joins un fichier Excel sur lequel se trouvent plusieurs feuilles susceptible de contenir une donnée similaire (nom client). Mon but étant que lorsque je souhaite supprimer un client, grâce à un code VBA je puisse rechercher dans tous les onglets s'il contiennent une ligne de ce client. Si oui, je souhaite que la ligne de titre et la ligne client de chaque onglet se copie/colle sur la feuille "Suppression".
J'ai réussi dans un premier temps a reporter sur cette feuille, les uns après les autres, le nom des différents onglets répondant à ma condition. Cependant, dès que j'ajoute dans mon code la ligne venant copier/coller les lignes de titres ça beug :
- seule la ligne de titre de "Général" est reportée avec la mise en forme et les valeur
- ensuite la ligne de titre de "Contact" est reportée mais sans mise en forme
- enfin, les ligne titre des autres onglets ne se reportent pas.
Je précise que pour chaque onglet le nombre de colonne peut varier ; la différenciation que j'ai faite concernant l'onglet "Général" par rapport aux autres s'explique par le fait que sur "Général" les 3 dernières colonnes de ma feuille sont composé par des Codes Postaux et villes qui sont des données que je ne souhaite pas reporter dans "suppression" et surtout qui venait fausser mon columns.count. Je me suis peut-être compliquée la vie, mais je n'ai pas trouvé d'autres solutions.
J'avais à la base prévu de créer un With pour chaque sheets (cf. module "Supprimer") mais avec le temps d'autres onglet seront créer et comporteront probablement une ligne client d'où l'utilisation dans "Module 1" de la solution "For each sWK..."
Dernière précision, comme 'l'onglet "Suppression" ne sera constituer que par les données d'un seul et même client à la fois, finalement je me fiche que la colonne "Client" reste nommée comme tel, c'est pour cela que je demande dans mon code que cette cellule soit remplacer par le nom du worksheet.
Bref, je vous mets mon code actuel et reste à votre écoute pour tout échange afin d'arriver à une solution. Je compte sur vous et vous serais tellement reconnaissante si vous m'aider à solutionner cela.
Sub test()
Dim sWk As Worksheet
Dim rCel As Range
Dim I As Integer
Dim Nm As String
Dim Supp As Worksheet
Dim Lig As Long
Dim Lig2 As Long
Set Supp = Feuil7
Nm = InputBox("Client?")
Lig = 0
Lig2 = Lig + 1
Application.EnableEvents = False
For Each sWk In ThisWorkbook.Worksheets
If sWk.Name <> "Suppression" Then
iRow = sWk.Range("B" & Rows.Count).End(xlUp).Row
Select Case sWk.Name
Case "Général"
iCol = Range("Tableau1").Columns.Count
Case Else
iCol = Cells.SpecialCells(xlCellTypeLastCell).Column
End Select
Set rCel = sWk.Range("B4:B" & iRow).Find(Nm, LookIn:=xlValues, lookat:=xlWhole)
If Not rCel Is Nothing Then
sWk.Cells(4, 2).Resize(1, iCol).Copy Supp.Cells(Lig, 1)
Supp.Cells(Lig, 1) = sWk.Name
Supp.Cells(Lig2, 1) = "Test"
Lig = Lig + 3
Lig2 = Lig + 1
End If
End If
Next
Application.EnableEvents = True
End Sub
Bonjour,
Un premier essai ... afin de savoir si j'ai bien compris le besoin ...
Le code n'est pas nécessairement optimisé ...
J'ai renommé les tableaux "Tableau1 à 6" ... afin d'utiliser une boucle.
Sub suppc()
Dim Nm As String
Dim Foundcell As Range
Dim sWk As Worksheet
Dim objShell As Object, objFolder As Object, oFolderItem As Object, Chemin As String
Dim Dl As Integer
Dim X As Byte
Sheets("Suppression").Visible = True
Nm = InputBox("Client ?")
If Nm = "" Then Exit Sub
Dl = Sheets("Suppression").Cells(Rows.Count, "A").End(xlUp).Row
nct = Range("Tableau1").Columns.Count
With Sheets("Suppression")
.Range(.Cells(2, "A"), .Cells(Dl, nct)).ClearContents
End With
With Sheets("Général").Activate
For X = 1 To 6
Set Foundcell = Range("Tableau" & X).Find(Nm)
If Not Foundcell Is Nothing Then
Dl = Sheets("Suppression").Cells(Rows.Count, "A").End(xlUp).Row + 1
Foundcell.Resize(1, nct).Copy Sheets("Suppression").Range("A" & Dl)
End If
Next X
End With
Sheets("Suppression").Activate
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(&H0&, " ", &H1&)
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.RightMargin = Application.InchesToPoints(0.3)
ActiveSheet.PageSetup.LeftMargin = Application.InchesToPoints(0.3)
On Error Resume Next
Set oFolderItem = objFolder.Items.Item
Chemin = oFolderItem.Path
fName = Chemin & "\sauvegarde suivi " & Nm & ".pdf"
ChDir Chemin
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
On Error GoTo 0
End Sub
ric
Merci Ric pour ta réponse et ton effort,
Mais après lecture et test de ton code celui-ci ne boucle que sur ma première feuille "Général" et vient coller sur "Suppression" plusieurs lignes clients.
Bonjour,
Étrange ... car, ici, s'inscrivent dans la feuille "Suppression" que les lignes du client sélectionné dans l'InputBox"
Est-ce que tu as testé le fichier que j'ai joint ?
Ou est-ce que tu as collé le code dans ton fichier de travail ?
Je demande car, comme mentionné, j'ai renommé les tableaux.
Ou bien encore, je n'ai pas compris correctement ta demande ...
ric
Bonjour,
Je viens de comprendre que la recherche est la recherche d'une partie du mot et non une recherche du mot exacte.
Je m'excuse de ne pas avoir mieux testé la chose ...
ric
Bonjour,
Et en changeant : Set Foundcell = Range("Tableau" & X).Find(Nm)
Pour : Set Foundcell = Range("Tableau" & X).Find(what:=Nm, LookIn:=xlValues, LookAt:=xlWhole)
Afin d'avoir une recherche du terme exact ...
ric
Oh yeaaah ! On est pas loin.
Juste, du coup, il ne me copie pas les 1e ligne de chaque tableau et ne remplace pas le nom client par le titre du worksheet.
Bonjour,
Avec les deux dernières consignes ...
Un essai ...
Sub suppc()
Dim Nm As String
Dim Foundcell As Range
Dim sWk As Worksheet
Dim objShell As Object, objFolder As Object, oFolderItem As Object, Chemin As String
Dim Dl As Integer, Dc As Byte
Dim X As Byte
Sheets("Suppression").Visible = True
Nm = InputBox("Client ?")
If Nm = "" Then Exit Sub
Dl = Sheets("Suppression").Cells(Rows.Count, "A").End(xlUp).Row
nct = Range("Tableau1").Columns.Count
With Sheets("Suppression")
.Range(.Cells(1, "A"), .Cells(Dl, nct)).Clear
End With
With Sheets("Général").Activate
For X = 1 To 6
Set Foundcell = Range("Tableau" & X).Find(what:=Nm, LookIn:=xlValues, LookAt:=xlWhole)
If Not Foundcell Is Nothing Then
Dl = Sheets("Suppression").Cells(Rows.Count, "A").End(xlUp).Row + 2
If Dl = 3 Then Dl = 1
Dc = Range("Tableau" & X).Columns.Count
Range("Tableau" & X).Rows(0).Copy Sheets("Suppression").Range("A" & Dl)
Dl = Sheets("Suppression").Cells(Rows.Count, "A").End(xlUp).Row + 1
Foundcell.Resize(1, nct).Copy Sheets("Suppression").Range("A" & Dl)
Sheets("Suppression").Range("A" & Dl) = Range("Tableau" & X).Parent.Name
End If
Next X
End With
Sheets("Suppression").Activate
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(&H0&, " ", &H1&)
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.RightMargin = Application.InchesToPoints(0.3)
ActiveSheet.PageSetup.LeftMargin = Application.InchesToPoints(0.3)
On Error Resume Next
Set oFolderItem = objFolder.Items.Item
Chemin = oFolderItem.Path
fName = Chemin & "\sauvegarde suivi " & Nm & ".pdf"
ChDir Chemin
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
On Error GoTo 0
End Subric
Holalala !!
Un énorme merci à toi Ric !!
On fait tous la holà pour lui
ric