Gérer un calendrier

softimen

XLDnaute Nouveau
Bonjour ,

J'ai besoin de votre aide pour résoudre mon problème s'il vous plait que je trouve un peu compliquée pour moi :( .
Je commence par vous expliquer mon problème :

j'ai deux fichier sur le mémé classeur excel 2010 .

-le premier fichier :qui contient des données ;trajet , trajet associé et un calendrier qui est saisie automatiquement suite a la saisie des dates de circulation de ce trajet .les dates donc seront remplies dans le calendrier par des "X" pour la période de circulation.

-le deuxième fichier , contient le trajet , le trajet associé avec date d'ouverture de ce trajet .

Je voudrai si c'est possible pour le deuxième fichier ,si pour untrajet ,on a une date d'ouverture précise , alors ,il revient vers le fichier 1 et cherche ce trajet et la date de circulation qui est saisie par "X"(convertir ce X par une date pour peut faire la comparaisson) ;et supprimer dans ce calendrier le "X" qui correspend a cette date.

j’espère que j'ai bien expliqué mon souci .
Je vous joint un fichier pour mieux expliquer mon souci .
J'ai codé un truc mais ça ne fonctionne pas :(
Dans l'attente de votre aide .Je vous remercie d'avance pour vos effort
 

Pièces jointes

  • gerer calendrier.xlsm
    2.5 MB · Affichages: 36

vgendron

XLDnaute Barbatruc
Bonjour
en fait, non c'est pas clair
déjà. on va essayer d'utiliser les bons termes..
Dans le Classeur "Gerer calendrier.xlsm", tu as DEUX onglets
onglet 1 "Saisie des fermetures" et onglet 2 "Recap Fermeture pour Ouverture"

Si j'ai bien compris, dans onglet 1, tu as des lignes avec trajet (colonne B) - Trajet Associé (Colonne C) et date fermeture (Colonne S) puis calendrier
1) quand tu saisis une date en colonne S.. des "X" se placent automatiquement à la bonne date dans le calendrier.. (automatiquement.. = avec macro "gerer" ??

dans onglet 2, tu as le trajet ("Colonne B), trajet associé Colonne E, et date colonne L: Infos qui viennent de l'onglet 1 (de quelle manière? copier coller manuel??)

Je voudrai si c'est possible pour le deuxième fichier ,si pour untrajet ,on a une date d'ouverture précise , alors ,il revient vers le fichier 1 et cherche ce trajet et la date de circulation qui est saisie par "X"(convertir ce X par une date pour peut faire la comparaisson) ;et supprimer dans ce calendrier le "X" qui correspend a cette date.
euh...??? avec un exemple ce serait peut etre plus parlant..

En passant, j'ai regardé ta macro Gerer... je n'ai pas compris ce qu'elle est censée faire. mais en tout cas. il manque des end if et next..
VB:
Sub gerer()
Application.ScreenUpdating = False

Dim FL1 As Worksheet
Dim FL2 As Worksheet
Dim dat(13) As String
Dim pos(13) As Integer
Dim i As Integer
Dim jour As Integer
Dim mois As Integer
Dim l As Integer
Dim k As Integer
Dim nb As Integer
Dim h As Integer
Dim w As Integer
Dim datecir As String


Set FL1 = Worksheets(1)
Set FL2 = Worksheets(2)
ann2 = FL1.Cells(1, 3).Value
ann1 = ann2 - 1


dat(1) = "12/" & ann1
dat(2) = "01/" & ann2
dat(3) = "02/" & ann2
dat(4) = "03/" & ann2
dat(5) = "04/" & ann2
dat(6) = "05/" & ann2
dat(7) = "06/" & ann2
dat(8) = "07/" & ann2
dat(9) = "08/" & ann2
dat(10) = "09/" & ann2
dat(11) = "10/" & ann2
dat(12) = "11/" & ann2
dat(13) = "12/" & ann2

i = 1
For j = 34 To FL1.Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1
    If (FL1.Cells(6, j).Value Like "1") Then
        pos(i) = j
        i = i + 1
    End If
Next j

'traitement principal
nb = 9

For NoLig = 8 To Split(FL1.UsedRange.Address, "$")(4)
    w = NoLig
    k = 0
    For j = 34 To FL1.Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1
        If (FL1.Cells(NoLig, j) <> "") Then
            k = k + 1
        End If
    Next j

    For j = 34 To FL1.Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1
        If (FL1.Cells(NoLig, j) <> "") Then
            jour = FL1.Cells(6, j)
            l = j
            mois = posmois(l, jour)
            'on a former une date
            da = datecirculation(mois, dat(), pos())
            If ((jour Like "1") Or (jour Like "2") Or (jour Like "3") Or (jour Like "4") Or (jour Like "5") Or (jour Like "6") Or (jour Like "7") Or (jour Like "8") Or (jour Like "9")) Then
                datecir = "0" & jour & "/" & da
            Else
                datecir = jour & "/" & da
            End If
        End If
    Next j
   
    'si la date d'ouverture egale a la date dans le calendrier alors supprime la date
    For nb = 9 To Split(FL2.UsedRange.Address, "$")(4)
        If da Like Cells(nb, 12) Then
            Cells(NoLig, j) = ""
        End If
    Next nb
Next NoLig

Application.ScreenUpdating = True
End Sub
 

vgendron

XLDnaute Barbatruc
bon.. déjà.. toutes tes macros et fonction pour récupérer, reconstruire la date.. ca ne sert à rien dès que tu utilises un truc tout simple d'excel
le format date personnalisé

1) ligne 6:
V6= formule pour mettre le 1er décembre de l'année
ensuite. +1 sur tout le reste de la ligne
par défaut. c'est une date Jour / Mois /Année
pour n'afficher QUE le jour: utiliser format personnalisé
2) ligne 4 = ligne6 avec format personnalisé pour afficher le jour "Lun, mar, mer...."

