Transformer une formule en VBA

Bonjour,

En C13, j'ai une formule qui permet de calculer le numéro de la semaine.

J'ai enregistré ce code et ai tenté de le transformer en VBA, mais sans succès.

Sub Macro1()

    ActiveCell.FormulaR1C1 = "=INT(MOD(INT((RC[-2]-2)/7)+0.6,52+5/28))+1"

    xx = Int(mod(int((range("A13")-2)/7)+0.6,52+5/28))+1

End Sub

Sauriez-vous m'aider ?

Cordialement.

8classeur2.xlsm (12.61 Ko)

Bonsoir,

une proposition avec une fonction, mais seule la ligne de cette fonction peut-être utilisée. Dans le fichier joint la date est en A1, le résultat en MsgBox.
Si cela peut faire avancer le projet.

Function NumSemISO(MyDate As Date) As Integer
  NumSemISO = Evaluate("isoweeknum(" & CLng(MyDate) & ")")
End Function

Sub test()
    MsgBox NumSemISO(Range("A1"))
End Sub

Cela utilise la fonction NO.SEMAINE.ISO d'Excel.

Le fichier :

7numsemainevba.xlsm (14.63 Ko)

@ bientôt

LouReeD

Bonjour Yvouille, LouReed, le forum,

J'utilise un petit classeur où je rentre en A1 la formule que je veux traduire en VBA.

Dans le Module1, deux petits codes dont la lecture se fait dans la fenêtre d'exécution.

Cela vous aidera t-il où-je suis à côté de la demande ?

Cordialement.

AL 22

Bonsoir à tous,

Une variante ? Que j'avais en stock....

 xx = DatePart("ww", Range("A13"), 2, 2)

[source]: https://forum.excel-pratique.com/excel/vba-date-en-n-de-semaine-96487

Cordialement,

Salut AL22,

Non, ce n'est malheureusement pas ce que je souhaite. Ce que tu me proposes est simplement une autre manière d'arriver au même résultat que moi avec l'enregistreur de macro. Regarde dans mon code, la partie en rouge : elle est semblable à ce que tu me fournis. Mais merci quand même d'avoir essayé.

Ajout : en fait, la deuxième ligne de ton résultat est ce que tu devrais inscrire dans un code VBA afin que celui-ci inscrive une formule dans une cellule d'une feuille Excel, alors que moi je cherche à effectuer un calcul directement dans le code.

image

Salut LooReeD,

Merci beaucoup pour ta réponse.

En fait j'aurais voulu en finale remplacer dans la formule recherchée la cellule A13 par une variable. J'ai alors tenté de modifier ton code dans ce sens, mais à nouveau sans succès. Peux-tu encore m'aider ?

D'un autre côté, j'aurais bien aimé réussir à transformer ma formule Excel en formule VBA.

Amicalement.

Function NumSemISO(MyDate As Date) As Integer
  NumSemISO = Evaluate("isoweeknum(" & CLng(MyDate) & ")")
End Function

Sub test()

    'MsgBox NumSemISO(Range("A1"))

    yy = DateSerial(2024, 2, 25)
    xx = NumSemISO(yy)

End Sub

Salut xorsankukai,

Je vois ta réponse à l'instant. Un tout grand merci à toi aussi. Elle est intéressante car elle permet de travailler avec des variables.

Sub sss()

yy = DateSerial(2024, 8, 25)
xx = DatePart("ww", yy, 2, 2)

End Sub

Toutefois il y a des variations dans la numérotation des semaines selon les pays et je savais que ma formule convenait pour l'Europe, raison pour laquelle je souhaiterais malgré tout avoir une ''traduction'' de ma formule.

Bien à vous.

AJOUT :

image

Bonjour

@Yvouille : tes formules datent de Mathusalem quand la fonction isoweeknum et n'existait pas, ni DatePart (qui est plus ancienne)

Salut Chris,

Il m'importe peu de savoir que Mathusalem gravait déjà cette formules sur son marbre, si elle fonctionne encore sans créé les problèmes mentionnés ci-dessus

On verra si quelqu'un peut m'aider à utiliser la fonction isoweeknum avec une variable ou si je vais finir par comprendre comment éviter les problèmes de DatePart ou si un disciple de Mathusalem m'aidera à traduire ma formule.

Très bonne soirée.

Si au lieu de "DateSerial" vous mettiez que "Date" avec les valeurs année mois jour en format date ?

@ bientôt

LouReeD

Edit : correction de quelques fautes dues à ma réponse avec mes gros doigts sur mon petit téléphone ! Bien que je n'ai pas besoin de cela !

bonjour le fil,

un résumé ???

Sub m_MaDate()

Dim MaDate: MaDate = CLng(Date)

    x1 = Evaluate("INT(MOD(INT((" & MaDate & "-2)/7)+0.6,52+5/28))+1")
    x2 = WorksheetFunction.IsoWeekNum(MaDate)
    x3 = Evaluate("ISOWEEKNUM(" & MaDate & ")")
    x4 = DatePart("ww", MaDate, 2, 2)

End Sub

Re-bonjour,

Merci à LooReed pour sa dernière intervention et à BsAlv pour ce résumé final.

Cette dernière macro fonctionne parfaitement, également avec cette variante "DateSerial" : Dim MaDate: MaDate = CLng(DateSerial(2024, 3, 20)).

J'ai ainsi pu constater que toutes ces solutions donnent exactement les mêmes résultats et que tous sont corrects, contrairement à l'avertissement que j'avais affiché dans l'un de mes précédents courriels.

Encore un tout grand merci à tous les intervenants

Bonjour,
Une petite correction (?) :

x4 = Datepart("ww", Date - WeekDay(Date, 2) + 4, 2, 2)

(*) https://snb-vba.eu/VBA_ISO_weeknummer_en.html

Bonjour Jean-Eric,

J'avais fait un petit fichier afin de comparer les diverses réponses reçues et si j'y inclus ta formule, elle donne un résultat différent des autres. Il semble qu'avec ta formule, le premier jour de la semaine est toujours un dimanche alors que selon les normes ISO en vigueur chez nous, ce n'est pas le cas (?).

Une chose est certaine ; les 4 premières propositions testées donnent toujours les mêmes résultats.

Amicalement.

Edit : je vois maintenant que sur ton site c'est précisé : - a week starts at monday; so monday is the first day of any week

RE,
@Yvouille,
Et ainsi ?

If j = 5 Then
                Cells(j, i) = DatePart("ww", MaDate - Weekday(MyDate, 2) + 4, 2, 2)
                Cells(j, 1) = "DatePart(''ww'', MaDate - Weekday(MaDate, 2) + 4, 2, 2)"
            End If

Cdlt.

Salut Jean-Eric, merci pour ton retour.

Tu aurais pu faire toi-même l'essai et tu aurais vu que ça ne fonctionnait pas mieux

Mais c'est simplement car tu dois écrire la variable MaDate de manière identique dans ton code et non pas écrire une fois MyDate

Ceci étant dit, ta proposition de code ainsi corrigée fonctionne comme tous les autres bouts de code qui fonctionne aussi.

Mais alors à quoi bon compliquer l'écriture de ce code si ça n'apporte rien de plus ?

J'ai quand même lu quelque part que cette numérotation des semaines correspondait à un cycle de 400 ans. Pour ma part, j'ai contrôlé toutes les années de 2000 à 2100. Tant pis si ton code serait utile entre 2101 et 2400

Rechercher des sujets similaires à "transformer formule vba"