Comment extraire quelques lignes d'un fichier Excel automatiquement ?

Résolu
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 - 22 déc. 2009 à 09:37
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 - 29 déc. 2009 à 14:44
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 déc. 2009 à 14:34
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
3
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
24 déc. 2009 à 02:07
merci Renfield,
ça fonctionne parfaitement !
bonnes fêtes.
1
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 10:07
qu'entends tu par extraire ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
22 déc. 2009 à 10:16
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....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 10:19
ok.

a quoi ressemble ce fichier ? une ligne par jour ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
22 déc. 2009 à 10:39
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 10:42
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
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
22 déc. 2009 à 11:14
je l'ai mis sur ci-joint:
http://www.cijoint.fr/cjlink.php?file=cj200912/cijxkIjrzV.xlsx
( Planning des activités1.xls.xlsx )
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 12:24
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 12:25
NB: si le prochain event est le mois prochain, j'ai rien codé en ce sens...


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
22 déc. 2009 à 13:42
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é
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 13:56
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
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
22 déc. 2009 à 22:02
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 22:38
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
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
23 déc. 2009 à 14:54
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 déc. 2009 à 15:23
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
0
aecj Messages postés 20 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 décembre 2009 1
23 déc. 2009 à 18:05
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 !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 déc. 2009 à 19:51
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 déc. 2009 à 20:08
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 déc. 2009 à 20:51
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
0
Rejoignez-nous