Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2011, 14h47   #1
Invité régulier
 
Inscription : juin 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 57
Points : 8
Points : 8
Par défaut Gestion des bibliothèques date

Bonjour à tous,

Je developpe une macro destinée à tourné sur un parck hétérogène.
la plus vieille version d'excel étant 2003 (à ma connaissance).

Je calcul une date de livraison avec les fonctions suivantes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
Function CalculDateLivraison()
    Dim DateDuJour As Date
 
    Dim DateFinale As Date
    Dim joursFeries(11) As Long
 
    DateDuJour = Format(Date, "dd/mm/yyyy")
 
 
  'tableau des jours fériés
  anneeDate = Year(DateDuJour)
  joursFeries(1) = DateSerial(anneeDate, 1, 1)
  joursFeries(2) = DateSerial(anneeDate, 5, 1)
  joursFeries(3) = DateSerial(anneeDate, 5, 8)
  joursFeries(4) = DateSerial(anneeDate, 7, 14)
  joursFeries(5) = DateSerial(anneeDate, 8, 15)
  joursFeries(6) = DateSerial(anneeDate, 11, 1)
  joursFeries(7) = DateSerial(anneeDate, 11, 11)
  joursFeries(8) = DateSerial(anneeDate, 12, 25)
  joursFeries(9) = fLundiPaques(anneeDate)
  joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
  joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
 
'Ajout des 5 jours ouvrés en excluant les fériés
DateFinale = Format(WorksheetFunction.WorkDay(DateDuJour, 5, joursFeries), "dd/mm/yyyy")
 
'renvoie du résultat calcul
CalculDateLivraison = DateFinale
 
End Function
Private Function fLundiPaques(ByVal Iyear As Integer) As Date
        'Adapté de +ieurs scripts...
        Dim L(6) As Long, Lj As Long, Lm As Long
 
        L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
        L(4) = (19 * L(1) + 24) Mod 30
        L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
        L(6) = 22 + L(4) + L(5)
 
        If L(6) > 31 Then
                Lj = L(6) - 31
                Lm = 4
        Else
                Lj = L(6)
                Lm = 3
        End If
 
        ' Lundi de Pâques = Paques + 1 jour
        fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
 
End Function
Sur ma machine tout se passe bien (je suis en Excel 2007).
Sur la machine de mon collègue (excel 2007 aussi), il me manque une bibliothèque.

Je n'ai pas activé de bibliothèque supplémentaire (sauf outlook) sur ma machine.

Je ne comprends donc pas quel bibliothèque manque sur la machine de mon collègue qui bloque l'execution de la macro.

Avez vous une idée?

si oui, comment m'assurer que cette bibliothèque sera chargée sur tous les PC qui exécuteront la macro?

Merci d'avance pour votre aide.
DaD
DaD92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h01   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je suppose que c'est le workday.
Mais déjà une remarque : je ne comprends pas pourquoi tu utilises la fonction Format alors que tu stockes le résultat dans une date et non un string
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h05   #3
Invité régulier
 
Inscription : juin 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 57
Points : 8
Points : 8
je suis un peu nub, alors j'ai mis Format pour être sur que la doit soit en dd/mm/yyyy... c'est inutile?

La fonction worday viens de quel bibliothèque? comment puis vérifier par le code si elle est activée ou non et si c'est non, l'activer?
DaD92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h27   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Oui, c'est inutile, car tant que ça reste une date, il n'y a pas de format défini. Une date est juste un jour, un mois, une année, une heure...
Tu utilises Format quand tu veux l'afficher et donc le transformer en chaine de caractère.

Pour workday, je ne suis pas sûr, je pensais que c'était par défaut, mais à part ça je ne vois pas. Je vais regarder.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h35   #5
Invité régulier
 
Inscription : juin 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 57
Points : 8
Points : 8
ok, je comprends... je vais donc retirer ça....

Apparement le workday est bien dans une bibiothèque spécifique le "Analysis ToolPak".
Ce qui est bizarre, c'est que je ne l'ai pas ajouter et que ça fonctionne sur mon PC...???...

Sinon, j'ai trouvé comment on ajoute une bibliothèque sur le PC executant la macro

Code :
1
2
3
4
 
