Formule avec le nom de feuille comme variable

Sauf erreur de ma part, "Wsfunction", ça n'existe pas. Pour utiliser une fonction Excel, tu peux mettre, Application.LaFonction() ou WorksheetFunction.LaFonction(). Mais comme je disais, Weekday existe directement sous VBA, donc pas besoin d'aller la chercher via Excel...

J'ai commencé par :

Dim Ws As Worksheet

C'est comme si j'écrivais :

WorksheetFunction.Weekday

Il suffirait que j'écrive :

Weekday(Range("A" & J).Value, 2) > 5

Et ca marcherait ?

J'ai commencé par :

Dim Ws As Worksheet

C'est un objet qui représente une feuille

C'est comme si j'écrivais :

WorksheetFunction.Weekday

Ca c'est pour utiliser une fonction qui est disponible dans les feuilles du classeur (rien à voir donc, ici le Worksheet ne désigne pas une feuille spécifique mais il s'agit bien d'un morceau de l'instruction).

Il suffirait que j'écrive :

Weekday(Range("A" & J).Value, 2) > 5

Et ca marcherait ?

Oui, car la fonction existe sous VBA, à la différence de SOMME ou MOYENNE par exemple, qui n'existent pas directement sous VBA et que l'on doit utiliser en spécifiant que ce sont des fonctions appartenant à l'application en question (ici Excel).

Pendant que j'y pense, tu répètes inutilement des instructions.

If Not FeuilleExiste(Ws.Range("A" & J).Value) And Len(Ws.Range("A" & J).Value) > 1 Then
      If Wsfunction.Weekday((Ws.Range("A" & J).Value), 2) > 5 Then
      Sheets("Rapport").Copy after:=Sheets(Sheets.Count)
      ActiveSheet.Name = Ws.Range("A" & J)
      ActiveSheet.Tab.Color = RGB(127, 127, 127)
      Else
      Sheets("Rapport").Copy after:=Sheets(Sheets.Count)
      ActiveSheet.Name = Ws.Range("A" & J)
      End If
End If

Tu pourrais écrire :

If Not FeuilleExiste(Ws.Range("A" & J).Value) And Len(Ws.Range("A" & J).Value) > 1 Then
      Sheets("Rapport").Copy after:=Sheets(Sheets.Count)
      ActiveSheet.Name = Ws.Range("A" & J)
      If Weekday((Ws.Range("A" & J).Value), 2) > 5 Then ActiveSheet.Tab.Color = RGB(127, 127, 127)
End If

Oui c'est vrai que j'ai fait dans la répétition. Merci de l'information.

Par contre j'ai toujours une erreur sur ma ligne :

If Weekday((Ws.Range("A" & J).Value), 2) > 5 Then ActiveSheet.Tab.Color = RGB(127, 127, 127)

Est-ce que c'est le Ws.Range("A" & J).Value qu'il n'aime pas ?

Écrite ainsi, la fonction fonctionne de mon côté sur quelques exemples de cellules contenant des dates.

Tu as peut-être une cellule qui ne contient rien ou une valeur non reconnue en format date. Envoie ton fichier pour que l'on y regarde.

Tu peux aussi tester en ajoutant :

CDate(Ws.Range("A" & J).Value)

Toutes mes cellules sont remplies de la colonne A de 1 à 31.

Voici mon fichier

EDIT : J'ai des dates au format jj.mm.aaaa

Est-ce que c'est à cause de ce format que ca ne marche pas ?

Merci encore de ton aide

3forum-v3.xlsm (153.88 Ko)

Salut,

C'est mieux avec le fichier, j'ai modifié pas mal de choses :

  • Diminution du nombre de formules pour obtenir les dates en colonne A
  • Suppression des colonnes cachées
  • Suppression de la formule TEXTE(TaDate;"jj.mm.aaaa") --> responsable de l'erreur de la macro, car cela transforme ta date en texte, et elle n'est donc plus reconnue sous forme de date même avec une instruction CDate() sous VBA
  • Modification du code :
Sub Ajouter_Feuilles()

Dim J As Long
Dim Ws As Worksheet

  Application.ScreenUpdating = False 'Désactive l'affichage --> à réactiver en fin de macro !!
  Application.Calculation = xlCalculationManual 'Désactive le recalcul auto des formules Excel à chaque action --> IDEM

  Set Ws = Sheets("Data")
  With Ws
    For J = 1 To 31
        If Not FeuilleExiste(Format(.Range("A" & J), "dd.mm.yyyy")) And IsDate(.Range("A" & J).Value) Then 'IsDate() car c'est bien des dates maintenant en colonne A
          Sheets("Rapport").Copy after:=Sheets(Sheets.Count)
          ActiveSheet.Name = Format(.Range("A" & J), "dd.mm.yyyy") 'C'est ici qu'on modifie la date en texte avec un certain format (car même si le format est bon en colonne A sous Excel, la valeur date est lue ici sous forme "JJ/MM/AAAA")
          If Weekday((.Range("A" & J).Value), 2) > 5 Then ActiveSheet.Tab.Color = RGB(127, 127, 127)
        End If
    Next J
    .Select
  End With

  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic

End Sub
6forum-v4.xlsm (124.40 Ko)

Effectivement, j'avais changé ma date en texte ce qui me bloqué pour la suite !

Ton code est parfait !

J'ai beaucoup appris grâce à vous, dire que mi-juillet je ne connaissais pas l'existence du vba.

Un grand merci à vous

Effectivement, j'avais changé ma date en texte ce qui me bloqué pour la suite !

Ton code est parfait !

J'ai beaucoup appris grâce à vous, dire que mi-juillet je ne connaissais pas l'existence du vba.

Un grand merci à vous

Ca a commencé comme ça pour moi aussi ! Au plaisir d'avoir échangé

Rechercher des sujets similaires à "formule nom feuille comme variable"