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.

12fichier-test.xlsm (32.89 Ko)

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 With

Je 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 With

With 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 With

C'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 Sub

ric

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

Rechercher des sujets similaires à "indice dehors dimensions tableau worksheet"