Ensuite: Règle importante pour écrire une macro avec des For, If.....==> Utiliser l'indentation pour bien séparer les blocs.. comme ca. tu vois tout de suite si tu as oublié du End if ou Next.. et tu vois ce que tu fais dans quelle boucle.. parce que le code proposé, calcule plein de choses... et n'en fait strictement rien...

voir Ce code
VB:
Sub gerer()
Application.ScreenUpdating = False

Dim FL1 As Worksheet
Dim FL2 As Worksheet

Dim NoLig As Integer
Dim Trajet, TrajetAssocié As Long
Dim k As Integer
Dim datecir As Date

Set FL1 = Worksheets(1)
Set FL2 = Worksheets(2)

With FL1
    LastCol = .Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1
 
    For NoLig = 8 To .UsedRange.Rows.Count 'sur chaque ligne du tableau
        Trajet = .Range("B" & NoLig)
        TrajetAssocié = .Range("C" & NoLig)
        k = WorksheetFunction.CountIf(.Cells(NoLig, "V").Resize(1, LastCol - 21), "X") 'compte le nombre de "X" dans la ligne==> et après? on en fait quoi?
         
        On Error Resume Next
        For Each ele In .Cells(NoLig, "V").Resize(1, LastCol - 21).SpecialCells(xlTextValues)
            If ele <> "" Then
                'MsgBox ele.Column
                datecir = .Cells(6, ele.Column)
                With FL2
                    Fin = .Range("B" & .Rows.Count).End(xlUp).Row
                    Set ici = .Range("B8:B" & Fin).Find(Trajet, LookIn:=xlValues, lookat:=xlWhole)
                    If Not ici Is Nothing Then
                        If datecir = .Cells(ici.Row, 12) Then
                            FL1.Cells(NoLig, ele.Column) = ""
                        End If
                    End If
                End With
            End If
        Next ele
    Next NoLig
End With
Application.ScreenUpdating = True
End Sub

et ce fichier
 

Pièces jointes

  • gerer calendrier Rev2.xlsm
    84.9 KB · Affichages: 34

devimen2

XLDnaute Nouveau
Bonjour Vgendron :D ,

Je vous remercie pour votre retour :)

J'ai crée un autre compte ,comme j'ai pas réussi de me connecter avec mon compte devimen, j'ai eu un problème de connexion.

Dans le Classeur "Gerer calendrier.xlsm", J'ai DEUX onglets:

onglet 1 "Saisie des fermetures" et onglet 2 "Recap Fermeture pour Ouverture"

  • Dans onglet 1, j'ai des lignes avec trajet (colonne B) - Trajet Associé (Colonne C) et dates/régime impact (Colonnne K:U) puis calendrier qui sera rempli automatiquement a partir de données qui existent dans les colonnes (K:U)
