Sélectionner une colonne en fonction du nom de première valeur

Résolu
scuti Messages postés 31 Statut Membre -  
scuti Messages postés 31 Statut Membre -
Bonjour,

Je travail actuellement avec des macro sur excel 2016,J'aimerai que ces macros puissent être utilisables sur d'autres fichiers.

Les fichiers ayant les même noms de colonnes mais pas dans le même ordre, j'aimerais savoir s'il existe une commande pouvant sélectionner une colonne en fonction de sa première valeur.

(ensuite je sélectionne la première colonne et fait un graphique avec)

Merci de votre aide,

7 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Essaie comme ça :

    Sub Macro1()
    Dim O As Worksheet
    Dim R As Range
    Dim COL As Integer
    Dim LI As Integer
    
    Set O = Worksheets("Feuil1")
    Set R = O.Rows(1).Find("Vitesse", , xlValues, xlWhole)
    If R Is Nothing Then Exit Sub
    COL = R.Column
    LI = O.Cells(Application.Rows.Count, "A").End(xlUp).Row
    Set pl = Application.Union(O.Range(O.Cells(1, 1), O.Cells(LI, 1)), O.Range(O.Cells(1, COL), O.Cells(LI, COL)))
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
    ActiveChart.SetSourceData Source:=pl
    O.Cells(1, COL).Select
    End Sub

    1
    1. scuti Messages postés 31 Statut Membre
       
      Super, Merci beaucoup, ça fonctionne :D
      0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    une autre facon de faire:

    Choix etant la variable qui contient l'entete recherchee

        Dim Cel As Range, Colchoix As Long, sColchoix As String
        
        Set Cel = Range("Q2:AE2").Find(what:=Choix)
        Colchoix = Cel.Column       'numerique
        sColchoix = Split(Cel(8, Cel.Column).Address, "$")(1)      'Alphanumerique
    
    0
  3. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Scuti, bonjour le forum,

    Essaie comme ça :

    Sub Macro1()
    Dim BE As Variant 'déclare la variable BE (Boîte d'Entrée)
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim R As Range 'déclare la variable R (Recherche)
    Dim COL As Integer 'déclare la variable COL (Colonne)
    
    BE = Application.InputBox("Tapez le texte recherché !", "TEXTE", Type:=2) 'définit la boîte d'entrée BE
    If BE = False Or BE = "" Then Exit Sub 'si [Annuler] ou non renseignée, sort de la procédure
    Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
    Set R = O.Rows(1).Find(BE, , xlValues, xlWhole) 'définit la recherche R (recheche BE entier dans la ligne 1 de l'onglet O)
    If R Is Nothing Then Exit Sub 'si aucun occurrence n'est trouvée, sort de la procédure
    COL = R.Column 'récupe la colonne COL de la première occurrence trouvée
    MsgBox COL 'message indiquant la colonne COL (ligne à supprimer par la suite...)
    End Sub
    0
  4. paul
     
    Bonjour scuti,

    Non, il n'existe pas une telle fonction : tu dois faire une boucle de
    recherche sur ta ligne d'en-têtes afin d'en trouver le nom.

    Exemple :

    Ta ligne d'en-têtes est en ligne 5, des colonnes 1 à 10 ;
    et tu cherches la valeur d'en-tête "Montant" :

    
    Option Explicit
    
    Dim col As Integer
    
    For col = 1 To 10
      If Cells(5, col) = "Montant" Then
        ' Traitement pour la colonne "Montant"
        Exit For
      End If
    Next col
    
    ' Suite du code
    
    

    Si on a trouvé la colonne "Montant" :

    a) Exit For permet de sortir aussitôt de la boucle, car c'est inutile
        de tester les autres colonnes qui sont à droite.  ;)

    b) col contient ton n° de colonne

    ----------------------------------------

    Si ton Traitement est très long, tu peux le déporter plus bas
    en utilisant une variable drapeau : flag (ou un autre nom
    de ton choix).

    ⚠  Lors de sa déclaration, flag vaut déjà False ; je lui donne
    ce sens : « colonne "Montant" non trouvée ».

    
    Option Explicit
    
    Dim col As Integer, flag as Boolean
    
    For col = 1 To 10
      If Cells(5, col) = "Montant" Then flag = True: Exit For
    Next col
    
    If flag Then
      ' Traitement pour la colonne "Montant"
    End If
    
    ' Suite du code
    
    

    flag est un drapeau : False (implicite) = non trouvé ;
    si "Montant" est trouvé, flag est mis à True puis on
    sort aussitôt de la boucle.

    Juste après, et seulement si flag est True, on effectue
    le traitement de la colonne "Montant".

    Tu auras remarqué que If flag = True Then peut être
    abrégé en If flag Then ; c'est pas un oubli !  ;)
     
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. scuti Messages postés 31 Statut Membre
     
    Merci pour toutes vos réponses, mais du-coup je ne sais pas la quelle choisir.

    Mettons que je veux rajouter ça après, avec la colonne C:C étant la colonne sélectionner par son nom,


    Sub Macro5()
    '
    ' Macro5 Macro
    '
    ' Touche de raccourci du clavier: Ctrl+Shift+G
    '
    Range("A:A,C:C").Select
    Range("C1").Activate
    ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
    ActiveChart.SetSourceData Source:=Range("Feuil1!$A:$A,Feuil1!$C:$C")
    End Sub


    (c'est ce qui créée un graphique avec A:A et C:C)

    Que doit je mettre à la place de C:C
    et quel programme choisir ?
    0
  7. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour le fil, bonjour le forum,

    Les deux codes sont assez similaires. J'ai utilisé la fonction Find pour trouver la colonne et Paul a utilisé une boucle For... Next.
    Mon code utilise une boîte d'entrée te permettant de taper le nom de la recherche. Si ce nom est fixe et ne varie jamais, les lignes faisant référence à la boîtes d'entrée deviennent inutile dans mon code...
    Mais tu ne dis absolument rien la-dessus ?!... Je me demande même si tu as testé les deux codes...

    Quoi qu'en soit, et bizarrement, nous avons utilisé le même nom pour la variable Paul et moi-même : col.

    Donc au final pour ton code, remplace :
    Range("A:A,C:C").Select
    Range("C1").Activate 

    par :
    Application.Union(Columns(1), Columns(col)).Select
    Cells(1, col).Activate

    puis le reste de ton code...

    0
    1. scuti Messages postés 31 Statut Membre
       
      Voici le code en entier:


      Dim BE As Variant
      Dim O As Worksheet
      Dim R As Range
      Dim COL As Integer

      BE = Application.InputBox("vitesse", "TEXTE", Type:=2)
      If BE = False Or BE = "" Then Exit Sub
      Set O = Worksheets("Feuil1")
      Set R = O.Rows(1).Find(BE, , xlValues, xlWhole)
      If R Is Nothing Then Exit Sub
      COL = R.Column
      MsgBox COL
      '
      Application.Union(Columns(1), Columns(COL)).Select
      Cells(1, COL).Activate
      ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
      ActiveChart.SetSourceData Source:=Range("Feuil1!$A:$A,Feuil1!$C:$C")


      Le mot à trouver est vitesse dans la première ligne de l'onglet Feuil1, Quand je l'execute une boite appeler TEXT apparais mais pas de graphique (colonne vtesse en fonction de la colonne A:A)..



      J'ai du louper un truc ^^

      Merci de ton aide
      0
  8. scuti Messages postés 31 Statut Membre
     
    Merci à tout le monde pour vos réponses
    0