1
votes

Instruction IF imbriquée pour lire et générer des regroupements de dates personnalisés

J'essaie de créer une instruction IF imbriquée dans Excel 2016 pour lire une valeur de date et générer le mois financier correspondant. Étant donné qu'un mois financier est unique à l'entreprise pour laquelle je travaille, il n'y a pas d'autre alternative que de créer une fonction ou une déclaration personnalisée.

Jusqu'à présent, j'ai essayé:

Start date  End date    Month
12/30/2017  1/26/2018   Jan-18
1/27/2018   2/23/2018   Feb-18
2/24/2018   3/30/2018   Mar-18
3/31/2018   4/27/2018   Apr-18
4/28/2018   5/25/2018   May-18
5/26/2018   6/29/2018   Jun-18
6/30/2018   7/27/2018   Jul-18
7/28/2018   8/24/2018   Aug-18
8/25/2018   9/28/2018   Sep-18
9/29/2018   10/26/2018  Oct-18
10/27/2018  11/23/2018  Nov-18
11/24/2018  12/28/2018  Dec-18
12/29/2018  1/25/2019   Jan-19
1/26/2019   2/22/2019   Feb-19
2/23/2019   3/29/2019   Mar-19
3/30/2019   4/26/2019   Apr-19
4/27/2019   5/24/2019   May-19
5/25/2019   6/28/2019   Jun-19

Cela ne fonctionne pas - j'obtiens une sortie numérique au lieu d'une date.

Il doit y avoir un moyen meilleur / efficace de le faire.

Quelqu'un peut-il recommander une autre approche? Possible via UDF dans VBA?

Edit - publication d'un tableau des plages et de la sortie requise

=IF(D2 <= DATEVALUE("28/07/2017"),DATEVALUE("Jul-2017"), 
 IF(D2 <= DATEVALUE("26/08/2017"),DATEVALUE("Aug-2017"), 
    IF(D2 <= DATEVALUE("29/09/2017"), DATEVALUE("Sep-2017"), 
       IF(D2 <= DATEVALUE("27/10/2017"), DATEVALUE("Oct-2017"), 0)))) +
          IF(D2 <= DATEVALUE("24/11/2017"), DATEVALUE("Nov-2017"),
             IF(D2 <= DATEVALUE("29/12/2017"), DATEVALUE("Dec-2017"),
                IF(D2 <= DATEVALUE("26/01/2018"), DATEVALUE("Jan-2018"),
                   IF(D2 <= DATEVALUE("23/02/2018"), DATEVALUE("Feb-2018"), 0)))) +
                      IF(D2 <= DATEVALUE("20/03/2018"), DATEVALUE("Mar-2018"),
                         IF(D2 <= DATEVALUE("27/04/2018"), DATEVALUE("Apr-2018"),
                            IF(D2 <= DATEVALUE("25/05/2018"), DATEVALUE("May-2018"),
                               IF(D2 <= DATEVALUE("29/06/2018"), DATEVALUE("Jun-2018"),
                                  IF(D2 <= DATEVALUE("27/07/2018"), DATEVALUE("Jul-2018"),
                                     IF(D2 <= DATEVALUE("24/08/2018"), DATEVALUE("Aug-2018"), 0)))))) +
                                        IF(D2 <= DATEVALUE("28/09/2018"), DATEVALUE("Sep-2018"),
                                           IF(D2 <= DATEVALUE("26/10/2018"), DATEVALUE("Oct-2018"),
                                              IF(D2 <= DATEVALUE("23/11/2018"), DATEVALUE("Nov-2018"),
                                                 IF(D2 <= DATEVALUE("28/12/2018"), DATEVALUE("Dec-2018"),
                                                    IF(D2 <= DATEVALUE("25/01/2019"), DATEVALUE("Jan-2019"),
                                                       IF(D2 <= DATEVALUE("22/02/2019"), DATEVALUE("Feb-2019"),
                                                          IF(D2 <= DATEVALUE("29/03/2019"), DATEVALUE("Mar-2019"), 0))))))) +
                                                             IF(D2 <= DATEVALUE("26/04/2019"), DATEVALUE("Apr-2019"), 
                                                                IF(D2 <= DATEVALUE("24/05/2019"), DATEVALUE("May-2019"), 
                                                                   IF(D2 <= DATEVALUE("28/06/2019"), DATEVALUE("Jun-2019"), D2)))


