Indice en dehors des dimensions du tableau pour un worksheet
Bonjour,
je me tourne vers vous car je suis débutant en vba et rencontre actuellement des problèmes.
Contexte : Je souhaite automatiser la mise en donnée d'un plan (2D), c'est-à-dire renvoyer dans un onglet walls les coordonnées de chaque mur du plan (x0, y0, xf, yf). Je m'intéresse à des bordures de cellules, correspondant aux murs du plan (le plan est "dessiné" dans un onglet)
J'ai donc écrit une macro qui parcourt un onglet plan et recense tous les murs horizontaux.
Erreurs ressorties : je fais alors face à plusieurs problèmes :
1) en exécutant la macro (enregistrée dans Modules), je rencontre une Erreur 9 : Indice en dehors des dimensions du tableau pour la ligne
Set plan = Worksheets("Feuil2")et les lignes "Set" suivantes. Or je n'utilise à priori pas de tableau.
2) Erreur 461 : Méthode ou membre de données introuvable, pour la partie
With walls
X0 = lignevide(3)
Y0 = lignevide(4)
Cells(X0, 3) = c - decX - 1
Cells(Y0, 4) = tailleY - l + decY
End WithJe ne sais pas si l'erreur vient de ma fonction lignevide (qui trouve la première ligne vide pour une colonne rentrée en paramètres), écrite plus haut dans le même module, ou de la propriété cells.
Quelqu'un a-t-il une idée des erreurs que j'ai pu commettre ? Étant novice, j'ai peut-être déjà un problème d'architecture de mon code.
Merci d'avance et merci d'avoir lu ce message
Julien
Bonjour,
Commençons un pas-à-pas ...
- Dim plan, walls, model As Worksheets > seul "model" pourrait être une Worksheet (s'il n'y avait pas de "s" à la fin indiquant la pluralité) > les 2 autres seront de type "Variant" ...
Il faut écrire : Dim plan as Worksheet, walls as Worksheet, model as Worksheet ...
idem pour : Dim tailleX, tailleY, decX, decY, X0, Y0, XF, YF As Integer > seul "YF est un entier > les autres sont de type "Variant" ...
Il faut écrire :
Dim tailleXAs Integer , tailleYAs Integer , decXAs Integer , decYAs Integer , X0As Integer , Y0As Integer , XFAs Integer , YFAs Integer ...
-- Set plan = Worksheets("Feuil2") > ici ça ne va pas ...
La Feuil2 se nomme "plan_0" ...
Il faut doc écrire : Set plan = Feuil2 > ou encore Set plan = Worksheets("plan_0") ...
With model
tailleX = Range("B9")
tailleY = Range("B10")
decX = Range("B11")
decY = Range("B12")
End WithWith model > faire référence au nom de la feuille que représente la variable > il manque donc les . devant les "Range" ...
With model
tailleX = .Range("B9")
tailleY = .Range("B10")
decX = .Range("B11")
decY = .Range("B12")
End WithC'est utilisé pour éviter d'écrire ...
tailleX = model.Range("B9")
tailleY = model.Range("B10")
decX = model.Range("B11")
decY = model.Range("B12")Corrige tout cela afin de voir s'il y aura moins de soucis ...
Je reste à l'affût ...
RECOMMANDATION : >>> suivre les formations Cours VBA et autres au haut de la page > tu y gagneras beaucoup ...
ric
Bonjour ric,
merci beaucoup pour tes réponses détaillées et utiles. Je n'ai en effet plus de message d'erreur en exécutant la macro (j'avais aussi une erreur avec mon objet Borders, corrigée avec LineStyle).
Elle ne renvoie certes rien, mais chaque problème en son temps. Je soupçonne une erreur dans ma boucle if (condition jamais vérifiée). Peux-ton combiner les conditions sous la forme :
If (condition1 And condition2) Or (condition3 And condition4)en utilisant des parenthèses, pour avoir des "binômes" de combinaison ? (je pourrai toujours faire 2 boucles if distinctes avec les mêmes instructions, sinon)
Bonne continuation
Julien
PS : Je m'aide en effet des cours VBA du site, avec plus ou moins de réussite :)
Bonjour,
Je n'ai pas vérifié les conditions "And" et "Or" > il faut quand même te laisser un peu de travail ...
La function pour trouver la ligne vide > c'est la 1re fois que je vois ce style > mais tant que cela fonctionne ...
Dim tailleX% équivaut à Dim tailleX as integer
Option Explicit > tout au haut du module > force la déclaration des variables ...
La lettre d'une colonne se place entre guillemets > Cells(L, "c") > ou bien l'on met le numéro de la colonne > Cells(L, 3) ...
Les variables déclarées au haut du module sont bonnes pour toutes les macros de ce module ...
Option Explicit
Dim walls As Worksheet
Function lignevide(colonne)
Dim i As Long
i = 2 ' ligne 1 = entête, donc l'on commence à la ligne 2
Do While walls.Cells(i, colonne).Value <> "" ''' vide
i = i + 1
Loop
lignevide = i
End Function
Sub murshorizontaux()
Dim tailleX%, tailleY%, decX%, decY%, X0%, Y0%, XF%, YF As Integer
Dim L%, C%
Dim plan As Worksheet, model As Worksheet
Set plan = Worksheets("plan_0")
Set model = Worksheets("model")
Set walls = Worksheets("walls")
With model
tailleX = .Range("B9")
tailleY = .Range("B10")
decX = .Range("B11")
decY = .Range("B12")
End With
For L = 1 To tailleY
For C = decX + 1 To tailleX
If plan.Cells(L, "c").Borders(xlEdgeBottom).LineStyle <> xlNone And _
plan.Cells(L, "c").Borders(xlEdgeLeft).LineStyle <> xlNone Or _
(plan.Cells(L + 1, "c").Borders(xlEdgeTop).LineStyle <> xlNone And _
plan.Cells(L + 1, "c").Borders(xlEdgeLeft).LineStyle <> xlNone) Then
With walls
X0 = lignevide(3)
Y0 = lignevide(4) ' cette ligne est-elle utile ? si lignevide colonne 3, pourquoi en colonne 4 se serait différent ?
.Cells(X0, 3) = C - decX - 1
.Cells(Y0, 4) = tailleY - L + decY
End With
End If
If (plan.Cells(L, C).Borders(xlEdgeBottom).LineStyle <> xlNone And _
plan.Cells(L, C).Borders(xlEdgeRight).LineStyle <> xlNone) Or _
(plan.Cells(L + 1, C).Borders(xlEdgeTop).LineStyle <> xlNone And _
plan.Cells(L + 1, C).Borders(xlEdgeRight).LineStyle <> xlNone) Then
With walls
XF = lignevide(5)
YF = lignevide(6) ' cette ligne est-elle utile ? si lignevide colonne 3, pourquoi en colonne 4 se serait différent ?
.Cells(XF, 5) = C - decX
.Cells(YF, 6) = tailleY - L + decY
End With
End If
Next
Next
End Subric
Merci beaucoup Ric,
c'est bon, le programme tourne !
Il me reste plus qu'à fignoler les boucles pour avoir la réponse souhaitée, mais ça ne devrait pas poser de problème
Très bonne journée et encore merci
Julien
ric