Bonjour;
J'ai fais une macro (code en bas du poste) pour excel 97 (avec VB 5 ou
moins). En gros cette macro recherche les plages nommées (en colonne A) et
fait avec pour chacunes d'elles une mise en forme bordure (contour + bordure
verticale) de la colonne A a la colonne O.
Après passage vers excel 2003 et VB6.3, cette même macro marche mal: il y a
un message d'erreur(erreur d'execution 1004 la methode 'Range' de
l'objet'_global' a echoué) et le débogeur selection la ligne de code
With Range(Nom).Offset(0, i).Borders .
A savoir que ma macro est quand même executée jusqu'a Next Nom .
Si quelqu'un à une idée du pourquoi du comment.
D'autre par si vous voyez des points d'améliorations; je suis preneur.
Merci par avance.
Voici le code:
Sub bordure()
Dim Nom As Name
Dim i As Byte
'effacece toutes les bordures
Range("A5:AI1000").Select
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
luck82
Bonjour, Merci de m'avoir repondu. Les plages nommées de mon classeur ne sont pas composées. j'ai que des choses comme: truc=$A$1:$A$5 par contre, j'ai des plages nommées d'une seule cellule du style: truc2=$A$6, et aucunes plages ne ce recouvre (du style truc=$A$1:$A$5 et truc2=$A$5:$A$10). Ce qui me surprends c'est que sur les mêmes données, chez moi la macro marche (VB5) et à mon travail (VB6.3) ca me marche pas. Par contre la structure de mon classeur a mon travail est différente (2 feuilles de plus et le classeur est en réseau)!
J'essaierai votre macro lundi à mon travail car la fonction split ne marche pas avec VB5.
Merci pour le temps que vous n'avez consacré.
Cordialement.
Bonjour,
Merci de m'avoir repondu.
Les plages nommées de mon classeur ne sont pas composées. j'ai que des
choses comme: truc=$A$1:$A$5 par contre, j'ai des plages nommées d'une seule
cellule du style: truc2=$A$6, et aucunes plages ne ce recouvre (du style
truc=$A$1:$A$5 et truc2=$A$5:$A$10).
Ce qui me surprends c'est que sur les mêmes données, chez moi la macro
marche (VB5) et à mon travail (VB6.3) ca me marche pas.
Par contre la structure de mon classeur a mon travail est différente (2
feuilles de plus et le classeur est en réseau)!
J'essaierai votre macro lundi à mon travail car la fonction split ne marche
pas avec VB5.
Bonjour, Merci de m'avoir repondu. Les plages nommées de mon classeur ne sont pas composées. j'ai que des choses comme: truc=$A$1:$A$5 par contre, j'ai des plages nommées d'une seule cellule du style: truc2=$A$6, et aucunes plages ne ce recouvre (du style truc=$A$1:$A$5 et truc2=$A$5:$A$10). Ce qui me surprends c'est que sur les mêmes données, chez moi la macro marche (VB5) et à mon travail (VB6.3) ca me marche pas. Par contre la structure de mon classeur a mon travail est différente (2 feuilles de plus et le classeur est en réseau)!
J'essaierai votre macro lundi à mon travail car la fonction split ne marche pas avec VB5.
Merci pour le temps que vous n'avez consacré.
Cordialement.
luck82
Bonjour; La macro que vous n'avez donné ne mache pas; elle bloque à la ligne : With rgTemp.Offset(0, i).Borders
Bon de que j'aurais le courage, je vais essayer de voire ce qui ne va pas.
Bonne soirée.
"rvblog" a écrit dans le message de news:
Bonjour,
essaies de vérifier si, dans tes plages nommées, tu n'aurais pas des
plages
composées. Par exemple, "=truc!$C$12:$C$16,truc!$E$14:$E$16,truc!$F$19:$F$2" ou "=Rectangle 1,Rectangle 2" sont des plages composées.
Il me semble que, dans ce cas, l'objet implicite _global a du mal a
résoudre
la référence Range.
Si c'est le cas, je te propose une solution : Sub bordure() Dim varRanges As Variant Dim strSubNames As String Dim rgTemp As Range Dim Nom As Name Dim i As Byte 'effacece toutes les bordures Range("A5:AI1000").Select
For Each Nom In ActiveWorkbook.Names 'si c'est une plage composée If InStr(1, Nom, ",") > 0 Then 'sépare les plages en sous-plages varRanges = Split(Replace(Nom, "=", ""), ",", -1) 'pour chaque sous-plage For Each strSubName In varRanges 'récupère une référence à l'objet Range 'correspondant à la sous-plage courante Set rgTemp = Range(strSubName) 'applique les modifications voulues With rgTemp.Offset(0, i).Borders For i = 0 To 14 'bordures (contours + lignes verticales) par plages nommées de colonne A à colonnes O .LineStyle = xlContinuous .Item(xlEdgeTop).LineStyle = xlContinuous .Item(xlEdgeRight).LineStyle = xlContinuous .Item(xlInsideHorizontal).LineStyle = xContinuous Next i End With Next strSubName Else 'récupère une référence à l'objet Range 'correspondant à la plage courante Set rgTemp = Range(Nom) 'applique les modifications voulues With rgTemp.Offset(0, i).Borders For i = 0 To 14 'bordures (contours + lignes verticales) par plages nommées de colonne A à colonnes O .LineStyle = xlContinuous .Item(xlEdgeTop).LineStyle = xlContinuous .Item(xlEdgeRight).LineStyle = xlContinuous .Item(xlInsideHorizontal).LineStyle = xContinuous Next i End With End If Next Nom Range("A5").Select
End Sub
à+
Bonjour;
La macro que vous n'avez donné ne mache pas; elle bloque à la ligne :
With rgTemp.Offset(0, i).Borders
Bon de que j'aurais le courage, je vais essayer de voire ce qui ne va pas.
Bonne soirée.
"rvblog" <rvblog@discussions.microsoft.com> a écrit dans le message de
news:DC1014AB-E730-4AF5-AF0B-0E05D3D13045@microsoft.com...
Bonjour,
essaies de vérifier si, dans tes plages nommées, tu n'aurais pas des
plages
composées.
Par exemple, "=truc!$C$12:$C$16,truc!$E$14:$E$16,truc!$F$19:$F$2" ou
"=Rectangle 1,Rectangle 2" sont des plages composées.
Il me semble que, dans ce cas, l'objet implicite _global a du mal a
résoudre
la référence Range.
Si c'est le cas, je te propose une solution :
Sub bordure()
Dim varRanges As Variant
Dim strSubNames As String
Dim rgTemp As Range
Dim Nom As Name
Dim i As Byte
'effacece toutes les bordures
Range("A5:AI1000").Select
For Each Nom In ActiveWorkbook.Names
'si c'est une plage composée
If InStr(1, Nom, ",") > 0 Then
'sépare les plages en sous-plages
varRanges = Split(Replace(Nom, "=", ""), ",", -1)
'pour chaque sous-plage
For Each strSubName In varRanges
'récupère une référence à l'objet Range
'correspondant à la sous-plage courante
Set rgTemp = Range(strSubName)
'applique les modifications voulues
With rgTemp.Offset(0, i).Borders
For i = 0 To 14
'bordures (contours + lignes verticales) par plages
nommées de colonne A à colonnes O
.LineStyle = xlContinuous
.Item(xlEdgeTop).LineStyle = xlContinuous
.Item(xlEdgeRight).LineStyle = xlContinuous
.Item(xlInsideHorizontal).LineStyle = xContinuous
Next i
End With
Next strSubName
Else
'récupère une référence à l'objet Range
'correspondant à la plage courante
Set rgTemp = Range(Nom)
'applique les modifications voulues
With rgTemp.Offset(0, i).Borders
For i = 0 To 14
'bordures (contours + lignes verticales) par plages
nommées de colonne A à colonnes O
.LineStyle = xlContinuous
.Item(xlEdgeTop).LineStyle = xlContinuous
.Item(xlEdgeRight).LineStyle = xlContinuous
.Item(xlInsideHorizontal).LineStyle = xContinuous
Next i
End With
End If
Next Nom
Range("A5").Select
Bonjour; La macro que vous n'avez donné ne mache pas; elle bloque à la ligne : With rgTemp.Offset(0, i).Borders
Bon de que j'aurais le courage, je vais essayer de voire ce qui ne va pas.
Bonne soirée.
"rvblog" a écrit dans le message de news:
Bonjour,
essaies de vérifier si, dans tes plages nommées, tu n'aurais pas des
plages
composées. Par exemple, "=truc!$C$12:$C$16,truc!$E$14:$E$16,truc!$F$19:$F$2" ou "=Rectangle 1,Rectangle 2" sont des plages composées.
Il me semble que, dans ce cas, l'objet implicite _global a du mal a
résoudre
la référence Range.
Si c'est le cas, je te propose une solution : Sub bordure() Dim varRanges As Variant Dim strSubNames As String Dim rgTemp As Range Dim Nom As Name Dim i As Byte 'effacece toutes les bordures Range("A5:AI1000").Select
For Each Nom In ActiveWorkbook.Names 'si c'est une plage composée If InStr(1, Nom, ",") > 0 Then 'sépare les plages en sous-plages varRanges = Split(Replace(Nom, "=", ""), ",", -1) 'pour chaque sous-plage For Each strSubName In varRanges 'récupère une référence à l'objet Range 'correspondant à la sous-plage courante Set rgTemp = Range(strSubName) 'applique les modifications voulues With rgTemp.Offset(0, i).Borders For i = 0 To 14 'bordures (contours + lignes verticales) par plages nommées de colonne A à colonnes O .LineStyle = xlContinuous .Item(xlEdgeTop).LineStyle = xlContinuous .Item(xlEdgeRight).LineStyle = xlContinuous .Item(xlInsideHorizontal).LineStyle = xContinuous Next i End With Next strSubName Else 'récupère une référence à l'objet Range 'correspondant à la plage courante Set rgTemp = Range(Nom) 'applique les modifications voulues With rgTemp.Offset(0, i).Borders For i = 0 To 14 'bordures (contours + lignes verticales) par plages nommées de colonne A à colonnes O .LineStyle = xlContinuous .Item(xlEdgeTop).LineStyle = xlContinuous .Item(xlEdgeRight).LineStyle = xlContinuous .Item(xlInsideHorizontal).LineStyle = xContinuous Next i End With End If Next Nom Range("A5").Select