Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème sur une macro suite passage VB5 vers VB6

2 réponses
Avatar
luck82
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

Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

For Each Nom In ActiveWorkbook.Names
For i = 0 To 14
With Range(Nom).Offset(0, i).Borders

'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

End With
Next i
Next Nom
Range("A5").Select

End Sub

2 réponses

Avatar
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.
Avatar
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

Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

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

à+