[VBA] Sélectionner plusieurs colonnes par variable chaine [Résolu]

Signaler
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour les internautes,

Je rencontre une petite difficulté au niveau de mon script VBA qui a pour but de créer une série de graphiques  en fonction du nombre de mesures que contient le fichier texte.

Mon soucis est que je souhaite faire mes propres sélections pour éditer mes graphiques puisque la colonne 'Temps' est tout le temps utilisée. Pour ceci, je concatène des éléments pour obtenir une chaîne de caractères de la forme "C:C,E:E" par exemple.
Ensuite je souhaite donc sélectionner ces colonnes en faisant Range(maSelection).Select pour éditer mon graphique.

Cependant, Range(maSelection).Select donne une erreur et sort de mon programme car ce n'est surement pas la bonne méthode. Avez-vous une autre méthode ???

Merci pour votre aide,

Aurelangelo

18 réponses

Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Problème résolue :
    Dim maPlage as Range;
   Set maPlage = .Union(.Columns(3), .Columns(numCol))
   maPlage.Select
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Si, ça semble bon.
Quelle est cette erreur ?
Quel est le contenu de ta variable maSelection au moment de l'erreur ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

ma variable maSelection contient "C:C,E:E"
donc au niveau du range j'ai : Range("C:C,E:E").Select et c'est ça qui ne marche pas ! et je ne vois pas pourquoi
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

j'ai le même résultat si j'utilise Columns(maSelection).Select
avec toujours maSelection qui est de type String et qui contient "C:C,E:E"
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Re
Revérifie bien le contenu de maSelection car chez moi, cela fonctionne
    Dim maSelection As String
    maSelection = "C:C,E:E"
    Range(maSelection).Select

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
PS : Es-tu sûr que l'objet actuellement sélecté est bien ta feuille ?
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

  Voila comment je construis ma chaine :

Dim selection as String
selection = "C:C," &amp; Chr(Asc("A") + (numCol - 1)) &amp; ":" &amp; Chr(Asc("A") + (numCol - 1))    ' la chaîne contient bien un des exemples ci-dessus
xl.Columns(selection).Select ' sélection des colonnes déterminer par la chaîne ci dessus


Cependant, mon programme plante toujours au niveau du columns car il ne doit pas accepter ma chaîne selection. Alors si vous avez une idée, je suis totalement preneur ! merci
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Re
Ah bah voilà, c'est mieux quand on déploie le vrai code :
Ta variable s'appelle "selection" qui est un mot clé de VB --> Incompatible
Appelle la maSelection, comme écrit dans tes exemples précédents

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Même en changeant celà, ça ne résoud pas mon problème
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Fais une chose :
Ouvre un nouveau classeur Excel et copie/colle le code que j'ai mis dans ma deuxième réponse.
Associe ce code à un bouton que tu places sur ta feuille et clique dessus
Tu verras que cela fonctionne très bien.
Donc, il y a fort à parier que le problème est dans ton code.

Si cela t'ai possible, copie/colle nous ton vrai code (pas un roman, juste la Sub
Jette un oeil voir si tu n'aurais pas dimensionné une variable en type Private ou Public qui utiliserait un mot réservé du langage, cela peut avoir des conséquences bizarr, des fois; d'où l'intérêt d'utiliser une norme d'appellation des variables et fonctions dite "à la hongroise".

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Oui en effet, ça fonctionne très bien tant que je suis sur la même fenêtre.

