VBA - Sélectioner une plage de cellules

Résolu
zivodul8 Messages postés 248 Statut Membre -  
zivodul8 Messages postés 248 Statut Membre -
Bonjour,

Comme l'indique le titre de ce post, je souhaite sélectionner une plage de données à partir d'un UserForm Excel.

J'ai essayé avec un RefEdit mais le problème et que la valeur renvoyée est : Données!$C$2:$C$11. Or pour la suite de ma macro j'ai uniquement besoins du numéro de la première ligne et le numéro de la dernière ligne.

J'ai fait des recherches sur Google mais je n'ai pas trouvé d'instruction permettant d'extraire ces numéros de lignes.

Merci beaucoup!!

6 réponses

  1. ed555 Messages postés 61 Date d'inscription   Statut Membre Dernière intervention  
     
    salut,

    je pense pouvoir t'aider mais je ne saisis pas trop la partie qui pose problème :

    comment est-ce-que tu détermines la plage à sélectionner si tu ne connais pas la première ligne et la dernière ligne de cette plage ?

    précise un peu s'il te plaît
    0
  2. zivodul8 Messages postés 248 Statut Membre 22
     
    RefEdit est un "bouton" qui s'intègre à un UserForm et qui permet de sélectionner directement dans une feuille de calcul une plage de donnée. Et en gros :

    UserForm1.RefEdit1.Value = "Données!$C$2:$C$11"

    Peut être qu'il y a un autre moyen de sélectionner une plage de données directement mais je ne vois que celle là.
    0
  3. ed555 Messages postés 61 Date d'inscription   Statut Membre Dernière intervention  
     
    au temps pour moi, je ne connaissais pas. je viens de tester et de découvrir à quoi ça sert !

    ceci dit j'ai cherché un peu et bidouillé ça :

    'tu récupères ce qu'il y a dans ton RefEdit
    MaChaine = UserForm1.RefEdit1.Value

    Tableau = Split(MaChaine, "!")
    Sheets(1).Range("A1").Value = MaChaine
    'première partie du split
    Sheets(1).Range("A2").Value = Tableau(0)

    'deuxième partie du split
    Sheets(1).Range("A3").Value = Tableau(1)

    'récupérer les adresses
    Tableau2 = Split(Tableau(1), ":")

    '1ere cellule
    Sheets(1).Range("A4").Value = Tableau2(0)
    'derniere cellule
    Sheets(1).Range("A4").Value = Tableau2(1)
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    il faut déclencher par un bouton (ou autre) dans l'usf

    Private Sub CommandButton1_Click()
        Dim zone As String
            zone = RefEdit1.Value
         With Range(zone)
              MsgBox "ligne haute: " & .Row
              MsgBox "ligne basse: " & .Row + .Rows.Count - 1
         End With

    à adapter
    0
    1. ed555 Messages postés 61 Date d'inscription   Statut Membre Dernière intervention  
       
      ah oui, c'est beaucoup plus élégant que ma solution bricolée !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zivodul8 Messages postés 248 Statut Membre 22
     
    C'est exactement ça, merci Michel! Désolé ed555, j'ai pas compris comment tu procédés et c'est un peu long à mon goût.

    Du coup j'ai voulu pousser un peut plus et extraire la colonne. Grâce à :

         With Range(plage)
              Pligne = .Row
              Dligne = .Row + .Rows.Count - 1
              colonne = .Column
         End With


    Le souci c'est que pour la colonne C par exemple, il me renvoi 3. Comment faire pour la convertir en caractère?
    0
    1. ed555 Messages postés 61 Date d'inscription   Statut Membre Dernière intervention  
       
      tu as eu raison de prendre la solution de michel_m, elle est meilleure !

      pour ce qui est de convertir le numéro de colonne en lettre j'ai bien une idée mais pas très élégante... en gros tu actives une cellule de la colonne avec cells(1,n_colonne).Activate puis :

      'tu récupères l'adresse
      n = ActiveCell.Address
      'dans l'adresse tu récupères seulement la lettre de la colonne
      lettre_colonne = Right(Left(n, 2), 1)
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Généralement en VBA on bosse avec la valeur numérique, plus facile (boucle par ex) à manipuler et moins vorace en RAM qu'un string

      par exemple cells(2,3) est équivalent à range("C2")


      mais on peutx bricoler une fonction pour retrouver la lettre

      ci dessous mon bidouillage pour 2003 (colonne maxi 256 = IV) à améliorer

      Function car_col(num As Integer) As String
      Dim serie As Byte
      Select Case num
          Case Is = 0
              car_col = "#########"
          Case Is < 27
              car_col = Chr(64 + num)
          Case Else
              serie = Int((num - 26) / 27) + 1
              car_col = Chr(64 + serie) & Chr(64 + num - 26 * serie)
      End Select
      
      End Function
      

      mais ce n'est pas ce que j'ai fait de mieux et son utilité m'a rarement convaincu
      0
  7. zivodul8 Messages postés 248 Statut Membre 22
     
    1 partout!!

    J'y avais pensé aussi mais j'attendais de voir s'il y avait mieux mais finalement je vais prendre la solution proposer par ed555. J'ai toujours travailler avec Range("A1").Value (une bêtise apparemment), donc je me vois mal modifier toute ma macro

    Merci à vous deux donc et bonne continuation =)
    0