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

Résolu/Fermé
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017 - 29 juin 2017 à 10:28
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017 - 30 juin 2017 à 09:07
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

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
29 juin 2017 à 19:58
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
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017
30 juin 2017 à 09:06
Super, Merci beaucoup, ça fonctionne :D
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
29 juin 2017 à 12:36
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
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
29 juin 2017 à 12:38
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017
Modifié le 29 juin 2017 à 14:29
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
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
29 juin 2017 à 15:36
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
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017
29 juin 2017 à 16:17
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
scuti Messages postés 31 Date d'inscription jeudi 29 juin 2017 Statut Membre Dernière intervention 24 juillet 2017
30 juin 2017 à 09:07
Merci à tout le monde pour vos réponses
0