Par contre, mon programme ouvre un fichier texte (demandé sur clic bouton d'une première fenêtre excel)  dans une autre fenêtre Excel et là ça doit être mon code qui merdouille un poil alors je le poste en partie :

Dim chemin As String ' chemin du fichier
Dim nomfichier As String ' nom du fichier
Dim xl As Excel.Application ' application excel
Dim xlsClass As Excel.Workbook ' classeur excel
Dim xlsFeuille As Excel.Worksheet ' feuille excel

Dim colonne As Integer

Sub TraiterDonnees_Clic() 
   ' ouverture du fichier de mesures
    Set xl = CreateObject("Excel.Application")
   
    On Error Resume Next
        chemin = xl.GetOpenFilename
        xl.Workbooks.OpenText (chemin)
       
        ' récupération du nom du fichier
        Dim TabSplit() As String
        TabSplit = Split(chemin, "")
        nomfichier = TabSplit(UBound(TabSplit))
       
        'affichage du résultat
        xl.Visible = True
       
        ' dépouillement d'un essai puissance
        Call depouille_un_essai_puissance
 
    On Error GoTo 0
   
End Sub

Private Sub depouille_un_essai_puissance()
    Call Depouillement
    Call SousEchantillonnage
    Call miseenforme
   
    For n = 4 To colonne
        Call graphique(n)
    Next n
End Sub

Private Sub graphique(ByVal numCol As Integer)
'
    With xl
   
        Dim maSelection As String
         maSelection = "C:C," & Chr(Asc("A") + (numCol - 1)) & ":" & Chr(Asc("A") + (numCol - 1))
         duree = 1.2 * .Cells(4, 4).Value
         titre = .ActiveSheet.Name
         .Range(maSelection).Select
         '.Columns(selection).Select
         .Charts.Add
         .ActiveChart.ChartType = xlXYScatterSmooth
        .ActiveChart.SetSourceData Source:=.Sheets(titre).Range(maSelection), PlotBy:=xlColumns
         .ActiveChart.Location Where:=xlLocationAsObject, Name:=titre
         With .ActiveChart
             .HasTitle = True
             .ChartTitle.Characters.Text = titre
             .Axes(xlCategory, xlPrimary).HasTitle = True
             .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps(S)"
             .Axes(xlValue, xlPrimary).HasTitle = True
             .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Puissance (kW)"
         End With
    End With
End Sub

J'espère que tu vas pouvoir m'aider.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Bah comme je te le disait lors de ma 3ème réponse, il faut bien sûr s'assurer que l'ordre sera bien donné à la bonne feuille.
Une sélection de la feuille est facile à faire, non ?
même si la feuille appartient à un autre classeur, il suffit de respecter la syntaxe   
Mais de toute façon, la macro ne marcherait pas, certes, mais elle n'engendrerait pas d'erreur.

Juste avant cette ligne qui pose problème
   .Range(maSelection).Select

peux-tu ajouter 
   Debug.Print Titre
   Debug.Print maSelection
Vérifie que la feuille actuellement sélectée est bien la bonne + être sûr et certain que ta variable maSelection n'a pas d'erreur de syntaxe

As-tu demander la déclaration obligatoire des variables dans les options ?
Cela ajoute Option Explicit en tête de toute nouvelle page de code (ajoute le à la main pour les pages de codes existantes)
Je te le recommande fortement pour palier aux problème des erreurs de saisie bêtes et méchantes

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Je viens d'effectuer ce que tu viens de dire et toujours la même chose.
Erreur au niveau du .Range(maSelection).Select dans la fonction graphique alors que la variable maSelection contient ce qu'il faut (C:C,D:D) et que la fenêtre active est bien celle desirée.

Alors je sèche ...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Détail : Si maSelection contient (C:C,D:D)  il y a un problème : parenthèses en trop !

Désolé, mais je suis à court d'idée ... à moins que :
Le With x1 s'adresse à l'application et pas à la feuille !
Peut-être que .ActiveSheet.Range(...  marcherait mieux !
lol, tellement gros qui'on ne l'a pas vu
En plus, tu aurais dû t'en apercevoir parce que l'intellisense ne doit pas fonctionner puisque c'est pas le bon objet.

Ah lala, les habitudes
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Précision :
 maSelection contient la chaine "C:C,D:D"
 j'utilise xl dans toute ma macro et ça fonctionne parfaitement sauf à cet endroit ou je fais une sélection des colonnes

je seche je seche
Messages postés
12
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

Je relance un peu le sujet car j'en suis toujours au même point !

Je veux obtenir un graphique contenant une courbe de chaque mesure
contenue dans mon fichier texte (courbe en fonction du temps).

Dans mes courbes, la colonne C est toujours sélectionnée et l'autre est soit la D, la E, ... (selon le nombre de mesures).


Je récapitule mon projet et les étapes successives à faire :

- j'ouvre un fichier .xls qui contient ma macro et un bouton

- Au clic sur le bouton, ma macro s'exécute et demande un fichier à analyser

- le fichier choisi, une autre fenêtre excel s'ouvre avec les données

- Il s'en suit toute une série de traitement (échantillonnage, ajout de colonnes, mise en forme, ...)

- le dernier traitement est l'édition des graphiques (une courbe par graphique) ==> A partir de cette étape, je rencontre un problème de sélection de colonnes.


Diverses solutions testées :

- J'ai regardé le code créé par l'éditeur de macros et adapter à mon cas ==> code erreur sur la sélection des plages

- Essayer en utilisant une sélection par défaut, par exemple sélection des colonnes C et D soit C:D en excel et là : OK

- Essayer en utilisant une sélection par défaut, par exemple sélection des colonnes C et D soit C:C,D:D en excel et là : Ne fonctionne pas, pourtant l'enregistreur de macro préconise cette solution


Alors je cherche pourquoi ça ne veut pas alors que dans un cas, cela fonctionne !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Re
J'ai relu tous nos échanges, mais je ne trouve pas trace de l'erreur elle même : que dit-elle ? (n° et texte)
As-tu un "ption Explicit" en haut de chacune de tes pages de code ? (voir options vb "déclaration obligatoire de toutes les variables")
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Cool
Je me permets de modifier le titre de ta question afin que d'autres membres trouvent plus facilement ta solution à un problème identique.