Insérer nouvelle feuille avec date dans l'odre chronologique

Mea Culpa Eriiic, je pense que ta macro fonctionne, j'en ai juste d'autres entre mes feuilles qui interagissent.

J'ai fais quelques essais en les désactivant et l'action de tri marchait.

J'utilise ce genre de macro entre les feuilles :

[code][/Private Function derCelK() As Variant

If Not ActiveSheet.Name = "Modèle" Then

Application.Volatile

derCelK = Worksheets(Application.Caller.Worksheet.Index - 1).Cells(3, 11)

End If

End Function

Private Function derSoldeBanque() As Variant

If Not ActiveSheet.Name = "Modèle" Then

Application.Volatile

derSoldeBanque = Worksheets(Application.Caller.Worksheet.Index - 1).Cells(1, 8)

End If

End Functioncode]

J'avais bien compris le remplacement des 3 lignes que tu avais posté à mettre dans le code initial et je me suis mal exprimé en parlant de fonction cpt...

Je vais donc continuer à travailler sur mon projet.

Merci pour ton aide, ainsi qu'à Banzai

Peut-être qu'interdire les calculs au début du tri limitera la perturbation due à ta fonction ?

Application.Calculation = xlCalculationManual

Rétablir :

Application.Calculation = xlCalculationAutomatic

Contrôle s'il ne faut pas lancer un .calculate sur tes feuilles ensuite pour les ré-évaluer.

eric

Je vais essayer cela pendant le weekend ... Je te tiendrais au courant.

Keep posted !

Belle intuition Eriiic, la solution (que je ne connaissais pas d'ailleurs, merci pour l'info) utilisant la ligne suivante :

Application.Calculation = xlCalculationManual

a en effet permis une temporisation des calculs que j'avais entre mes feuilles. Ca fonctionne super !

2eme bonne intuition de ta part, les re-calculs ne fonctionnait pas au départ et je me retrouvais avec un sablier qui durait "perpette". Cela a saturé la mémoire et perturbé les calculs auto jusqu'au point où j'ai dû avorter le programme et rebooter.

Après redémarrage, j'avais des incohérences au niveau de mes cellules qui recalculent "NOM?" qui ne se mettaient pas à jour.

J'ai dû les valider manuellement pour que cela fonctionne de nouveau.

L'option ".Calculate" semble donc intéressante mais je ne la maitrise pas encore.

J'ai trouvé un peu d'info sur le net comme cet exemple :

Worksheets(1).Rows(2:3).Calculate ne fait les calculs que sur les lignes 2 et 3

Mais si tu pouvais me donner quelques tuyaux supplémentaires sur son utilisation, ça pourrait m'aider.

Du genre : l'utiliser dans la feuille concernée (sachant qu'il y en a beaucoup), dans un module, dans This workbook ? Avec quelle syntaxe ?

Merci encore de ton temps passé sur mon cas ...

Bonjour,

Difficile de tester le meilleur sans fichier...

Déjà il faut bien remettre les calculs en automatique en fin de macro.

Et comme ta fonction est dépendante de la position des feuilles il est préférable de faire une nouvelle boucle pour le .calculate.

Je le verrais bien en fin du if depl then :

for each sh in worksheets
  sh.calculate
next sh

Et si elles sont sur une plage précise tu peux limiter à celle-ci. Ex : sh.[C:D].calculate

Mais comme je suppose que tu n'as pas de mois manquant pourquoi ne pas fabriquer le nom de la feuille précédente pour tes fonctions ?

Ca t'évite de rendre la fonction volatile. Donc d'avoir des appels inutiles (et d'entrer dans une boucle non voulue ?) et de désactiver les calculs. Ex à tester :

Private Function derSoldeBanque() As Variant
    Dim nomF As String
    nomF = Application.Caller.Parent.Name
    If IsDate(nomF) Then
        nomF = Format(DateAdd("m", -1, DateValue(nomF)), "mmmm yyyy")
        On Error Resume Next
        If IsError(Sheets(nomF).Index) Then
            derSoldeBanque = 0
        Else
            derSoldeBanque = Sheets(nomF).Cells(1, 8)
        End If
    End If
End Function

0 si la feuille n'existe pas, que tu peux remplacer par une valeur d'erreur si tu préfères.

eric

C'est vrai que je n'aime pas utiliser les fonctions volatiles qui ont tendance à satuer la mémoire système.

Je viens de tester ta macro pour "Function derSoldeBanque()", et c'est plutôt concluant. Je vais en faire de même pour la fonction "Function derCelK()" et voir les résultats.

J'ai noté ton utilisation de "Application.Caller.Parent.Name". Je l'avais pourtant essayé, mes mes résultats n'étaient pas probants.

Je te tiens au courant de l'évolution avant ce soir car je ne suis plus là après ...

Ton exemple a parfaitement fonctionné. Je l'ai adapté à la fonction "Function derCelK()" sans soucis. Le fichier est plus réactif aux changements de valeurs de cellule.

Comme tu l'a dis,

eriiic a écrit :

Mais comme je suppose que tu n'as pas de mois manquant pourquoi ne pas fabriquer le nom de la feuille précédente pour tes fonctions ?

j'ai changé ceci afin d'empêcher une création de page aléatoire:
Private Sub Workbook_Open()
Dim Ws As Worksheet

ThisWorkbook.Sheets("Listes").Visible = False

Trier_Onglets_Date

Onglet = Format(Date, "MMMM YYYY")

    On Error Resume Next
    Set Ws = ThisWorkbook.Worksheets(Onglet)
    On Error GoTo 0

    If Not Ws Is Nothing Then
        ThisWorkbook.Sheets(Onglet).Select
        Else
        MsgBox "Le feuille du mois en cours n'existe pas, vous aller devoir la créer ...", vbOKOnly
        Userform1.Show
    End If

End Sub

Cela empêche la création de feuille non contigüe supérieure à une feuille existante.

Qu'en penses-tu ?

PS : j'ai oublié le On error goto 0.

Rajoute-le, je ne suis pas sûr à 100% que le gestionnaire d'erreur se réactive sur le end sub.

eric

Je n'avais pas rafraichi la page et pas vu ton post...

Je pense que tu es la chef pour décider du fonctionnement voulu

Si le fichier est ouvert régulièrement ça devrait suffire comme garde-fou.

Voire même créer la feuille si c'est faisable...

eric

Bonjour à tous,

Eriiic, tu as raison pour le gestionnaire d'erreurs ... le End Sub le ré-initialise ...

Rechercher des sujets similaires à "inserer nouvelle feuille date odre chronologique"