Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Excel 2010: VBA Run-Time Error "51" (Date)

23 réponses
Avatar
christophe.joly
Bonjour:

J'ai une macro ci-dessous qui g=E9n=E8re une liste de cr=E9neaux horaires e=
n fonction de dates et d'heures de d=E9but et de fin et d'une incr=E9mentat=
ion horaire.

Cette macro fonctionne parfaitement avec Excel 2003 et 2007 mais avec Excel=
2010 j'obtiens a VBA runtime error "51" en=20
nParJour =3D Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + _
0.000001)) + 1


---------------------------------------------------------------------------=
------------
Dim Jr1 As Date, Jr2 As Date, Hh1 As Date, Hh2 As Date, Pas As Date
Dim V As Variant, S As String
Dim nParJour As Integer, nIntervalles As Integer

Jr1 =3D CDate(InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7=
/27/10"))
Jr2 =3D CDate(InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "", "7/=
29/10"))
Hh1 =3D CDate(InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM"))
Hh2 =3D CDate(InputBox("Ending Time e.g. 5:30 PM", "", "5:30 PM"))
Pas =3D CDate(InputBox("Increment e.g. 00:30 for a 30 minutes interval"=
, "", "00:30"))

nParJour =3D Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + _
0.000001)) + 1
nIntervalles =3D (1 + Jr2 - Jr1) * nParJour

S =3D "TRANSPOSE(MOD(ROW(1:" & nIntervalles & ")-1," & _
nParJour & "))*" & CDbl(Pas) & _
"+TRANSPOSE(INT((ROW(1:" & nIntervalles & _
")-1)/" & CDbl(nParJour) & "))+" & CDbl(Jr1 + Hh1)

V =3D Evaluate(S)
---------------------------------------------------------------------------=
------------

Remerciements,

Christophe

10 réponses

1 2 3
Avatar
MichD
| Ceci dit je ne sais pas ou trouver la valeur des variables X, Y et Z.

Au moins 2 façons de faire :
A ) après avoir exécuté la ligne de code en pas en pas,
si tu passes la souris au-dessus de la variable x, y ou z
tu auras en surimpression leur contenu.

B ) Tu peux afficher dans la fenêtre "Exécution" la valeur des
variables que tu désires.
Pour ouvrir cette fenêtre : Raccourci clavier : Ctrl + G
ou par la commande du menu : Fenêtre Exécution dans le menu Affichage

Dans la macro, immédiatement après l'exécution d'une ligne de code,
pour afficher dans cette fenêtre la valeur de cette variable, tu écris :
x = Hh2 - Hh1
Print.Debug "Valeur de la variable x :" & X

L'avantage de cette approche te permet de suivre l'évolution d'une
variable
tout au long d'une procédure. Ceci peut être utilisé sans employer la
technique
du pas-à-pas. Si tu le désires, tu peux laisser ces lignes de code
"Debug.Print..."
Dans ton code même après tes tests. Cela n'altère pas le déroulement de
la
procédure.


MichD
---------------------------------------------------------------
Avatar
christophe.joly
Bonjour:

Merci pour tes indications.
F8
X= Empty
Y= Empty
Z= Empty

F8
X= 0.3125
Y= Empty
Z= Empty

F8
X= 0.3125
Y= 0
Z= Empty

Je ne sais pas si c'est utile mais j'obtiens excatement les mêmes résul tats avec Excel 2007 pour lequel la macro marche parfaitement. Le bug n'est que pour Excel 2010.

Cordialement,

Christophe
Avatar
isabelle
bonjour Christophe,

x = Hh2 - Hh1
y = IIf(Hh2 < Hh1, 1, 0)
z = Pas + 0.000001
a = (x + y)

nParJour = Int(a / z) + 1

isabelle

Le 2013-04-04 09:46, a écrit :
Bonjour:

Merci pour tes indications.
F8
X= Empty
Y= Empty
Z= Empty

F8
X= 0.3125
Y= Empty
Z= Empty

F8
X= 0.3125
Y= 0
Z= Empty

Je ne sais pas si c'est utile mais j'obtiens excatement les mêmes résultats avec



Excel 2007 pour lequel la macro marche parfaitement. Le bug n'est que
pour Excel 2010.

Cordialement,

Christophe

Avatar
christophe.joly
Bonjour Isabelle et merci.

Maintenant j'obtiens un run-time error "1004" un peu plus bas en
Range("B1").End(xlDown).Offset(1, 0).Select

Une nouvelle fois ces erreurs n'ont pas lieu avec Excel 2007 mais uniquement avec Excel 2010.

