1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

XL 2013 Optimisation d'une macro

Discussion dans 'Forum Excel' démarrée par momo, 4 Janvier 2019.

  1. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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: 5 Janvier 2019
  2. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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
     
  3. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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: 6 Janvier 2019
  4. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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
     
  5. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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 aime votre message.
  6. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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
     
  7. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    L
    le masque ds lignes ne se fait plus dès que j'insère cette procédure
     
  8. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Ç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 aime votre message.
  9. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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
     
  10. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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:
     
  11. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    Après essai, ca marche tjrs pas

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

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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: 7 Janvier 2019
  13. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    Je définis Vtar comment au début de la macro?
    Après j'y ajoute aussi un "end if"?
     
  14. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Non, c'est une faute de frappe, le nom de la fonction VBA est VarType. Elle renvoie une valeur de l'énumération VbVarType.
     
  15. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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: 11 Janvier 2019
  16. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    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: 11 Janvier 2019
  17. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14752
    "J'aime" reçus :
    906
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    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 ?
     
  18. momo

    momo XLDnaute Occasionnel

    Inscrit depuis le :
    31 Décembre 2014
    Messages :
    320
    "J'aime" reçus :
    0
    Oui en effet .
    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
     
Chargement...
Discussions similaires - Optimisation macro Forum Date
XL 2013 Optimisation de macro + USF à venir Forum Excel 19 Juin 2018
XL 2007 Macro VBA d'optimisation Forum Excel 20 Février 2018
XL 2007 optimisation de macro Forum Excel 30 Novembre 2017
XL 2007 OPTIMISATION MACRO ET DONNEES Forum Excel 9 Novembre 2017
Toutes versions [résolu ] vba optimisation macro Forum Excel 25 Octobre 2016

Partager cette page