- quand je saisis une date/régime impact en colonne( k:U) ;des "X" se placent automatiquement à la bonne date dans le calendrier.. (automatiquement.. = avec macro "remplircalendrier")

  • dans onglet 2, les informations seront copié automatiquement a partir de l'onglet 1 (automatiquement macro =recap). j'ai le trajet ("Colonne B) ,[ date de circulation (colonne C) qui est rempli automatiquement à partir de l'onglet1, en effet ces dates de circulations correspend a des "X" dans le calendrier , onglet1) ,en effet un ("X" dans le calendrier se traduit en une date qui sera remplie dans la colonne C de l'onglet 2) ;trajet associé Colonne E, et date ouverture colonne L qui sera saisie manuellement.

  • Suite a la saisie de la date d'ouverture (colonne L , onglet 2),-->le trajet associé (colonne B,onglet2) ,ainsi que la date de circulation (colonne B,onglet2), ,-->on bascule directement a l'onglet 1 pour chercher dans l'onglet 1,ce trajet qui coresspend a cette date de circulation [ date de circulation de l'onglet 2 égale a un "X" dans le calendrier ,onglet 1] , des qu'il trouve cette (date="X"); il supprime ce "X".
Donc , pour résumé , si j'ai une date d'ouverture saisie en (colonne L , onglet2 ); alors récupérer le trajet(colonne B, onglet2),date de circulation (colonne c , onglet 2) et basculer sur le 1 onglet pour chercher ce trajet (colonne B, onglet1) , date de circulation (correspond a "x" dans calendrier , onglet 1) , faire la comparaison des dates , si ok alors supprimer"x" de calendrier ,onglet1 .et passe a une autre ligne .


J'ai expliqué mieux dans mon fichier .la macro gerer calendrier se trouve dans le module 1 avec des commentaires.

j’espère que j'ai bien répondu a vos questions.

Dans l'attente de votre aide , je vous remercie énormément pour votre temps .
 

Pièces jointes

  • gérer calendrier.xlsm
    2.7 MB · Affichages: 19

vgendron

XLDnaute Barbatruc
Bon déjà..
va falloir etre plus carré et plus propre...
1) le fichier que tu viens de poster ne ressemble plus à celui que tu avais posté avant: des colonnes sont apparues (je comprend maintenant pourquoi tu faisais des boucles for i=34 to... au lieu de for i=22 to...

QUEL est le bon fichier?

2) Tu as des macros à rallonge qui sont INCOMPREHENSIBLES !
==> totalement inutile de laisser 15 lignes vides entre deux lignes de code
et excuxe moi. mais l'indentation. c''est INDISPENSABLE
d'après toi. entre les deux codes ci dessous.. lequel est le plus simple à comprendre (et donc à corriger)

VB:
Sub gerer()
Application.ScreenUpdating = False

Dim FL1 As Worksheet
Dim FL2 As Worksheet

Dim NoLig As Integer
Dim Trajet, TrajetAssocié As Long
Dim k As Integer
Dim datecir As Date

Set FL1 = Worksheets(1)
Set FL2 = Worksheets(2)

With FL1
    LastCol = .Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1
   
    For NoLig = 8 To .UsedRange.Rows.Count 'sur chaque ligne du tableau
        Trajet = .Range("B" & NoLig)
        TrajetAssocié = .Range("C" & NoLig)
        k = WorksheetFunction.CountIf(.Cells(NoLig, "V").Resize(1, LastCol - 21), "X") 'compte le nombre de "X" dans la ligne==> et après? on en fait quoi?
           
        On Error Resume Next
        For Each ele In .Cells(NoLig, "V").Resize(1, LastCol - 21).SpecialCells(xlTextValues)
            If ele <> "" Then
                'MsgBox ele.Column
                datecir = .Cells(6, ele.Column)
                With FL2
                    Fin = .Range("B" & .Rows.Count).End(xlUp).Row
                    Set ici = .Range("B8:B" & Fin).Find(Trajet, LookIn:=xlValues, lookat:=xlWhole)
                    If Not ici Is Nothing Then
                        If datecir = .Cells(ici.Row, 12) Then
                            FL1.Cells(NoLig, ele.Column) = ""
                        End If
                    End If
                End With
            End If
        Next ele
    Next NoLig
End With
Application.ScreenUpdating = True
End Sub

VB:
Sub gerer2()
Application.ScreenUpdating = False

Dim FL1 As Worksheet
Dim FL2 As Worksheet