Dim x As String
x = "C:\Program Files\Microsoft Office\Office10\MSWORD.OLB"
ThisWorkbook.VBProject.References.addFromFile x
Mais :
1/ je ne connais pas le nom du fichier à importer
2/ je suppose que ce fichier est dans un endroit différent suivant la version de l'OS hote (programme files ou programme files X64 par ex) et suivant la version d'excel....
DaD92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h39   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
L'analysis toolpak est une macro complémentaire, je ne suis pas sûr qu'on puisse l'ajouter comme une référence. En effet, worksheetfunction fait appel aux fonctions excel.

Pardon, ce qu'il faut ajouter en référence est ATPVBAEN.XLA sous 2003, sous 2007 je laisse des utilisateurs répondre.
Pour info, chez moi elle est dans
C:\Program Files\Microsoft Office\OFFICE11\Bibliothèque\Analyse
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 16h34   #7
Invité régulier
 
Inscription : juin 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 57
Points : 8
Points : 8
je connais pas la différence...pffff je suis vraiment un nub... pour ma défense, je dois développer des trucs, mais je suis pas develloppeur

Est ce que je peux copier coller cette macro complémentaire dans un module pour l'avoir a dispo dans mon fichier?

tu as répondu plus vite que moi

ok.. donc c'est bon pour 2003, reste à trouver le reste
Comment est ce que je peux connaitre la version d'excel en vba?

bon, j'avance :
Code :
1
2
 
MsgBox "Welcome to Microsoft Excel version " & Application.version & " running on " & Application.OperatingSystem & " !"
8.0 = Office 97
9.0 = Office 2000
10.0 = Office XP
11.0 = Office 2003
12.0 = 2003

Est ce possible de copier cette librairie dans un module? ça serait quand même plus simple.... je ne trouve pas ce fichier sur ma machine
DaD92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 18h31   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je t'ai fait un petit code qui fait la même chose. Par contre, il n'est pas optimisé. S'il y a beaucoup de données à traiter, je pense qu'il faudra faire autrement.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Option Explicit
 
Public Sub test()
 
    Dim DateDuJour As Date
    Dim anneeDate As Integer
    Dim DateFinale As Date
    Dim joursFeries(7) As Date
 
    DateDuJour = Date
 
    anneeDate = Year(DateDuJour)
 
    joursFeries(0) = DateSerial(anneeDate, 1, 1)
    joursFeries(1) = DateSerial(anneeDate, 5, 1)
    joursFeries(2) = DateSerial(anneeDate, 5, 8)
    joursFeries(3) = DateSerial(anneeDate, 7, 14)
    joursFeries(4) = DateSerial(anneeDate, 8, 15)
    joursFeries(5) = DateSerial(anneeDate, 11, 1)
    joursFeries(6) = DateSerial(anneeDate, 11, 11)
    joursFeries(7) = DateSerial(anneeDate, 12, 25)
    'joursFeries(9) = fLundiPaques(anneeDate)
'    joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
'    joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
 
    DateFinale = AjouterJoursOuvres(DateDuJour, 5, joursFeries)
 
    MsgBox Format(DateFinale, "dd/mm/yyyy")
 
End Sub
 
Public Function AjouterJoursOuvres(ByVal dt As Date, ByVal nJours As Integer _
        , ByRef joursFeries() As Date) As Date
 
    Dim iJour As Integer
    Dim iJourOuvre As Integer
    Dim tmpDt As Date
 
    iJour = 0
    iJourOuvre = 0
 
    While iJourOuvre <= nJours
        iJour = iJour + 1
        tmpDt = DateAdd("d", iJour, dt)
 
        If estJourOuvre(tmpDt, joursFeries) Then iJourOuvre = iJourOuvre + 1
    Wend
 
    AjouterJoursOuvres = DateAdd("d", iJour, dt)
 
End Function
 
Private Function estJourOuvre(ByVal dt As Date, ByRef joursFeries() As Date) As Boolean
 
    Dim ok As Boolean
    Dim i As Integer
 
    ok = True
 
    If Weekday(dt) = vbSaturday Or Weekday(dt) = vbSunday Then
        ok = False
    End If
 
    For i = 0 To UBound(joursFeries)
        If joursFeries(i) = dt Then ok = False
    Next i
 
    estJourOuvre = ok
 
End Function
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 12h20   #9
Invité régulier
 
Inscription : juin 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 57
Points : 8
Points : 8
Super, Merci ZebreLoup!

ça a l'air de marcher Nickel.
Merci beaucoups
DaD92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h28.


 
 
 
 
Partenaires

Hébergement Web