XL 2013 Optimisation d'une macro

Dranreb

XLDnaute Barbatruc
Définissez les UsedRange partout de la même façon, et si ça implique des cellules non vides devant, au lieu de 1 spécifiez le numéro de la ligne de titres relatif au début de la plage. Et tant qu'à faire faites commencer la boucle sur L non à 2 mais à ce N° + 1.
Vous pourriez aussi mettre les plages sous forme de tableau Excel, ainsi ils seraient couverts par des ListObject, pourvus des propriétés HeaderRowRange, DataBodyRange et ListColumns.
 
Dernière édition:

momo

XLDnaute Occasionnel
Définissez les UsedRange partout de la même façon, et si ça implique des cellules non vides devant, au lieu de 1 spécifiez le numéro de la ligne de titres relatif au début de la plage. Et tant qu'à faire faites commencer la boucle sur L non à 2 mais à ce N° + 1.
Vous pourriez aussi mettre les plages sous forme de tableau Excel, ainsi ils seraient couverts par des ListObject, pourvus des propriétés HeaderRowRange, DataBodyRange et ListColumns.
Hahahha

Vous avez surestimé mes capacités VBA... Je suis plus qu'un débutant. En fait j'essaie de mettre en place un fichier pour mes collaborateurs et moi.

Si seulement vous pouviez me donner une piste dans la macro que vous m'avez déjà écrite et qui niveau rapidité est vraiment top.... j'avoue que ca m'arrangerait
 

Dranreb

XLDnaute Barbatruc
Okay.. les titres sur les lignes de mon fichier se truvent tjrs en ligne 12.
Bon alors définissez RngDon comme ça :
Set RngDon = Intersect(Wsh.[12:1000000], Wsh.UsedRange)
Comme ça sa propre ligne 1 sera toujours la ligne 12 de la feuille.
S'il ne risque plus d'y avoir de feuille avec une seule cellule renseignée comme dans le fichier de test ça ne sert plus à rien de traiter le cas: affectez juste T = RngDon.Value
 
Dernière édition:

momo

XLDnaute Occasionnel
Bon alors définissez RngDon comme ça :
Set RngDon = Intersect(Wsh.[12:1000000], Wsh.UsedRange)
Comme ça sa propre ligne 1 sera toujours la ligne 12 de la feuille.
S'il ne risque plus d'y avoir de feuille avec une seule cellule renseignée comme dans le fichier de test ça ne sert plus à rien de traiter le cas: affectez juste T = RngDon.Value
C'est parfait ca marche Impec,

sur mon fichier les cellules à masque sont sur des onglets qui commencent tous par le même nom

mapomme m'avait aidé dans ce sens avec le code ci-dessous

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Const PreFix = "Parent"
Dim i&, col1$, col2$
If LCase(Sh.Name) Like LCase(PreFix) & "*" Then
With Sh
If LCase(.Range("d2")) = "kom" Then
' cas des colonnes C et D -> type M1
col1 = "c": col2 = "d"
ElseIf LCase(.Range("d2")) = "mok" Then
' cas des colonnes D et E -> type M2
col1 = "d": col2 = "e"
Else
Exit Sub
End If
Application.ScreenUpdating = False
.UsedRange.EntireRow.Hidden = False
For i = .Cells(.Rows.Count, "d").End(xlUp).Row To 3 Step -1
.Rows(i).Hidden = (.Cells(i, col1) = 0) And (.Cells(i, col2) = 0)
Next i
Application.ScreenUpdating = True
End With
End If
End Sub

Mais je ne sais pas l'adapter au code que vous m'avez aidé à réaliser

Je pense que ca augmenterait l'efficacité de l'optimisation
 

Dranreb

XLDnaute Barbatruc
Vous pouvez soumettre tout le code entre For Each Wsh In ThisWorkbook.Worksheets et Next Wsh à une condition
If LCase(Wsh.Name) Like "parent*" Then. Ne pas oublier de finir par une End If.
 

momo

XLDnaute Occasionnel
Vous pouvez soumettre tout le code entre For Each Wsh In ThisWorkbook.Worksheets et Next Wsh à une condition
If LCase(Wsh.Name) Like "parent*" Then. Ne pas oublier de finir par une End If.
Ok je le fais .. j’ai du me planter tout à l’heure en le faisant alors parce que à chaque fois ça me renvoyait des alertes
Et puis je crois que à un niveau il y a un With à insérer et Lcase à mettre à un autre niveau
 

