Rechercher : dans
Par :

Aceess/VBA : appel de procédures ByRef

Dernière réponse le 1 aoû 2008 à 10:13:21 Towers, le 16 jui 2008 à 15:29:48 
 Signaler ce message aux modérateurs

Bonjour,

J'ai un gros souci avec mon code. Je ne suis pas très fort en VBA mais je ne vois pas ce qui coince.
J'ai deux donctions, l'une appelant l'autre, et ça coince lors de cet appel.

Dans le code que je voue montre, j'obtient le message "Erreur : type incompatible" et le curseur est placé sur la ligne "If (Horaires...", précisémment sur le mot "heureDebut"

Si je met des parenthèses dans l'appel de la fonction Horaires, le MsgBox de la fonction Horaires affiche les bons résultats, c'est à dire "06:00:00 ; 14:00:00" mais le MsgBox de la fonction CalculPrincipal affiche uniquement "Actif : ; 00:00:00", ce qui n'est pas le bon résultat.

J'ai trouvé d'autres utilisateurs qui avaient eu ce probème mais pas la solution. Merci de m'aider et désolé pour l'absence de balises mais elles ne s'affichent pas sur mon écran, je les rajouterai si je les trouve.

Voici un bout de mon code :

Public Function CalculPrincipal(dateTravail As Date) As Double

Dim heureDebut, heureFin As date
Dim equipe As String
Dim numero As Integer

equipe = "A"
numero = 1

If (Horaires ( dateTravail, equipe, numero, heureDebut, heureFin) = True Then

MsgBox "<CalculPrincipal> : Actif : " & heureDebut & " ; " & heureFin
Else

MsgBox "<CalculPrincipal> : Inactif"
End If
End Function



Public Function Horaires(ByVal dateTravail As Date, _
ByVal equipe As String, ByVal numEquipes As Integer, _
ByRef heureDebut As Date, ByRef heureFin As Date) As Boolean

// je récupère heureDebut et heureFin avec une requete SQL qui fonctionne

MsgBox heureDebut & " ; " & heureFin

End Function

Meilleures réponses pour « Aceess/VBA : appel de procédures ByRef » dans :
Mise à jour d'une procèdure ou d'une fonction en VBA VoirMise à jour d'une procédure ou d'une fonction en VBA Souvent la gestion d'un classeur, avec seulement les fonctions standards du tableur, pose des problèmes d'utilisation. Vous songez donc à utiliser Visual Basic pour Applications (VBA) mais...
VBA et les collections d'objets. VoirVBA et les collections d'objets Quand plusieurs (beaucoup de) contrôles sont mis sur une feuille ou un Userform il est parfois fastidieux d'écrire du code dans chaque évènement des contrôles. Ce Tuto vous permet de traiter vos contrôles comme...
VBScript - Les fonctions et les procédures VoirLa notion de procédure On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel dans le corps du programme principal. Cette notion de sous-programme est généralement appelée fonction (ou procédure)...
Le ver Blaster / LovSan VoirPrésentation du ver LovSan Apparu durant l'été 2003, le ver LovSan (connu également sous les noms W32/Lovsan.worm, W32/Lovsan.worm.b, W32.Blaster.Worm, W32/Blaster-B, WORM_MSBLAST.A, MSBLASTER, Win32.Poza, Win32.Posa.Worm, Win32.Poza.B) est le...
Les procédures en assembleur VoirLa notion de procédure En langage assembleur, on appelle procédure un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la procédure. Cette notion de sous-programme est généralement appelée fonction dans d'autres...

1

Towers, le 16 jui 2008 à 15:59:29

C'est ptêtre paske j'étais pas identifié...

En tous cas j'ai trouvé une solution donc je vous dit comment j'ai fait, mais ça me semble tellement moche que si quelqu'un d'autre à une solution à proposer, je veux bien savoir comment il fait.

En gros je n'ai rien changé à ma fonction principale :


Public Function CalculPrincipal(dateTravail As Date) As Double 

Dim heureDebut, heureFin As date 
Dim equipe As String 
Dim numero As Integer 

equipe = "A" 
numero = 1 

If (Horaires ( dateTravail, equipe, numero, heureDebut, heureFin) = True Then 

MsgBox "<CalculPrincipal> : Actif : " & heureDebut & " ; " & heureFin 
Else 

MsgBox "<CalculPrincipal> : Inactif" 
End If 
End Function 


En revanche j'ai modifié la deuxième fonction que j'appelle : je change les paramètres, au lieu d'appeller des Date, j'appelle des Variant et ensuite je les cast en Date.
Ca me semblait si horrible que même avec l'idée en tête, j'ai failli ne pas la tester...


Public Function Horaires(ByVal dateTravail As Date, _ 
ByVal equipe As String, ByVal numEquipes As Integer, _ 
ByRef hDebut As Variant, ByRef hFin As Variant) As Boolean 

Dim heureDebut, heureFin as Date

heureDebut = (hDebut)
heureFin = (hFin)

// je récupère heureDebut et heureFin avec une requete SQL qui fonctionne 

MsgBox heureDebut & " ; " & heureFin 

End Function


Désormais les deux MsgBox affichent les mêmes valeurs donc ça c'est cool.

Je ne met pas le tag résolu encore paskil me semble qu'une solution sans les variant serait mieux et doit être possible.

Répondre à Towers

2

 Towers, le 1 aoû 2008 à 10:13:21
  • +1

En fait j'ai découvert quelque chose :

si j'ai deux procédures

Public Sub Test1()
Dim str1 As String
Dim str2 As String
Ecrire str1
Ecrire str2
MsgBox str1 & " ; " & str2
End Sub

Public Sub Test2()
Dim str1, str2 As String
Ecrire str1
Ecrire str2
MsgBox str1 & " ; " str2
End Sub

Public Sub Ecrire(ByRef str As String)
str = "Ca marche"
End Sub

Alors Test1 va réussir mais pas Test2 (elle ne va pas compiler), simplement parce que j'aurais déclaré str1 et str2 sur la même ligne !!
C'est un bug de VBA ?

Répondre à Towers
Collection CommentÇaMarche.net