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 SubSet 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 SubPrivate 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 SubSi une des feuilles contient des valeurs seulement dans les 11 premières lignes, la plage sera forcément Nothing !
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 Subpar 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 SubLa macro me définit la plage qui est exclueIf 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
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 Subceci 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 FunctionAttention, 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 :
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
Merci Amir! C'est cool