Récupérer adresse cellule pour sélection

bibi_fricotin Messages postés 201 Statut Membre -  
purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   -
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. bibi_fricotin Messages postés 201 Statut Membre 23
     
    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
  2. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  3. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  4. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  7. bibi_fricotin Messages postés 201 Statut Membre 23
     
    merci beaucoup purrofixe
    j'essaye et te tiens au courant
    bon WE
    0
  8. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    Merci

    Salutations
    Jean-Pierre
    0
  9. bibi_fricotin Messages postés 201 Statut Membre 23
     
    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
  10. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  11. bibi_fricotin Messages postés 201 Statut Membre 23
     
    bonsoir purrofixe
    je voudrais donc séléctionner une plage de cellules :
    ex : L10C1 :L11C5
    Merci.
    0
  12. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  13. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  14. bibi_fricotin Messages postés 201 Statut Membre 23
     
    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
  15. bibi_fricotin Messages postés 201 Statut Membre 23
     
    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