XL 2019 Mutli condition

SPGoder

XLDnaute Occasionnel
Bonjour
Suite de mon projet, je rencontre un problème conceptuel.
La partie de code suivante, fonctionne très bien (les variables period et D_period sont justes déclarées)
VB:
        ' Création reporting mensuel
       Dim Date1 As Date, Date2 As Date, M As Integer, Mois(1 To 12) As String, Period As String, D_Period As String
      
       Date1 = CDate(TextBox7)
       Date2 = CDate(TextBox8)
       Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 26, False)  ' récupère la périodicité, combobox avec comme liste (mensuel, bimensuel, trimestriel, semestriel, annuel)
       D_Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 45, False)  'récupère le début de périodicité, combobox des mois de l'année
      
            
       For M = 1 To 12
            Mois(M) = Format(DateSerial(1, M, 1), "mm")
            
      Next M
      
       If Val(Mois(1)) >= Month(Date1) And Val(Mois(1)) <= Month(Date2) Then Mois(1) = "Janvier" Else Mois(1) = ""
        If Val(Mois(2)) >= Month(Date1) And Val(Mois(2)) <= Month(Date2) Then Mois(2) = "Février" Else Mois(2) = ""
         If Val(Mois(3)) >= Month(Date1) And Val(Mois(3)) <= Month(Date2) Then Mois(3) = "Mars" Else Mois(3) = ""
          If Val(Mois(4)) >= Month(Date1) And Val(Mois(4)) <= Month(Date2) Then Mois(4) = "Avril" Else Mois(4) = ""
           If Val(Mois(5)) >= Month(Date1) And Val(Mois(5)) <= Month(Date2) Then Mois(5) = "Mai" Else Mois(5) = ""
            If Val(Mois(6)) >= Month(Date1) And Val(Mois(6)) <= Month(Date2) Then Mois(6) = "Juin" Else Mois(6) = ""
             If Val(Mois(7)) >= Month(Date1) And Val(Mois(7)) <= Month(Date2) Then Mois(7) = "Juillet" Else Mois(7) = ""
              If Val(Mois(8)) >= Month(Date1) And Val(Mois(8)) <= Month(Date2) Then Mois(8) = "Août" Else Mois(8) = ""
               If Val(Mois(9)) >= Month(Date1) And Val(Mois(9)) <= Month(Date2) Then Mois(9) = "Septembre" Else Mois(9) = ""
                If Val(Mois(10)) >= Month(Date1) And Val(Mois(10)) <= Month(Date2) Then Mois(10) = "Octobre" Else Mois(10) = ""
                 If Val(Mois(11)) >= Month(Date1) And Val(Mois(11)) <= Month(Date2) Then Mois(11) = "Novembre" Else Mois(11) = ""
                  If Val(Mois(12)) >= Month(Date1) And Val(Mois(12)) <= Month(Date2) Then Mois(12) = "Décembre" Else Mois(12) = ""
                      
        
        
       NewFiche.Range("B13").Value = Mois(1) ' Janvier
       NewFiche.Range("B14").Value = Mois(2) ' Février
       NewFiche.Range("B15").Value = Mois(3) ' Mars
       NewFiche.Range("B16").Value = Mois(4) ' Avril
       NewFiche.Range("B17").Value = Mois(5) ' Mai
       NewFiche.Range("B18").Value = Mois(6) ' Juin
       NewFiche.Range("B19").Value = Mois(7) ' Juillet
       NewFiche.Range("B20").Value = Mois(8) ' Août
       NewFiche.Range("B21").Value = Mois(9) ' Septembre
       NewFiche.Range("B22").Value = Mois(10) ' Octobre
       NewFiche.Range("B23").Value = Mois(11) ' Novembre
       NewFiche.Range("B24").Value = Mois(12) ' Décembre

Et voici ce que ça donne, on peut constater qu'un locataire qui rentre en février, n'a pas le mois de janvier activé

Capture.JPG


Mais j'ai 2 contraintes supplémentaires
La périodicité des loyers, et le début de cette périodicité. c'est a dire ne faire apparaitre que les mois où le loyer est dû.
Avec 1, j’aurai fait méthode un peu bourrin avec des IF Then, mais avec les 2, ça devient lourd, très lourds
Je suis sur qu'il y a d'autres méthode, mais je suis ignare en ce domaine
Si une bonne âme voulais m'aiguiller (voir beaucoup ) je l'en remercie
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour SPGoder,
Juste une proposition de simplification de code :
VB:
Sub NewProposal()
   ' Création reporting mensuel
    Dim Date1 As Date, Date2 As Date, M As Integer, Mois(1 To 12) As String, Period As String, D_Period As String, NomMois
    NomMois = Array("", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
    
    Date1 = CDate(TextBox7)
    Date2 = CDate(TextBox8)
    Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 26, False)  ' récupère la périodicité, combobox avec comme liste (mensuel, bimensuel, trimestriel, semestriel, annuel)
    D_Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 45, False)  'récupère le début de périodicité, combobox des mois de l'année
    
    For M = 1 To 12
        Mois(M) = Format(DateSerial(1, M, 1), "mm")
        If Val(Mois(M)) >= Month(Date1) And Val(Mois(M)) <= Month(Date2) Then Mois(M) = NomMois(M) Else Mois(M) = ""
        NewFiche.Range("B" & 12 + M).Value = Mois(M)
    Next M
End Sub
Je pense que ça fait la même chose.
Maintenant on va regarder ce problème.:)
 

SPGoder

