Comment extraire quelques lignes d'un fichier Excel automatiquement ? [Résolu]

Signaler
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009
-
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009
-
Bonjour,
J'éspère que quelqu'un pourra me venir en aide... ça urge !
J'ai un fichier Excel ( un planning des activités d'une association ), dans lequel la case du jour est le repère ( remplissage jaune et hachuré ).
J'aimerais extraire ( par rapport à cette date du jour ), les prochaines activités de l'association automatiquement lorsqu'on sauvegarde le fichier.
ça me serait d'un très grand secours si quelqu'un pouvait m'aiguiler...
j'ai aucune connaissance en vba !
merci d'avance

39 réponses

Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

merci Renfield,
ça fonctionne parfaitement !
bonnes fêtes.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
si tu preferes la date du jour :

sEvent = FormatDateTime(Date, vbLongDate) & " - " & .Cells(nRowIndex, 7)

à la place de

sEvent = .Cells(nRowIndex, 7)

ainsi, si aujourd'hui, nous sommes dans une plage, la date du jour sera indiquée

sinon, c'est la date du prochain event


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
qu'entends tu par extraire ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

J'entends par extraire, tout simplement:
-soit générer automatiquement un nouveau fichier excel avec ces quelques lignes dans son contenu,
-soit générer automatiquement un nouvel onglet qui sera re-généré avec le même nom d'onglet à chaque fois que la sauvegarde du Planning est faite.
j'éspère que mes explications de débutant sont claires....
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
ok.

a quoi ressemble ce fichier ? une ligne par jour ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

C'est un calendrier annuel avec des onglets mensuels dans lesquels sont rentré les activités ( parex, pour la période du 18.12 au 03.01: Attention il n'y aura pas cours de danse )...
Il peut y avoir des jours, où il n'y a pas de donnée. Si c'était le cas, la prochaine activité serait prise en compte pour l'extraction.
mais le mieux ce serait que je puisse t'envoyer le fichier concerné, mais comment faire. Il n'y a pas moyen de joindre un fichier sur le forum, je crois.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
le mettre sur un site externe, de partage de ficheir, l'en existe des tas

exemple :

http://www.cijoint.fr/

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

je l'ai mis sur ci-joint:
http://www.cijoint.fr/cjlink.php?file=cj200912/cijxkIjrzV.xlsx
( Planning des activités1.xls.xlsx )
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
Tu peux faire :
Public Function TodayTip() As String
Dim nSheetIndex As Long
Dim sEvent As String
Dim nRowIndex As Long
    nSheetIndex = Month(Date) + 5
    If nSheetIndex > 13 Then
        nSheetIndex = nSheetIndex - 12
    End If
    
    With Worksheets(nSheetIndex)
        For nRowIndex = 4 To 4 + Day(Date)
            If LenB(.Cells(nRowIndex, 6)) Then
                If LenB(.Cells(nRowIndex, 7)) Then
                    sEvent = .Cells(nRowIndex, 7)
                End If
            Else
                sEvent = vbNullString
            End If
        Next
        If LenB(sEvent) = 0 Then
            For nRowIndex = 4 + Day(Date) To 34
                If LenB(.Cells(nRowIndex, 7)) Then
                    sEvent = FormatDateTime(DateSerial(Year(Date), Month(Date), .Cells(nRowIndex, 5)), vbLongDate) & " - " & .Cells(nRowIndex, 7)
                    Exit For
                End If
            Next
        End If
        TodayTip = sEvent
    End With
End Function


Et dans la cellule de ton choix (ou dans une macro)
faire :

=TodayTip()



Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
NB: si le prochain event est le mois prochain, j'ai rien codé en ce sens...


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

merci Renfield,
comme je te l'ai annoncé, je connais rien au vba...
comment faut-il faire pour créer ce Code Visual Basic et l'intégrer dans mon fichier excel ?
... désolé
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
Insère cette fonction dans un module

ton classeur n'en possède pas.
Presse Alt+F11
Ctrl+R
Bouton droit dans la petite fenetre qui s'est ouvertes (projet)
Inserer, module

enfin, dans ton Module1 nouvellement créé, place la fonction que je t'ai proposée.


Dans ton classeur, il suffira de mettre la formule :

=TodayTip()

et hop! le tip du jour s'appliquera.


rien en VBA ? le classeur en est pourtant plein.... :/

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

Merci pour ton aide précieuse,
mais le =TodayTip(), je dois toujours le réactiver, donc entrer dans le fichier réinsérer =TodayTip() dans la cellule pour avoir l'actualité prochaine.
J'ai essayé en changeant la date sur mon ordi...
Est-ce que ça peut s'automatiser ? Ou être effectif lorsqu'on sauvegarde le fichier ?
Bonne soirée
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
un moyen simple de faire et de parametrer la chose :


