Trouver un ou plusieurs titre, copier/coller toute la colonne autre feuille

9trial2.xlsm (13.93 Ko)

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 Sub

J'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 function

Le 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. Comme ça au lieu je pourrai lancer, sans me soucier de la ligne à laquelle se situent les titres des colonnes. (Car d'après votre solution cela ne s'applique seulement si les données du tableau commence à partir de la ligne 1 et la cellule "A1"

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 sub

Cdlt,

Rechercher des sujets similaires à "trouver titre copier coller toute colonne feuille"