Trouver un ou plusieurs titre, copier/coller toute la colonne autre feuille
Bonjour,
J'ai besoin de votre aide, j'aimerai savoir si c'est possible de trouver un mots (ou même plusieurs mots) en particulier dans une feuille (elle peut se situer sur n'importe quelle ligne ) et copier l'entièreté des données de cette colonne.
Exemple ici j'ai fais une feuille de donnée aléatoire ou le tableau débute (à partir de la ligne 9 ATTENTION : ça ne sera pas le cas tout le temps les lignes peuvent changer un coup à la ligne 1, 3 ect)
J'aimerai pouvoir automatiser l'extraction des colonne comportant les noms : Date, NBR,AL,WD n'importe ou sur la feuille1 et les coller sur le feuille2 à partir de la ligne 1.
Le fichier que je vous envois est un fichier test avec des données réduites, car les données actuels sont confidentiels (j'ai donc plusieurs mots à trouver)
Public Sub Search_Data()
'Fontion qui recherche une variable spécifique
'Et sélectionneemnt toute la colonne
Dim xRg As Range
Dim xRgUni As Range
Dim xFirstAddress As String
Dim xStr As String
On Error Resume Next
xStr = "DATE"
Set xRg = Range("A1:Y1").Find(xStr, , xlValues, xlWhole, , , True)
If Not xRg Is Nothing Then
xFirstAddress = xRg.Address
Do
Set xRg = Range("A1:P1").FindNext(xRg)
If xRgUni Is Nothing Then
Set xRgUni = xRg
Else
Set xRgUni = Application.Union(xRgUni, xRg)
End If
Loop While (Not xRg Is Nothing) And (xRg.Address <> xFirstAddress)
End If
xRgUni.EntireColumn.Select
End SubJ'ai trouver ce code mais il permet de trouver qu'un seul mots, et sur une ligne particulière ici A1 à Y1, j'aimerai pourvoir trouver n'importe ou sur la feuille.
Je vous importe le fichier des données, en espérant que vous puissiez m'aider.
Bonjour,
Voici un essai où on récupère les colonnes (avec les titres) de la région courante de A1 de la Feuille1, en respectant leur ordre d'affichage, et qu'on restitue par la suite en A1 de la Feuille2 en effaçant au préalable les informations préexistantes :
Sub MainProc()
t = GetData(sheets("Feuille1").range("A1").currentregion, "Date", "NBR", "AL", "WD")
if isarray(t) then
with sheets("Feuille2")
.cells.clear
.cells(1).resize(ubound(t), ubound(t, 2)).value = t
'application.goto .cells(1)
end with
else
msgbox "Aucune correspondance"
end if
end sub
function GetData(rTableWithHeaders as range, paramarray sKeyWord())
dim t()
with rTableWithHeaders
for k = 1 to .columns.count
for each prm in sKeyWord
if .cells(1, k).value like prm then
n = n + 1: redim preserve t(1 to .rows.count, 1 to n)
for i = 1 to .rows.count
t(i , n) = .cells(i, k).value
next i
exit for
end if
next prm
next k
end with
if n > 0 then GetData = t
End functionLe cas échéant, il conviendra d'effectuer des tests supplémentaires et surtout d'adapter les références et les critères (mots recherchés dans les titres).
Cdlt,
Merci je vais essayer la solution que vous m'avez proposé, si j'ai bien compris le cas ici ne s'applique seulement si les titres du tableau sont à la première ligne et dans le bon ordre ?
Donc si je bidouille un peu ce code, en cherchant au début le mot "DATE" sur la feuille pour retrouver la cellule, la ligne sur laquelle les données sont aligner
Je vous remercie
Bonjour,
Non, le code s'applique à n'importe quel tableau renseigné en argument de la fonction GetData (mais il fallait bien que je mette une référence que je vous ai invité à adapter à votre cas). En revanche, pour le moment, on ne recherche les mots que dans les titres du tableau et pas n'importe où dans la colonne. Cet aspect peut être changé très facilement si besoin.
Non, il n'est pas question d'ordre mais de correspondance exacte avec un des mots, qui sont tous examinés pour chacune des colonnes du tableau. Mais forcément, dès lors qu'il y a match, on ne cherche plus les autres mots.
Si le tableau était sous forme de tableau structuré, ce serait très simple, on pourrait le cibler par son nom ou son index dans la collection des TS.
Sinon, on peut rechercher le tableau en fonction d'un critère, par exemple le mot "DATE", pourvu qu'il ne soit pas trouvé ailleurs avant, ou éventuellement en cherchant la dernière cellule non vide en colonne A et en ciblant sa région courante ?
Exemple :
Sub MainProc()
dim rTable as range
with sheets("Feuille1")
set rTable = .cells(.rows.count, 1).end(xlup).currentregion 'en partant du bas
'set rTable = .cells.find("DATE").currentregion 'en cherchant "DATE"
t = GetData(rTable, "Date", "NBR", "AL", "WD")
end with
if isarray(t) then
with sheets("Feuille2")
.cells.clear
.cells(1).resize(ubound(t), ubound(t, 2)).value = t
'application.goto .cells(1)
end with
else
msgbox "Aucune correspondance"
end if
end subCdlt,