XLDnaute Occasionnel
Merci Sylvanu
Pour les questions:
1 Pas forcement, ils peuvent être réglé de manière mensuelle, bimensuelle, trimestrielle, semestrielle Voir annuelle(ce dernier est une éventualité), pour les autres, lorsque les biens sont de types locaux commerciaux, ce sont ces derniers qui font la demande .
2 Le début de périodicité, c'est le mois de la première échéance une fois la périodicité mise en route
exemple, si le locataire prend le logement en février, et que la périodicité est trimestrielle, il réglera février et mars sur février, et les 3 mois suivants sur avril
Mais on peut partir sur un trimestre des le premier loyer

Pour le code, il fonctionne de la même manière, mais en plus simple, effectivement
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Un premier essai, mais sans le fichier c'est un peu en "aveugle" sans pouvoir tester.
VB:
Sub NewProposal()
   ' Création reporting mensuel
    Dim Date1 As Date, Date2 As Date, M As Integer, Mois(1 To 12) As String, Period As String, D_Period As String, NomMois
    Dim IndexMois As Integer
    NomMois = Array("", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
    
    Date1 = CDate(TextBox7)
    Date2 = CDate(TextBox8)
    Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 26, False)  ' récupère la périodicité, combobox avec comme liste (mensuel, bimensuel, trimestriel, semestriel, annuel)
    D_Period = WorksheetFunction.VLookup(ComboBox1.Value, Ws.Range("A1:AS50"), 45, False)  'récupère le début de périodicité, combobox des mois de l'année
    
    IndexMois = 0 ' Premier mois où il faut payer
    For M = 1 To 12
        Mois(M) = Format(DateSerial(1, M, 1), "mm")
        If Val(Mois(M)) >= Month(Date1) And Val(Mois(M)) <= Month(Date2) Then
            Mois(M) = NomMois(M)
            If IndexMois = 0 Then IndexMois = M ' on mémorise le premier mois
        Else
            Mois(M) = ""
        End If
    Next M
    
    'Effacement plage mois et remplissage des mois à "loyers"
    Range("B12:B24").ClearContents
    
    'On parcourt du premier mois (IndexMois) à Décembre avec un step de la pérodicité (D_Period)
    IndexList = 0  ' Index d'écriture dans la feuille
    For M = IndexMois To 12 Step D_Period
        If Mois(M) <> "" Then
            NewFiche.Range("B" & 12 + IndexList).Value = Mois(M)    ' On écrit le mois
            IndexList = IndexList + 1                               ' On incrémente l'index pour la prochaine écriture
        End If
    Next M

End Sub
La première partie reste la même exceptée l'écriture dans la feuille.
Ensuite on écrit dans la feuille du premier mois à payer à décembre avec la bonne périodicité.
A tester et critiquer.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Il suffit de récupérer le N° du mois :
VB:
....
    For i = 1 To 12
        If NomMois(i) = D_Period Then Nb_D_Period = i
    Next i
    For M = IndexMois To 12 Step Nb_D_Period
....
en espérant que ça marche ... à la condition qu'il y ait bien la même syntaxe ( accents par ex )
 

Pièces jointes

  • SPGoder(V2).xlsm
    13.8 KB · Affichages: 6

SPGoder

XLDnaute Occasionnel
3.JPG

Voici ce que ça donne

4.JPG

Et ce que j'aurais voulu que ça donne

period=trimestriel
D_period= Juillet
Début de la location (date1)= mai
Fin de location (date 2) = au dernier jour de l'année

Dans ce cas, le locataire règle au trimestre (janv, avr, juil, oct) mais comme il est rentré en mai, son premier loyer est du que sur 2 mois
Pour la gestion des montant, je m'en occuperai, mais c'est pour les mois sur le coté
 

SPGoder

XLDnaute Occasionnel
Pour initialisé le combobox que j'utilise pour alimenté mon tableau (sur le quel on récupère D_period)
voici mon code
VB:
'initialise combobox7 "debut de Périodicité"

         For M = 1 To 12

            Mois(M) = Format(DateSerial(1, M, 1), "mmmm")

            ComboBox7.AddItem Mois(M)

         Next M

Et à regarder la liste chargée dans le combobox, cela à l'air de correspondre à la votre niveau accent
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Un dernier test en PJ avec ce que j'ai compris.
Sans fichier test, c'est extrêmement frustrant de "pisser" du code sans pouvoir tester et sans avoir réellement les résultats à obtenir.

Dans ce fichier j'ai mis en commentaires de quoi retoucher la macro de vous même : Périodicité et distribution des mois.
 

Pièces jointes

  • SPGoder(V3).xlsm
    18 KB · Affichages: 9

SPGoder

XLDnaute Occasionnel
Je suis extrêmement désolé de ne pas avoir fourni le fichier, mais je ne peux pas le télécharger, il est trop volumineux.
La prochaine fois, je supprimerai tout ce qui est inutile, et cela devrait passé.
Je ne me rends pas compte de la frustration que cela peut occasionner. Je pensais qu'avec ce que j'avais fourni cela suffirai.
Pour ce qui est est du code, félicitation, cela fonctionne comme je le souhaite. Trop fort (e)
Un grand merci, et bonne continuation.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ce qui est frustrant c'est de ne pas apporter une solution qui vous satisfasse.
Mais impossible d'imaginer que vous vouliez les mois autrement que dans une liste sans espace vides, et encore moins que Mai,Juillet,Octobre est trimestriel.
Trimestriel c'est trois mois entre chaque échéance donc ce serait Mai Aout Novembre.
Ceci dit, si ça marche c'est le principal. Je pense qu'il y a suffisamment de commentaires pour que vous puissiez en faire la maintenance le cas échéant.
Bonne journée.:)