6 commentaires

Les regroupements sont juste là dans le code, mais en ce qui concerne une formule définie pour chaque mois - je ne sais pas, c'est pourquoi je le codifie en dur.


Il le fait cependant, le premier argument de chaque instruction IF est la plage de dates et le deuxième argument est la sortie souhaitée.


Pourquoi les chiffres continuent-ils de baisser d'une année sur l'autre? Cela continuera-t-il à se produire? C'EST À DIRE. le janvier 2020 sera-t-il le 28/12/2020 au 24/01/2020?


Je n'ai pas de formule mathématique prédéfinie pour le regroupement des dates en mois financiers et je dois donc la coder en dur. Autant que je sache, les groupements sont définis arbitrairement à la main.


Pouvez-vous s'il vous plaît fournir un exemple de syntaxe appropriée pour ce cas d'utilisation? Si c'est une question de syntaxe, je ne me soucie pas de trouver une solution plus élégante - je suis heureux de forcer celle-ci.


veuillez confirmer ce qui suit: la formule a un format de date différent de la table , laquelle est la bonne ?, également la formule indique que la date dans la cellule 'D2' est un texte et non une date de série , qui doit être format date utilisé ?, est-ce également le format de date par défaut de votre système?


3 Réponses :


1
votes

Le modèle dans votre tableau est:

  1. Le dernier vendredi de chaque mois est le mois de clôture, ce qui signifie ...
  2. Le dernier samedi de chaque mois est le début du mois suivant

Cela prendra une entrée, vérifiera qu'il s'agit d'une date et verra si la date est antérieure, égale ou postérieure au dernier vendredi du mois d'entrée.

  1. Si avant, CSTMonth = Mois des entrées
  2. Si égal, CSTMonth = Mois des entrées
  3. Si après, CSTMonth = Mois après les entrées Mois

Option Explicit

Public Function CSTMonth(Target As Range)

If IsDate(Target) Then

  Dim LastDay As Date: LastDay = WorksheetFunction.EoMonth(Target, 0)
  Dim LastFri As Date: LastFri = LastDay - (Weekday(LastDay + 1) Mod 7)

    If Target <= LastFri Then
        CSTMonth = Format(Target, "MMM-YY")
    Else
        CSTMonth = Format(LastDay + 1, "MMM-YY")
    End If

End If

End Function

L'avantage de trouver le modèle dans votre table est qu'il n'aura jamais besoin d'être mis à jour avec force brute code> . Adopter votre approche signifierait coder en dur chaque mois les dates de début et de fin.


2 commentaires

Mon utilisation de la syntaxe IF n'était pas dans le contexte d'un UDF mais plutôt d'une instruction IF en ligne dans Excel.


Bonjour, j'ai été informé que le modèle des mois financiers se terminant le dernier vendredi de chaque mois n'est malheureusement pas la façon dont nos mois sont définis, ils sont définis de manière ambiguë par notre société mère. Parfois, ils suivent un cycle de 4-4-5 semaines, parfois non. En conséquence, une méthode de code en dur est nécessaire. En supposant que j'ai un tableau de chaque date de fin de mois - comment puis-je coder en dur dans VBA? Merci.



-1
votes

Je ne suis pas sûr des complications auxquelles vous êtes confronté mais pour obtenir les résultats souhaités selon votre tableau, vous pouvez également utiliser une formule plus simple comme

= TEXTE (EOMONTH (A2,1), "AA-MMM")

OU

= EOMONTH (A2,1) et formatez la cellule au format aa-mmm .

A2 contient la date de début.


0 commentaires

1
votes

Si vous utilisez un tableau avec les dates de début pour chaque période, essayez ce qui suit:

En supposant que le tableau avec les dates de début de période se trouve à B2: D25 et les dates sont localisées à F2: F25 et J2:J25

Entrez cette formule pour obtenir la Période Financière sous forme de numéro de date en G2 puis copiez-le dans G3: G25 et K2:K25:

=TEXT(VLOOKUP(F3,$B$2:$D$25,3,1),"mmm-yyyy")

Entrez cette formule pour obtenir la période financière sous forme de texte dans H2 puis copiez-le dans H3: H25 et L2:L25:

=VLOOKUP(F3,$B$2:$D$25,3,1)

entrez la description de l'image ici


0 commentaires