Microsoft 365 Convertir dates multiples en n° semaine + gestion condition cellule fusionée

spike29

XLDnaute Occasionnel
Bonjour,

Débutant en VBA, j'utilise un fichier de suivi d'actions suivi par date et période (JOUR NUIT) pour lequel je souhaite faire quelques statistiques.


1er besoin :
Dans la colonne J, en fonction de ce qui est contenu dans la dernière cellule fusionnée rencontrée, saisir la valeur "NUIT" si dernière cellule fusionnée contient NUIT ou "JOUR" si dernière cellule fusionnée rencontrée contient Journée.

2ème besoin :
Suivant la même logique que le besoin 2, saisir le numéro de semaine en colonne I correspondant à la valeur contenue dans la dernière cellule fusionnée rencontrée.

Merci d'avance pour votre aide.

En PJ je joint le fichier illustrant ces besoins.
 

Pièces jointes

  • TEST1.xlsm
    23.3 KB · Affichages: 13
Solution
Re,
Un essai en PJ avec :
VB:
Sub Test()
Application.ScreenUpdating = False
For e = 8 To Range("A65500").End(xlUp).Row
    If Not IsEmpty(Range("A" & e)) And Range("A" & e) Like "*du*" Then
        Cells(e, 1).Resize(, 10).Merge
    Else
        Cells(e, "I") = SemJourNuit(e, 0)
        Cells(e, "J") = SemJourNuit(e, 1)
    End If
Next e
End Sub

utiliser une fonction perso c'est exactement comme utiliser une fonction XL.
Au lieu de X=SUM(A,B) vous mettez X=SemJourNuit(A,B)

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Spike,
Un essai en PJ avec une fonction perso :
VB:
Function SemJourNuit(Ligne%, R%) ' R=1 remonte Jour/Nuit R=0 remonte N° de semaine
    Application.Volatile
    For L = Ligne To 1 Step -1
        If Cells(L, "A").MergeCells Then
            If R = 1 Then
                If Cells(L, "A") Like "*Nuit*" Then SemJourNuit = "Nuit" Else SemJourNuit = "Jour"
            Else
                SemJourNuit = Val(Format(CDate(Split(Cells(L, "A"), " ")(2)), "WW"))
            End If
            Exit For
        End If
    Next L
End Function
La syntaxe est =SemJourNuit(LIGNE();X) avec X=1 pour Jour/Nuit et 0 pour N° de semaine.
A noter que le 08/04/2021 est la semaine 15 et non 14 pour XL.
 

Pièces jointes

  • TEST1.xlsm
    24.2 KB · Affichages: 4

spike29

XLDnaute Occasionnel
Bonsoir à tous les deux et un grand merci pour vos réponses. Elles correspondent parfaitement à mes besoins.


@sylvanu, j'éssai de déclencher ta fonction directement depuis ma procédure "TEST" mais sans succès. Je ne suis pas très à l'aise avec l'utilisation des fonctions.

VB:
Sub Test()

For e = 8 To 65000
If Not IsEmpty(Range("A" & e)) And Range("A" & e) Like "*du*" Then
Cells(e, 1).Resize(, 10).Merge
End If

Next e

Call SemJourNuit(Ligne%, R%)

End Sub

L'utilisation de Call semble ne pas fonctionner, une idée ?


Bonne fin de journée
 

Pièces jointes

  • Copie de TEST1 (4).xlsm
    25.9 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Bonsoir spike, le fil,

La syntaxe est =SemJourNuit(LIGNE();X) avec X=1 pour Jour/Nuit et 0 pour N° de semaine.
A noter que le 08/04/2021 est la semaine 15 et non 14 pour XL.

la formule est à appeler depuis la cellule d'une feuille de calcul, pas depuis VBA ; ou alors, si tu l'appelle depuis VBA, faut affecter la valeur de retour de la fonction à une variable, par exemple :

varX = SemJourNuit(LIGNE();1) ou varX = SemJourNuit(LIGNE();0)

soan
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Spike,
SemJourNuit est une fonction donc on ne l'appelle pas avec un call mais on passe par une variable, comme :
VB:
Résultat = SemJourNuit(Ligne, R)
On ne met pas les %, dans la déclaration cela signifie "as integer"
Ensuite il faut passer à la fonction les deux paramètres Ligne et R, par ex dans votre fichier :
Code:
Sub TestFonction()
    Dim N%
    Application.ScreenUpdating = False
    For N = 9 To 23
        Cells(N, "I") = SemJourNuit(N, 0)
        Cells(N, "J") = SemJourNuit(N, 1)
    Next N
End Sub
 

spike29

XLDnaute Occasionnel
Bonjour le fil,

J'ai essayé avec vos différentes proposition mais je suis assez perdu de par ma mauvaise maitrise des fonctions.

@soan merci pour ta réponse. Je n'ai pas du tout réussi à savoir comment et où intégrer ton code :

Code:
varX = SemJourNuit(LIGNE();1) ou varX = SemJourNuit(LIGNE();0)

J'ai tenté d'ajouté du coup => " Résultat = SemJourNuit(Ligne, R) mais sans succès, cela m'indique " Type d'argument ByRef incompatible".

VB:
Sub TestFonction()
    Dim N%
    Application.ScreenUpdating = False
    For N = 9 To 23
        Cells(N, "I") = SemJourNuit(N, 0)
        Cells(N, "J") = SemJourNuit(N, 1)
    Next N
    
    Résultat = SemJourNuit(Ligne, R)
End Sub

Je sèche un peu, n'étant pas du tout à l'aise avec l'utilisation des fonctions.
Pourriez vous si cela ne vous embête pas m'indiquer votre solution directement dans mon fichier en PJ.

L'idéale pour moi serait que la fonction se déclenche automatiquement au déclenchement de la procédure "Test".

Merci d'avance pour votre aide et votre patience.

Le fichier en PJ.

Bonne après-midi.
 

Pièces jointes

  • TEST1 (4).xlsm
    26 KB · Affichages: 2

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Un essai en PJ avec :
VB:
Sub Test()
Application.ScreenUpdating = False
For e = 8 To Range("A65500").End(xlUp).Row
    If Not IsEmpty(Range("A" & e)) And Range("A" & e) Like "*du*" Then
        Cells(e, 1).Resize(, 10).Merge
    Else
        Cells(e, "I") = SemJourNuit(e, 0)
        Cells(e, "J") = SemJourNuit(e, 1)
    End If
Next e
End Sub

utiliser une fonction perso c'est exactement comme utiliser une fonction XL.
Au lieu de X=SUM(A,B) vous mettez X=SemJourNuit(A,B)
 

Pièces jointes

  • TEST1 (9).xlsm
    24.4 KB · Affichages: 5

spike29

XLDnaute Occasionnel
Bonsoir Sylvanu, bonsoir le fil,

Merci pour cette dernière PJ, tout fonctionne parfaitement !

Effectivement après avoir observé ton code tout me paraît plus simple quant à l'interaction fonction / procédure sub ;)

Un grand merci !

Bonne fin de journée et merci également à tout ceux qui ont pu répondre à ma problématique sur ce fil.
 

Discussions similaires

Statistiques des forums

Discussions
312 102
Messages
2 085 304
Membres
102 857
dernier inscrit
Nony1931