Remerciements,

Christophe
Avatar
MichD
Bonjour,

Dans la fenêtre de l'éditeur de code (macro)
À partir de la barre des menus / outils / références /
est-ce qu'il y a un élément coché avec la mention "Manquante" ?
Si c'est le cas, décoche-le.


MichD
---------------------------------------------------------------
Avatar
christophe.joly
Bonjour:

Les references cochées dans Excel 2010 sont les suivantes:
1- Visual basic For Applications
2- Microsoft Excel 14.0 Object Library
3- Ole Automation
4- Micriosoft Office 14.0 Object Library
5- Microsoft Forms 2.0 Object Library

Je ne vois pas d'élément coché avec la mention "Manquante" ou son é quivalent en anaglais.

Si je compare à Excel 2007, les 4 premières y sont, si ce n'est en 12.0 au lieu de 14.
Seule Microsoft Forms 2.00 Object Library n'est pas cochée.

Je n'arrive pas à la décocher acr obtiens message d'erreur suivant: "Ca n't remmove control or reference in use"

Merci.

Christophe
Avatar
MichD
Est-ce possible de publier ton classeur en utilisant
l'adresse suivante : Cjoint.Com . L'adresse que tu
obtiendras, tu nous la retournes ici.

Fais disparaître toutes les informations sensibles
avant la publication de ce dernier.

MichD
---------------------------------------------------------------
Avatar
christophe.joly
Voilà. http://cjoint.com/?0DfqOiBHwGd

Et merci à tous pour votre aide.

Christophe


On Friday, April 5, 2013 3:16:44 PM UTC+2, MichD wrote:
Est-ce possible de publier ton classeur en utilisant l'adresse suivante : Cjoint.Com . L'adresse que tu obtiendras, tu nous la retournes ici. Fais d isparaître toutes les informations sensibles avant la publication de ce d ernier. MichD ------------------------------------------------------------- --
Avatar
MichD
Bonjour,

Pour cette ligne de code :
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1

Modifie là de cette manière :
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / CDbl(Pas) + 0.000001))
+ 1

J'ai seulement le CDBL() à la valeur PAS
Pour une raison que j'ignore, il n'arrive pas à faire la division!
Ce semble être un bogue!!!

Pour cette section où tu définis tes variables avec ceci :
Jr2 = CDate(InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "",
"7/29/10"))

Si l'usager entre autres choses qu'une date ou qu'il clique sur "Annuler"
cela va générer une erreur à cause de la fonction "Cdate()"

Je te propose plutôt d'adapter quelque chose du genre!

N.B. As-tu pensé utilisé un formulaire avec un contrôle "DATEPICKER"
L'usager peut toujours entrer un format de date autre et
comme la procédure ne fait aucune vérification, le résultat
pourrait être erratique si le format demandé n'est pas suivi
par l'usager...

ET pour la ligne de code :
Range("B1").End(xlDown).Offset(1, 0).Select

Je la remplacerais par :
Range("B" & Range("B" & Rows.Count).End(xlUp)(2).Row).Select


'-------------------------------------------------
Do
Jr1 = InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7/27/10")
If Jr1 = "" Then
MsgBox "Opération annulée"
Exit Sub
End If
Loop Until IsDate(Jr1)
Jr1 = CDate(Jr1)

Do
Jr2 = InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "", "7/29/10")
If Jr2 = "" Then
MsgBox "Opération annulée"
Exit Sub
End If
Loop Until IsDate(Jr2)
Jr2 = CDate(Jr2)

Do
Hh1 = InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM")
If Hh1 = "" Then
MsgBox "Opération annulée"
Exit Sub
End If
Loop Until IsDate(Hh1)
Hh1 = CDate(Hh1)

Do
Hh2 = InputBox("Ending Time e.g. 5:30 PM", "", "5:30 PM")
If Hh2 = "" Then
MsgBox "Opération annulée"
Exit Sub
End If
Loop Until IsDate(Hh2)
Hh2 = CDate(Hh2)

Do
Pas = InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM")
If Pas = "" Then
MsgBox "Opération annulée"
Exit Sub
End If
Loop Until IsDate(Pas)
Pas = CDate(Pas)
'-------------------------------------------------

MichD
---------------------------------------------------------------
Avatar
MichD
J'ai omis de dire que si tu adoptes l'approche proposée
par les lignes suivantes,
InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7/27/10")

Tu dois définir les 5 variables Jr1 Jr2 Hh1 Hh2 et Pas "As Variant"
et non pas "As Date"

MichD
---------------------------------------------------------------
1 2 3