Public Function TodayTip(Byval vdIn As Date) As String
Dim nSheetIndex As Long
Dim sEvent As String
Dim nRowIndex As Long
    nSheetIndex = Month(vdIn) + 5
    If nSheetIndex > 13 Then
        nSheetIndex = nSheetIndex - 12
    End If
    
    With Worksheets(nSheetIndex)
        For nRowIndex = 4 To 4 + Day(vdIn)
            If LenB(.Cells(nRowIndex, 6)) Then
                If LenB(.Cells(nRowIndex, 7)) Then
                    sEvent = .Cells(nRowIndex, 7)
                End If
            Else
                sEvent = vbNullString
            End If
        Next
        If LenB(sEvent) = 0 Then
            For nRowIndex = 4 + Day(vdIn) To 34
                If LenB(.Cells(nRowIndex, 7)) Then
                    sEvent = FormatDateTime(DateSerial(Year(vdIn), Month(vdIn), .Cells(nRowIndex, 5)), vbLongDate) & " - " & .Cells(nRowIndex, 7)
                    Exit For
                End If
            Next
        End If
        TodayTip = sEvent
    End With
End Function


et dans ton Excel :

=TodayTip(Maintenant())

du coup, a chaque load de ton xls, ca recalcule.

Sachant que sous Excel

F9

Permet de forcer le recalcul

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

merci
Je n'ai pas encore pu essayer ce nouveau code.
...et pour les actvités d'un mois à l'autre ?
je sais, j'abuse ! si ce n'est pas trop de travail...
Je te souhaite de passer un bon Noël.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
c'est bête comme chou :

ajouter une simple ligne après :
        If LenB(sEvent) = 0 Then
            For nRowIndex = 4 + Day(vdIn) To 34
                If LenB(.Cells(nRowIndex, 7)) Then
                    sEvent = FormatDateTime(DateSerial(Year(vdIn), Month(vdIn), .Cells(nRowIndex, 5)), vbLongDate) & " - " & .Cells(nRowIndex, 7)
                    Exit For
                End If
            Next
        End If


ajouter simplement :
If LenB(sEvent) = 0 Then
    sEvent = TodayTip(DateSerial(Year(vdIn), Month(vdIn)+1,1))      
End If



en gros, si au terme de notre recherche, nous n'avons pas d'event, recommencer la totalité de la recherche, sur le 1er jour du mois suivant.



Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
20
Date d'inscription
dimanche 29 novembre 2009
Statut
Membre
Dernière intervention
29 décembre 2009

merci Renfield
J'ai remplacé =TodayTip(Maintenant()) par =TodayTip(TODAY()) dans la cellule étant donné que ça marchait pas...
le report de la recherche pour le mois suivant ne semble pas fonctionner !
le code c'est bien celui-ci:

Public Function TodayTip(ByVal vdIn As Date) As String
Dim nSheetIndex As Long
Dim sEvent As String
Dim nRowIndex As Long
nSheetIndex = Month(Date) + 5
If nSheetIndex > 13 Then
nSheetIndex = nSheetIndex - 12
End If

With Worksheets(nSheetIndex)
For nRowIndex = 4 To 4 + Day(Date)
If LenB(.Cells(nRowIndex, 6)) Then
If LenB(.Cells(nRowIndex, 7)) Then
sEvent = .Cells(nRowIndex, 7)
End If
Else
sEvent = vbNullString
End If
Next
If LenB(sEvent) = 0 Then
For nRowIndex = 4 + Day(Date) To 34
If LenB(.Cells(nRowIndex, 7)) Then
sEvent = FormatDateTime(DateSerial(Year(Date), Month(Date), .Cells(nRowIndex, 5)), vbLongDate) & " - " & .Cells(nRowIndex, 7)
Exit For
End If
Next
End If
If LenB(sEvent) = 0 Then
sEvent = TodayTip(DateSerial(Year(vdIn), Month(vdIn) + 1, 1))
End If
TodayTip = sEvent
End With
End Function

et bizarrement, certains events ne sont pas affichés avec le jour et la date.

merci de prendre autant de temps pour mes problèmes !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
228
Bonjour,

Je regarde ceci :

If nSheetIndex > 13 Then
nSheetIndex = nSheetIndex - 12
End If


etr comprends bien que ti mois 14 alors mois 2
et vois bien pourquoi cette nécessité
Je ne vois par contre nulle part quoi que ce soit pour "traduire" le mois 13 en mois 1 ...
Tu crois que ton problème viendrait de là, toi ? (moi chépô)
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
228
x = month(date)
nSheetIndex IIf(x 7, 12, (x + 5) Mod 12)


ne te jouera aucun mauvais tour au mois d'août ...

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
cet offset est lié a la presence d'une ou deux feuille avant les mois.

sauf le "As Date" bien sur, mais normallement, toutes les occurrences de Date
sont a remplacer par vdIn


Renfield - Admin CodeS-SourceS - MVP Visual Basic