Dim NoLig As Integer
Dim Trajet, TrajetAssocié As Long
Dim k As Integer
Dim datecir As Date

Set FL1 = Worksheets(1)
Set FL2 = Worksheets(2)

With FL1
LastCol = .Cells(6, Columns.Count).End(xlToLeft).MergeArea.Offset(0, 1).Column - 1

For NoLig = 8 To .UsedRange.Rows.Count 'sur chaque ligne du tableau
Trajet = .Range("B" & NoLig)
TrajetAssocié = .Range("C" & NoLig)
k = WorksheetFunction.CountIf(.Cells(NoLig, "V").Resize(1, LastCol - 21), "X") 'compte le nombre de "X" dans la ligne==> et après? on en fait quoi?

On Error Resume Next
For Each ele In .Cells(NoLig, "V").Resize(1, LastCol - 21).SpecialCells(xlTextValues)
If ele <> "" Then
'MsgBox ele.Column
datecir = .Cells(6, ele.Column)
With FL2
Fin = .Range("B" & .Rows.Count).End(xlUp).Row
Set ici = .Range("B8:B" & Fin).Find(Trajet, LookIn:=xlValues, lookat:=xlWhole)
If Not ici Is Nothing Then
If datecir = .Cells(ici.Row, 12) Then
    FL1.Cells(NoLig, ele.Column) = ""
End If
End If
End With
End If
Next ele
Next NoLig
End With
Application.ScreenUpdating = True
End Sub

quand il y a 20 lignes. ca peut encore aller.. mais quand ca atteint les 500 lignes comme c'est le cas chez toi... c'est totalement rédhibitoire

autre chose: AUCUN interet de "pré formater " 50 000 lignes et colonnes vides
au contraire.. ca peut bloquer un code et engendrer des temps d'exécution extrêmement longs !

Comme je crois reconnaitre un autre post.. où est le reste des macros? (avec ajout de menus contextuels pour inserer des lignes)
===> c'est pour etre sur d'avoir une version complète

et enfin. as tu essayé le dernier fichier que je t'ai envoyé? : "Gerer calendrier Rev2"
 

vgendron

XLDnaute Barbatruc
Et une question..
est ce que ton fichier avec toutes tes macros fonctionne?????
j'ai du mal à croire car chez moi. déjà. il ne connait pas la fonction "Verif"..

faudrait expliquer la logique utilisée pour le code.. parce que la. j'ai du mal..
 

devimen2

XLDnaute Nouveau
Bonjour Vgendron ,

Merci pour votre temps et votre aide .
Tout d'abord , je travaille sur le deuxième fichier que j'ai posté ,

le plus simple à comprendre (et donc à corriger) c'est le macro gérer 2,
j'ai enlever les menus contextuels , et des autres macros pour faciliter la compréhension de mon problème .

Donc, Je vous rejoint alors ,mon fichier avec les menus contextuels et les autres macros. Mais oui tout les macros fonctionnent sauf ma macro gerer2.

