Récupérer adresse cellule pour sélection

bonjour,
je voudrais séléctionner une plage de cellules qui contient le même nom, en partant de la cellule A10, la colonne A contenant les noms (ex A10=MARTIN; A11=BIBI;A12=BIBI;A13=DUPONT;etc.), pour les encadrer (donc pouvoir bien identifier chaque nom).
ça bloque après ELSE

Range("A10").Select

While ActiveCell.Value <> ""
Dim nom As String
Dim refnom As Range

If ActiveCell.Value = nom Then
Range(ActiveCell + 1).Select
Else
Range(Cells(refnom.Row, 1), Cells(ActiveCell.Row, 6)).Select

Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone

End If

Wend


Quelqu'un aurait-il une solution ?
Merci.

14 réponses

  1. Bonjour bibi_fricotin
    Je suppose que c'est Excel VBA ....

    Que voulez-vous encadrer exactement ?

    Vous dites: ça bloque après ELSE ..mais avec le début de la macro qui manque.....
    et en plus dans If ActiveCell.Value = nom Then le "nom" est initialisé ou ...
    Merci de préciser.

    Salutations
    Jean-Pierre
    0
    1. pardon oui c'est du VB excel 97
      pour le 'nom", on est d'identifier la 1ère cellule pour la comparer à la suivante : si la suivante comporte le même nom, il faut passer à la suivante, etc.
      Une fois identifié le groupe de cellules ayant le même nom, il faut l'encadrer d'un trait plein, lui appliqué une mise en forme donc.
      ouf! j'espère que c'est assez clair (ce genre de macro était plus simple à faire avec les macros excel4)
      1
      1. Bonsoir bibi_fricotin,
        Merci pour les précisions c'est parfait.
        Pour pouvoir vous répondre correctement j'ai besoin de voir
        toute la fonction (Sub Macro1()...... à.....End sub),
        car j'ai déjà découvert quelque élément bizarre..
        Faite donc un copier / coller; Merci.

        Salutations
        Jean-Pierre
        0
        1. voilà la bête, avec une boucle qui ouvrent tous les fichiers d'un répertoire (merci à http://vlohr.free.fr )

          Sub Boucle_sur_fichier()
          'Application.ScreenUpdating = False
          Dim Cherche As Variant
          Dim Boucle As Variant
          Set Cherche = Application.FileSearch
          With Cherche
          .LookIn = "C:\data\g8_\fdp\"
          .FileName = "*.xls"
          If .Execute > 0 Then
          For Boucle = 1 To .FoundFiles.Count
          Workbooks.OpenText FileName:=.FoundFiles(Boucle), Origin:=xlMSDOS, _
          StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
          ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
          , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
          Array(3, 1), Array(4, 2), Array(5, 1), Array(6, 1))

          With ActiveSheet.PageSetup
          .PrintTitleRows = "$1:$9"
          .PrintTitleColumns = ""
          End With
          ActiveSheet.PageSetup.PrintArea = ""
          With ActiveSheet.PageSetup
          .LeftHeader = ""
          .CenterHeader = ""
          .RightHeader = ""
          .LeftFooter = ""
          .CenterFooter = "&P/&N"
          .RightFooter = "&F &D"
          .LeftMargin = Application.InchesToPoints(0.196850393700787)
          .RightMargin = Application.InchesToPoints(0.196850393700787)
          .TopMargin = Application.InchesToPoints(0.393700787401575)
          .BottomMargin = Application.InchesToPoints(0.590551181102362)
          .HeaderMargin = Application.InchesToPoints(0.511811023622047)
          .FooterMargin = Application.InchesToPoints(0.31496062992126)
          .PrintHeadings = False
          .PrintGridlines = True
          .PrintComments = xlPrintNoComments
          .CenterHorizontally = True
          .CenterVertically = False
          .Orientation = xlPortrait
          .Draft = False
          .PaperSize = xlPaperA4
          .FirstPageNumber = xlAutomatic
          .Order = xlDownThenOver
          .BlackAndWhite = False
          .Zoom = 100
          End With
          Columns("A:A").Select
          Selection.ColumnWidth = 30
          Columns("B:B").Select
          Selection.ColumnWidth = 7
          Columns("C:C").Select
          Selection.ColumnWidth = 5
          Columns("D:D").Select
          Selection.ColumnWidth = 10
          Columns("E:E").Select
          Selection.ColumnWidth = 12
          Columns("F:F").Select
          Selection.ColumnWidth = 55
          Cells.Select
          With Selection
          .HorizontalAlignment = xlGeneral
          .VerticalAlignment = xlCenter
          .WrapText = False
          .Orientation = 0
          .ShrinkToFit = False
          .MergeCells = False
          End With
          With Selection.Font
          .Name = "Arial"
          .Size = 10
          .Strikethrough = False
          .Superscript = False
          .Subscript = False
          .OutlineFont = False
          .Shadow = False
          .Underline = xlUnderlineStyleNone
          .ColorIndex = xlAutomatic
          End With
          With Selection.Font
          .Name = "Arial"
          .Size = 8
          .Strikethrough = False
          .Superscript = False
          .Subscript = False
          .OutlineFont = False
          .Shadow = False
          .Underline = xlUnderlineStyleNone
          .ColorIndex = xlAutomatic
          End With
          Range("A8").Select
          Selection.Font.Bold = True
          Rows("9:9").Select
          With Selection
          .HorizontalAlignment = xlCenter
          .VerticalAlignment = xlCenter
          .WrapText = False
          .Orientation = 0
          .ShrinkToFit = False
          .MergeCells = False
          End With
          Selection.Font.Bold = True
          Rows("10:200").Select
          Selection.RowHeight = 30
          Range("A9").Select
          If a10 <> "" Then
          Selection.Sort Key1:=Range("B10"), Order1:=xlDescending, Key2:=Range( _
          "A10"), Order2:=xlAscending, Key3:=Range("D10"), Order3:=xlAscending, _
          Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
          xlTopToBottom
          Else
          End If

          Range("A10").Select

          While ActiveCell.Value <> ""
          Dim nom As String
          Dim refnom As Range

          If ActiveCell.Value = nom Then
          Range(ActiveCell + 1).Select
          Else
          Range(Cells(refnom.Row, 1), Cells(ActiveCell.Row, 6)).Select

          Selection.Borders(xlDiagonalDown).LineStyle = xlNone
          Selection.Borders(xlDiagonalUp).LineStyle = xlNone

          End If

          Wend


          Range("B2").Select
          Selection.ClearContents
          Range("A1").Select

          Next Boucle
          End If
          End With
          End Sub
          -1
          1. Bonsoir bibi_fricotin,
            Merci. Super votre macro pour ouvrir successivement tous les fichiers d’un répertoire.
            Vous voulez donc y insérer une procédure pour encadrer le ou les noms qui se suivent pour chaque fichier.

            Les noms commencent toujours dès la cellule « A10 » >> oui-non

            Je suis en train de tester la partie qui vous intéresse, soit celle qui correspond à votre premier message.
            J’ai juste un problème avec « refnom » car il manque une instruction.
            Le résultat pour demain.

            Salutations
            Jean-Pierre
            0
            1. Bonsoir bibi_fricotin,
              Je suppose que vous avez pensé de d’abord trier les noms (il doivent se suivre alphabétiquement, sinon Xavier une fois au début et aussi à la fin…).
              Vous pouvez placer cette macro dans votre module et remplacer la partie correspondante par l’instruction : Application.Run "bibi_fricotin_encadrer"
              Si vous la placée directement dans votre procédure vous supprimez les lignes :
              Sub bibi_fricotin_encadrer() et End Sub.
              Voici ma participation :
              Sub bibi_fricotin_encadrer()
              '
              ' Macro enregistrée le 12.11.2004 par Jean-Pierre Purro
              'Récupérer la plage des noms et le nombre , début Li 5, dans Col A
                  vPlageNom = Range("A5:A" & Range("A5").End(xlDown).Row)
                  vNbNom = Range("A5").End(xlDown).Row - (5 - 1)
                  vDéNomX = 5
                  vFiNomX = 5
                  vCount = 1
              'Début boucle sur nom
               For Each vNom In vPlageNom
              'Nom suivant différent >> encadrer la plage
                  If Cells(vDéNomX + vCount, 1).Value <> vNom Then
                      Range(Cells(vDéNomX, 1), Cells(vFiNomX, 1)).Select
                     With Selection.Borders(xlEdgeLeft)
                      .LineStyle = xlContinuous
                      .Weight = xlMedium
                      .ColorIndex = xlAutomatic
                     End With
                     With Selection.Borders(xlEdgeTop)
                     .LineStyle = xlContinuous
                      .Weight = xlMedium
                      .ColorIndex = xlAutomatic
                     End With
                     With Selection.Borders(xlEdgeBottom)
                      .LineStyle = xlContinuous
                      .Weight = xlMedium
                      .ColorIndex = xlAutomatic
                     End With
                     With Selection.Borders(xlEdgeRight)
                      .LineStyle = xlContinuous
                      .Weight = xlMedium
                      .ColorIndex = xlAutomatic
                     End With
              'Icrémenter les compteurs début, comptage et fin
                      Let vDéNomX = vDéNomX + vCount
                      Let vCount = 1
                      Let vFiNomX = vDéNomX
                  Else
              'Incrémenter les compteurs fin et comptage
                      Let vCount = vCount + 1
                      Let vFiNomX = vFiNomX + 1
                  End If
                Next vNom
              End Sub

              Bonne fin de semaine.

              Salutations
              Jean-Pierre
              0
              1. merci beaucoup purrofixe
                j'essaye et te tiens au courant
                bon WE
                0
                1. Merci

                  Salutations
                  Jean-Pierre
                  0
                  1. j'ai donc essayé ta macro : elle marche super bien
                    j'ai rajouté une condition au cas où la première cellule serait vide
                    pour cette ligne : Range(Cells(vDéNomX, 1), Cells(vFiNomX, 1)).Select
                    comment pourrait-on l'écrire pour sélectionner de la colonne A à une autre colonne ?
                    merci encore
                    0
                    1. Bonsoir bibi_fricotin,
                      Merci pour le message.
                      Par principe la première cellule de la plage à encadrer ne doit pas être vide, enfin c’est vous qui savez ou doit commencer le travail.
                      De toute manière elle serait comprise dans la vPlageNom et de ce fait serait traité comme un nom vide, donc pas de condition en plus.
                      Si nécessaire vous pouvez me joindre @@ sans problème.
                      Cette demande n’est pas clair (comment pourrait-on l'écrire pour sélectionner de la colonne A à une autre colonne ?)…
                      Si référence à Range(……), il s’agit de référence L1C1 (L>>ligne et C>> colonne)
                      Dans se cas pour la colonne « H » c’est la valeur 8 ; (Range(Cells(vDéNomX, 8), Cells(vFiNomX, 8)).Select).

                      Salutations
                      Jean-Pierre
                      0
                      1. bonsoir purrofixe
                        je voudrais donc séléctionner une plage de cellules :
                        ex : L10C1 :L11C5
                        Merci.
                        0
                        1. Bonsoir bibi_fricotin,
                          Simplement:
                          1- en L1C1 >>> range(Cells(10,1),Cells(11,5); je l'utilise de préférence lorsque j'utilise les valeurs de compteur, c'est plus direct.
                          ou alors
                          2- en A1 >>>> Range("A10:E11")

                          Salutations
                          Jean-Pierre
                          0
                          1. merci pour ta réponse
                            en fait, je voulais récupérer le nombre de lignes pour sélectionner une plage de cellules
                            voici la macro finie (ou presque, je vais rajouter un autorun et des messages dans la barre d'état).
                            encore merci et bonne journée.

                            'si A10 est vide passe au fichier suivant

                            Range("A10").Select
                            If ActiveCell.Value <> "" Then
                            Range("A9").Select
                            Selection.Sort Key1:=Range("B10"), Order1:=xlDescending, Key2:=Range("A10"), Order2:=xlAscending, Key3:=Range("D10"), Order3:=xlAscending, Header _
                            :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

                            Range("A10").Select
                            'Récupérer la plage des noms et le nombre , début Li 6, dans Col A
                            vPlageNom = Range("A10:A" & Range("A10").End(xlDown).Row)
                            vNbNom = Range("A10").End(xlDown).Row - (10 - 1)
                            vDéNomX = 10
                            vFiNomX = 10
                            vCount = 1
                            'Début boucle sur nom
                            For Each vNom In vPlageNom
                            'Nom suivant différent >> encadrer la plage
                            If Cells(vDéNomX + vCount, 1).Value <> vNom Then

                            Range(Cells(vDéNomX, 1), Cells(vFiNomX, 6)).Select

                            With Selection.Borders(xlEdgeLeft)
                            .LineStyle = xlContinuous
                            .Weight = xlThin
                            .ColorIndex = xlAutomatic
                            End With
                            With Selection.Borders(xlEdgeTop)
                            .LineStyle = xlContinuous
                            .Weight = xlThin
                            .ColorIndex = xlAutomatic
                            End With
                            With Selection.Borders(xlEdgeBottom)
                            .LineStyle = xlContinuous
                            .Weight = xlThin
                            .ColorIndex = xlAutomatic
                            End With
                            With Selection.Borders(xlEdgeRight)
                            .LineStyle = xlContinuous
                            .Weight = xlThin
                            .ColorIndex = xlAutomatic
                            End With
                            'Icrémenter les compteurs début, comptage et fin
                            Let vDéNomX = vDéNomX + vCount
                            Let vCount = 1
                            Let vFiNomX = vDéNomX
                            Else
                            'Incrémenter les compteurs fin et comptage
                            Let vCount = vCount + 1
                            Let vFiNomX = vFiNomX + 1
                            End If
                            Next vNom

                            Else
                            End If
                            -1
                            1. Bonsoir bibi_fricotin,
                              Merci pour le message.
                              Par curiosité j’ai contrôlé votre ajout et voici mon commentaire :
                              1.-
                              La plage à travailler est récupéré (les noms et par définition son nombre) directement dans l’instruction : vPlageNom = Range(« A10……………….) et vNbNom = Range(…….), a noté que vNbNom n’est pas utilisé dans cette procédure et peut être supprimer.
                              2.-
                              La base de départ est fixé comme suit : la plage des noms, début Li 10, dans Col A, de ce fait la deuxième instruction (Range("A10").Select), juste devant 'Récupérer la plage….. , est inutile.
                              3.-
                              Votre instruction : If ActiveCell.Value <> "" Then, fait terminer la procédure si la cellule est vide >>> donc pas d’encadrement pour les noms qui suivent !!!!!
                              A mon avis, cette instruction est parfaitement inutile, car s’il s’agit ensuite de faire un tri, il suffit de le prévoir sur une plage sans titre de colonne.
                              4.-
                              Pour effectuer un tri, il faut sélectionné une plage de cellule (avec ou sans titre de colonne) et ensuite vous pouvez donné l’instruction : Selection.Sort Key1:=Range("B10")……., dans votre cas vous recevez une erreur d’exécution ‘1004’ >> Référence de tri non valide.
                              A vous de contrôler ce problème car je ne connais pas la structure de votre base de données.

                              Au cas ou, vous savez ou me joindre @ si nécessaire.
                              Bonne semaine

                              Salutations
                              Jean-Pierre
                              0