Erreur 91

Bonjour à tous

j'ai ce code qui insérée dans un fichier quelconque fonctionnee bien mais qui m'envoie une altere "Erreur 91, variable non définie" lorsque je l'intègre dans mon fichier

Private Sub UserForm_Activate()

Dim Wsh As Worksheet, RngDon As Range, T(), L As Long, C As Long, RngLig As Range, RngMsk As Range

For Each Wsh In ThisWorkbook.Worksheets

   Set RngDon = Intersect(Wsh.[12:1000000], Wsh.UsedRange): If RngDon.Rows.Count = 1 And RngDon.Columns.Count _
      = 1 Then ReDim T(1 To 1, 1 To 1): T(1, 1) = RngDon.Value Else T = RngDon.Value

   For C = 1 To UBound(T, 2) - 1
      If T(1, C) = "Année N" And T(1, C + 1) = "Année N-1" Then Exit For
         Next C
   If C < UBound(T, 2) Then
      Set RngMsk = Nothing
      For L = 2 To UBound(T, 1)
         If T(L, C) = 0 And T(L, C + 1) = 0 And T(L, C) <> "" And T(L, C + 1) <> "" Then
            Set RngLig = RngDon.Rows(L).EntireRow
            If RngMsk Is Nothing Then Set RngMsk = RngLig Else Set RngMsk = Union(RngMsk, RngLig)
            End If: Next L
      If Not RngMsk Is Nothing Then RngMsk.EntireRow.Hidden = True
      End If
   'ListBox1.AddItem Wsh.Name

   Next Wsh

End Sub

Set RngDon = Intersect(Wsh.[12:1000000], Wsh.UsedRange): If RngDon.Rows.Count = 1 And RngDon.Columns.Count _

= 1 Then c'est la ligne qui pose problème ça apparemment.

Auriez vous des pistes de réponse pour résoudre l'erreur

Bonjour,

Difficile de dire qu'est ce qui pose problème, est-ce que la version de ton fichier permet d'avoir 1 000 000 de lignes? Est-ce que le intersect trouve bien quelque chose, ou renvoie nothing?

Regarde si une de tes variables contient une erreur (clic droit ajouter un espion), ça te guidera dans la résolution de ton problème.

Bonjour,

On n'utilise jamais les propriétés et méthodes d'un Range sans avoir au préalable contrôlé qu'il a bien été défini avec Nothing :

Dans le code, j'ai rajouté cette ligne :

 If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie !": Exit Sub
Private Sub UserForm_Activate()

Dim Wsh As Worksheet, RngDon As Range, T(), L As Long, C As Long, RngLig As Range, RngMsk As Range

For Each Wsh In ThisWorkbook.Worksheets

   Set RngDon = Intersect(Wsh.[12:1000000], Wsh.UsedRange)

   'test afin de savoir si la plage est définie ou pas
   If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie !": Exit Sub

   If RngDon.Rows.Count = 1 And RngDon.Columns.Count _
      = 1 Then ReDim T(1 To 1, 1 To 1): T(1, 1) = RngDon.Value Else T = RngDon.Value

   For C = 1 To UBound(T, 2) - 1
      If T(1, C) = "Année N" And T(1, C + 1) = "Année N-1" Then Exit For
         Next C
   If C < UBound(T, 2) Then
      Set RngMsk = Nothing
      For L = 2 To UBound(T, 1)
         If T(L, C) = 0 And T(L, C + 1) = 0 And T(L, C) <> "" And T(L, C + 1) <> "" Then
            Set RngLig = RngDon.Rows(L).EntireRow
            If RngMsk Is Nothing Then Set RngMsk = RngLig Else Set RngMsk = Union(RngMsk, RngLig)
            End If: Next L
      If Not RngMsk Is Nothing Then RngMsk.EntireRow.Hidden = True
      End If
   'ListBox1.AddItem Wsh.Name

   Next Wsh

End Sub

Si une des feuilles contient des valeurs seulement dans les 11 premières lignes, la plage sera forcément Nothing !

If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie !": Exit Sub

Ah Merci Theze, c'est en effet ce qui créait l'alerte

Par contre comment je fais pour identifier la feuille qui occasionne cette erreur, la feuille sur laquelle la plage n'a pas pu être définie

Du coup, les lignes qui doivent être masquées lors de l'export des feuilles ne se masquent plus.

Qu'est ce qui peut faire que le UsedRange ne reconnaisse plus la plage?

Remplaces la ligne :

 If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie !": Exit Sub

par celle-ci :

   If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie sur la feuille '" & _
                                    Wsh.Name & "' car la zone utilisée dans celle-ci est seulement '" & _
                                    Wsh.UsedRange.Address(0, 0) & "' !": Exit Sub

If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie sur la feuille '" & _

Wsh.Name & "' car la zone utilisée dans celle-ci est seulement '" & _

Wsh.UsedRange.Address(0, 0) & "' !": Exit Sub

La macro me définit la plage qui est exclue

Mais elle ne masque toujours pas lignes selon la condition qui y est définie sur les autres feuilles