Sinon ,j'ai essayé la macro de fichier rev2 que vous m'avez envoyé ;mais ça ne fonctionne pas malheureusement :( .

Donc , pour résumé , si j'ai une date d'ouverture saisie en (colonne L , onglet2 ); alors récupérer le trajet(colonne B, onglet2),date de circulation (colonne c , onglet 2) et basculer sur le 1 onglet pour chercher ce trajet (colonne B, onglet1) , date de circulation (correspond a "x" dans calendrier , onglet 1) , faire la comparaison des dates , si ok alors supprimer"x" de calendrier ,onglet1 .et passe a une autre ligne .
'exemple "
' si FL2.cells(9,12) <> " "
alors recupere FL2.cells(9,2) et FL2.cells(9,3) et basculer sur l'onglet 1 :
ON TROUVE dans l'onglet1
FL1.cells(8,2) = FL2.cells(9,2) qui coreespend à des "x" pour les dates de circulations de 12/11/2018 au 23/11/2018, alors on supprime ces "X"

Vraiement , j'ai besoin de votre aide comme vous etes fort en vba , j'ai essayé pour trouver une solution pour ma macro (module2) mais ça fonctionne pas .

'le logique que je me suis basées c'est que convertir le "X"de l'onglet 1 par des dates pour qu'on puisse faire la comparaison avec colonne C de l'onglet2 .
Dans l'attente de votre aide , j'espere que j'ai bien expliqué mon souci :( et je m'excuse que j'ai pas bien expliquée les choses .
Merci pour votre temps et votre aide Vgendron .
 

Pièces jointes

  • macro gerer.xlsm
    2.8 MB · Affichages: 39

vgendron

XLDnaute Barbatruc
Salut
Je suis en train de faire le tri dans toutes tes macros.. avec GROSSES simplifications (notamment au niveau des constructions et recherche des dates)
ainsi qu'une grosse Réorganisation du code pour clarifier et simplifier tout ca
et je reviens vers toi un peu plus tard - demain après midi voire vendredi
 

devimen2

XLDnaute Nouveau
Bonjour Vgendron :D ,

Je vous remercie énormément pour votre temps et pour votre aide qui m'a beaucoup aidé pour avancé dans mon projet :) .
Je m'excuse aussi pour la construction et la recherche des dates , comme je suis débutante en VBA , avec le temps , mes codes seront mieux :D .
Dans l'attente de votre aide, je reste a votre disposition pour toute information .
Merci infiniment.
Bonne journée.
 

vgendron

XLDnaute Barbatruc
Hello
je suis sur les différents tests de controle sur les éléments à remplir: exemple les jours précis qui doivent etre des dates séparées par ";" et dans le calendrier

peux tu m'en dire un peu plus sur les autres conditions?
Ce que j'ai compris pour l'instant
1) Si Q est coché.. ca veut dire que TOUTE l'année va etre remplie par des X (ou des SP si Suppression coché aussi)
2) Si Du et AU sont cochés (il faut que les deux soient cochés en meme temps), ca défini une période
avec cette période, il faut AUSSI définir AU moins 1 jour (lundi au dimanche) en colonne K à R
ex: du 01/12 au 15/12 avec Lun et Mer cochés: on met un X en face des Lundi et Mercredi de la période (ou SP si suppression coché)
3) les jours précis.. sont des jours à cocher (quelque soit ce qui est saisi en Lundi ..dimanche ??)
peuvent ils etre définis EN PLUS d'une période ?

Si Q est coché. est ce genant d'avoir des X dans les autres colonnes?

en fait, il faudrait que tu listes les conditions qui font que tu as un message d'erreur
 

devimen2

XLDnaute Nouveau
Bonjour Vgendron :D ,

Merci pour votre retour et votre temps.

Pour le remplissage de calendrier ,ça fonctionne très bien :D ,je sais que le code est long :( mais comme ça était la première macro que j'ai fais :) ;sinon, j'ai un problème que avec la macro " gérer le calendrier" :( .

Donc pour répondre a vos questions :
1) pour les dates précises ; il faut que la colonne date précises soit cochés les autres colonnes doit êtres vides ; les jours précis sont séparées par ";"
2) si Q cochées ;il faut que les autres colonnes soit vides --> cad remplire toute le calendrier par des "X"
3) si Q cochées avec "Du" à "Au",il faut que les autres colonnes soient vides --> remplir le calendrier par des "X" pour cettes periode "du" à "au"
4) si "lu" ou "ma" ou "me " ou "je" ou "ve" ou "sa" ou "di " avec "du" à "au" cochées , il faut que les autres colonnes soient vides --> alors cochées des "X" pour cette période "du" à "au" , seulement pour les jours choisies
5) si "lu" cochées ,il faut que "Q" et "jours précises soient vides , alors cochess des "x" de toutes les lundis de calendrier .

j’espère que j'ai bien répondu à votre question :)
Merci
 

vgendron

XLDnaute Barbatruc
j'ai un problème que avec la macro " gérer le calendrier
oui oui, c'est bien la dessus que je travaille. sauf que pour ca. j'ai besoin de reprendre tout le reste (sinon, ca ne fonctionnera plus)

pour les Dates /Régimes d'impact.. si je comprend bien
il n'y a finalement que 3 possibilités de remplissage du calendrier
1) soit Q = toute l'année (==> toutes les autres cases doivent etre vides)
2) Soit une période Du-->Au: ==>Q doit etre vide.. et AU MOINS un jour doit etre choisi
3) Soit un ou des jours précis ==> Toutes les autres cases doivent etre vides

Correct?
 

Discussions similaires

Réponses
6
Affichages
309

Statistiques des forums

Discussions
312 165
Messages
2 085 882
Membres
103 009
dernier inscrit
dede972