Dranreb

XLDnaute Barbatruc
Ça doit être parce qu'il n'existe aucune feuille dont le nom, mis en minuscules, commence par "parent"
C'est un bout de code, pas une procédure. Une procédure c'est une Sub …
 

momo

XLDnaute Occasionnel
Ça doit être parce qu'il n'existe aucune feuille dont le nom, mis en minuscules, commence par "parent"
C'est un bout de code, pas une procédure. Une procédure c'est une Sub …
Oui en effet c'est un bout de code.. Sorry...

Par contre pour le nom, en réalité sur mes feuilles de clacul, le "P" est en majuscule et le reste en miniscule

Donc je l'ai écrit tel quel en commençant par la lettre majuscule et le reste en miniscule.

Pensez vous que si j'ajoute dans le code la forumule suivante , ca marchera

If T(L, C) = 0 And If T(L, C) <> 0 And T(L, C + 1) = 0 And T(L, C + 1) <> 0 Then

En fait le masque prend des lignes en dessous de mon tableau (Ces lignes au niveau des colonnes Roc et Cor sont vide mais ne le sont pas en debut de feuilles. du coup la macro les masque quand même.

Par cette formule je voulais qu'elle ne prenne pas les lignes vide
 

Dranreb

XLDnaute Barbatruc
Alors mettre simplemet If Wsh.Name = "Parent*" pas If LCase(Wsh.Name) Like "parent*"
Non, ce test n'est pas correct syntaxiquement et n'a aucun sens. C'est soit If T(L, C) = 0 And T(L, C + 1) = 0 Then soit la conditiion inverse If T(L, C) <> 0 Or T(L, C + 1) <> 0 Then:
 

momo

XLDnaute Occasionnel
Alors mettre simplemet If Wsh.Name = "Parent*" pas If LCase(Wsh.Name) Like "parent*"
Non, ce test n'est pas correct syntaxiquement et n'a aucun sens. C'est soit If T(L, C) = 0 And T(L, C + 1) = 0 Then soit la conditiion inverse If T(L, C) <> 0 Or T(L, C + 1) <> 0 Then:
Après essai, ca marche tjrs pas

Par contre mes excuses, pour la formule, la 2e condition c'était <>"" je voulais mettre
 

Dranreb

XLDnaute Barbatruc
Essayez If VtarType(T(L, C)) = vbDouble and VarType(T(L, C + 1)) = vbDouble Then
Et après seulement If (T(L, C) = 0 and T(L, C + 1) = 0 Then
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non, c'est une faute de frappe, le nom de la fonction VBA est VarType. Elle renvoie une valeur de l'énumération VbVarType.
 

momo

XLDnaute Occasionnel
Non, c'est une faute de frappe, le nom de la fonction VBA est VarType. Elle renvoie une valeur de l'énumération VbVarType.
Bonjour Dranreb

Je me permets de t'écrire pour comprendre une erreur dans le code que tu m'as aidé à écrire

Cette erreur n'était jamais apparue jusqu'à aujourd'hui

Erreur 91 sur cette ligne:
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

je ne sais pas ce qui à bien pu causer ca

Le truc bizarre c'est que le même code dans un autre fichier et tout marche impec
 
Dernière édition:

momo

XLDnaute Occasionnel
J'ai rajouté cette ligne, mais du coup la macro ne masque plus les lignes

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
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Se pourrait-il que pour certaines feuilles il n'y ait rien à partir de la ligne 12, seulement éventuellement des choses avant, bien que vous m'ayez dit que la ligne 12 contenait toujours des titres sur toutes les feuilles ?
 

momo

XLDnaute Occasionnel
Oui en effet .
Bonsoir.
Se pourrait-il que pour certaines feuilles il n'y ait rien à partir de la ligne 12, seulement éventuellement des choses avant, bien que vous m'ayez dit que la ligne 12 contenait toujours des titres sur toutes les feuilles ?
Oui en effet c’est ce que j’avais dit .. mais entre temps j’ai créé une feuille accueil ou il n’y a rien de mis à partir de la ligne 12 ... je comprends mtn
 

Discussions similaires


Haut Bas