Sélectionner une colonne en fonction du nom de première valeur [Résolu/Fermé]

Signaler
Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017
-
Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017
-
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

Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60857 internautes nous ont dit merci ce mois-ci

Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017

Super, Merci beaucoup, ça fonctionne :D
Messages postés
15349
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
22 septembre 2020
1 361
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
Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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
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 !  ;)
 
Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017

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 ?
Messages postés
1402
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
13 septembre 2020
141
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...

Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017

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
Messages postés
31
Date d'inscription
jeudi 29 juin 2017
Statut
Membre
Dernière intervention
24 juillet 2017

Merci à tout le monde pour vos réponses