Trouver toutes les colonnes ayant un mot commun dans leur intitulé

Bonjour,

Je dispose d'un fichier excel, dont plusieurs colonnes sont nommées en première ligne du style "partie commune puis variable".

Je souhaiterai à partir d'un mot clé (par exemple ici "commune") repérer toutes les colonnes intitulée de la sorte "partie commune puis variable", afin de réaliser une opération ensuite.

Comment pourrais-je m'y prendre ?

Merci d'avance

Bonjour,

une MFC sur la ligne des entêtes (ici la ligne 1) avec en formule : =ESTNUM(TROUVE("commune";A1)) et s'applique à : = 1:1

@ bientôt

LouReeD

Bonjour,

Merci pour ton aide. Je n'arrive cependant pas à parvenir à mes fins...

Voici mes trois tentatives :

Sub Calculate(Text As String)

    If IsNumber(Text) = "VRAI" Or "TRUE" Then

    If Application.WorksheetFunction.IsNumber(Text, "1:1") = "VRAI" Or "True" Then

    If Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search(Text).Range("1:1")) = True Then

Suis-je mal parti ? Comment m'en sortir ?

Merci :)

Pourquoi ne pas juste tenter en MFC la formule proposée par LouReeD ?

Bonjour à tous !

Une piste à adapter :

Bonjour à tous,

Merci pour vos aides.

Je me suis peut-être mal exprimé mais je dois automatiser des feuilles de calculs diverses, avec des formats différents.
Je viens de me renseigner sur le terme MFC mais cela n'est pas adapté à ma demande.

Je souhaite vraiment passer par une macro VBA pour automatiser la suite de mes calculs.

L'idée est vraiment de rechercher à l'aide d'un mot clé dans la ligne 1 contenu dans des intitulés plus complexe (en-tête de colonne). Et dès que je rencontre ce mot clé, j'effectue des calculs dans cette colonne. Puis je poursuis la recherche dans les colonne suivante et ainsi de suite jusqu'à avoir parcouru ma feuille, puis l'ensemble du fichier.

N'hésitez pas si vous avez des idées :)

Voici ce que j'ai codé actuellement :

Sub Todo()

    Dim xSh As Worksheet
    Dim Text As String

    Application.ScreenUpdating = False

    Text = InputBox("Please enter text to search....")

    For Each xSh In Worksheets
        xSh.Select
        Call CalculateProd(Text)
    Next
    Application.ScreenUpdating = True

End Sub

Sub Calculate(Text As String)

    Dim LastLine As Integer
    Dim Sum_1 As Double
    Dim Sum_2 As Double
    Dim Prod As Double
    Dim iRange As Range
    Dim iRange2 As Range
    Dim Col_1 As String
    Dim Col_Txt As String

    Call LettreColonne("Var_1", Col_1)

    'If IsNumeric(Text) = "VRAI" Or "TRUE" Then
    'If Application.WorksheetFunction.IsNumber(Text, "1:1") = "VRAI" Or "True" Then
    If Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search(Text).Range("1:1")) = True Then
        Call LettreColonne(Text, Col_Txt)
        LastLine = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

        Set iRange = Range(Col_1 & ":" & Col_1)
        Set iRange2 = Range(Col_Txt & ":" & Col_Txt)

        Sum_1 = WorksheetFunction.Sum_1uct(iRange, iRange2)
        Sum_2 = WorksheetFunction.Sum(iRange)
        Prod = Sum_1 / Sum_2

        Range(Col_Txt & LastLine + 1) = Format(Prod, "0.00")
    End If

End Sub

Sub LettreColonne(MaVarCol As String, COL As String)

    Dim AdrCol As Range

    Set AdrCol = ActiveSheet.Range("A1:WWW1").Find(What:=MaVarCol, LookIn:=xlValues, LookAt:=xlWhole)
    If Not AdrCol Is Nothing Then COL = Split(AdrCol.Address, "$")(1) _
        Else MsgBox "Valeur de la variable MaVarCol (Nom : " & MaVarCol & ")  non valide": Exit Sub
    Set AdrCol = Nothing

End Sub

Merci d'avance

Sans VBA tu pourrais mettre une formule en permanence dans toutes les cellules qui ferait un truc du style : si l'en-tête contient"commune", mettre telle formule, sinon l'autre.

Et si ce mot-clé est susceptible d'être modifié, tu peux toujours le mettre dans une cellule de référence et le modifier quand il faut (ou y mettre une liste déroulante avec les mots -ou la plage de mots- que tu risques d'utiliser).

Et je pense qu'il suffit d'adapter la formule de LouReeD.

Non je dois passer par VBA : worksheet nombreuses, colonne, lignes variables.... Tout doit être automatisé.

Salut le fil,

Voici une petite fonction qui récupère les colonnes dont le titre contient un mot cherché :

Public Function GetColumnsByText(Tableau As ListObject, ByVal SearchedText As String) As Range
    Dim itemHeader As Range
        For Each itemHeader In Tableau.HeaderRowRange
            With Tableau
                If itemHeader.Value Like "*" & SearchedText & "*" Then
                    If GetColumnsByText Is Nothing Then
                        Set GetColumnsByText = .ListColumns(itemHeader.Value).Range
                    Else
                        Set GetColumnsByText = Union(GetColumnsByText, .ListColumns(itemHeader.Value).Range)
                    End If
                End If
            End With
        Next
End Function

J'ai présumé que tu travaillais avec des tableaux structurés, c'est bien le cas non ? sinon il faut vite les adopter.

Une petite procédure pour tester la fonction :

Public Sub testGetColumnsByText()
    Dim MyRange As Range
    ' // Ci-dessous le nom du tableau et le mot cherché sont à adapter
    Set MyRange = GetColumnsByText(Range("MonTableau").ListObject, "ID")
    If Not MyRange Is Nothing Then
        With MyRange
            ' // Ici tu peux boucler sur les colonnes et faire tes calculs
Debug.Print "Nombre de colonnes: "; .Columns.Count
            Dim counter As Long
            For counter = 1 To .Columns.Count
Debug.Print "Titres de la colone "; counter; ":"; """"; MyRange.Columns(counter).Range("A1").Value; """"; " Adresse de la colonne "; counter; ":"; MyRange.Columns(counter).Address
            Next counter
        End With
    Else
        MsgBox "La recherche n'a trouvée aucun résultat"
    End If
End Sub

Note qu'il y a d'autres façons d'arriver au même résultat. Notamment boucler sur les colonnes du tableau et vérifier si l'entête contient le mot recherché, puis de faire tes calculs si le mot est trouvé.

Sub test2()
    Dim itemColumn As Excel.ListColumn
    For Each itemColumn In Range("Tableau1").ListObject.ListColumns
        With itemColumn
            If .Parent.HeaderRowRange(.Index).Value Like "*commune*" Then
            ' // Faire les calculs ici
Debug.Print .Parent.HeaderRowRange(.Index).Value
            End If
        End With
    Next
End Sub

Bonsoir @ tous !

Pas de nouvelles ? Bonnes nouvelles, non ?

@ bientôt

LouReeD

Rechercher des sujets similaires à "trouver toutes colonnes ayant mot commun leur intitule"