Attention, je n'ai absolument pas testé ton code, j'ai juste ajouté la ligne de code de contrôle !

Le code donné précédemment indique juste la zone utilisée dans la feuille en cours, zone qui sera forcément au maximum jusqu'à la ligne 11 car sinon, Intersect() retournera un Range !

Maintenant, je te conseille très fortement de ne pas utiliser UsedRange car il ne reflète pas la zone contenant des valeurs mais la zone utilisée et pour t'en convaincre, tu ajoutes une feuille vierge et tu entres n'importe quelle valeur en A1 puis tu exécutes le code ci-dessous :

Sub Test()

    MsgBox ActiveSheet.UsedRange.Address(0, 0)

End Sub

ceci fait, tu vas dans n'importe quelle cellule plus bas dans la feuille et tu cliques sur le bouton, de mise en gras sans entrer de valeur dans cette cellule et tu exécutes à nouveau le code et tu verras la différence et pourquoi ceux qui utilisent UsedRange ont souvent des résultats inattendus !

Maintenant, voici ton code avec une fonction qui retourne un objet Range en fonction des valeurs contenues dans la feuille et nbon des éventuelles mise en formes :

Private Sub UserForm_Activate()

    Dim Plage As Range

    Dim Wsh As Worksheet, RngDon As Range, T(), L As Long, C As Long, RngLig As Range, RngMsk As Range

    For Each Wsh In ThisWorkbook.Worksheets

        Set Plage = DefPlage(Wsh)

        If Plage Is Nothing Then Exit Sub

        Set RngDon = Intersect(Wsh.[12:1000000], Plage)

        'test afin de savoir si la plage est définie ou pas
        If RngDon Is Nothing Then MsgBox "La plage n'a pas pue être définie sur la feuille '" & _
                                         Wsh.Name & "' car la zone utilisée dans celle-ci est seulement '" & _
                                         Wsh.UsedRange.Address(0, 0) & "' !": Exit Sub

        If RngDon.Rows.Count = 1 And RngDon.Columns.Count _
           = 1 Then ReDim T(1 To 1, 1 To 1): T(1, 1) = RngDon.Value Else T = RngDon.Value

        For C = 1 To UBound(T, 2) - 1
           If T(1, C) = "Année N" And T(1, C + 1) = "Année N-1" Then Exit For
              Next C
        If C < UBound(T, 2) Then
           Set RngMsk = Nothing
           For L = 2 To UBound(T, 1)
              If T(L, C) = 0 And T(L, C + 1) = 0 And T(L, C) <> "" And T(L, C + 1) <> "" Then
                 Set RngLig = RngDon.Rows(L).EntireRow
                 If RngMsk Is Nothing Then Set RngMsk = RngLig Else Set RngMsk = Union(RngMsk, RngLig)
                 End If: Next L
           If Not RngMsk Is Nothing Then RngMsk.EntireRow.Hidden = True
           End If
        'ListBox1.AddItem Wsh.Name

    Next Wsh

End Sub

Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range

    On Error GoTo Fin

    With Fe

        Set DefPlage = .Range(.Cells(L, C), _
                       .Cells(.Cells.Find("*", .[A1], -4123, , _
                       1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                       2, 2).Column))

    End With

    Exit Function

Fin:

    Set DefPlage = Nothing

End Function

Attention, je ne me suis pas occupé du reste du code !

Franchement je vous dis merci pour le temps que vous m'accordez. C'est vraiment pas évident

Vous avez raison sur la mise en forme avec Used Rnage, il a définit la plage A1 à A13 alors même que sur A13, je n'y ai mis que du gras

Le code fonctionne impec, quand je mets ne serait-ce qu'une valeur à partir de la ligne 12

dès que je l'efface , il fonctionne plus. Donc je sais quoi faire

Merci Beaucoup

Salut relmo

j'étais en train de travailler sur ton problème

alors que est maintenant résolut je pose comme même :

6userange.xlsm (19.26 Ko)
Sub test()
Dim RngLig As Range, RngMsk As Range, RngDon As Range
Dim Wsh As Worksheet, tbl
Dim l As Long, i As Long, j As Long

For Each Wsh In ThisWorkbook.Worksheets
    If Not (Intersect(Wsh.[12:1000000], Wsh.UsedRange) Is Nothing) Then
       tbl = Intersect(Wsh.[12:1000000], Wsh.UsedRange)

       For i = 1 To UBound(tbl, 2) - 1
           If tbl(1, i) = "Année N" And tbl(1, i + 1) = "Année N-1" Then
              MsgBox 2
              For l = 2 To UBound(tbl, 1)
                  If (tbl(l, i) = 0 And tbl(l, i + 1) = 0) And (tbl(l, i) <> "" And tbl(l, i + 1) <> "") Then
                      MsgBox 3
                      Rows(l + 11).EntireRow.Hidden = True
                  End If
              Next l
              Exit For
           End If
       Next i

    End If
 Next Wsh
End Sub
1123

Merci Amir! C'est cool

Rechercher des sujets similaires à "erreur"