Excel 2010: VBA Run-Time Error "51" (Date)
Le
christophe.joly

Bonjour:
J'ai une macro ci-dessous qui génère une liste de créneaux horaires e=
n fonction de dates et d'heures de début et de fin et d'une incrémentat=
ion horaire.
Cette macro fonctionne parfaitement avec Excel 2003 et 2007 mais avec Excel=
2010 j'obtiens a VBA runtime error "51" en
nParJour = 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 = CDate(InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7=
/27/10"))
Jr2 = CDate(InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "", "7/=
29/10"))
Hh1 = CDate(InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM"))
Hh2 = CDate(InputBox("Ending Time e.g. 5:30 PM", "", "5:30 PM"))
Pas = CDate(InputBox("Increment e.g. 00:30 for a 30 minutes interval"=
, "", "00:30"))
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + _
0.000001)) + 1
nIntervalles = (1 + Jr2 - Jr1) * nParJour
S = "TRANSPOSE(MOD(ROW(1:" & nIntervalles & ")-1," & _
nParJour & "))*" & CDbl(Pas) & _
"+TRANSPOSE(INT((ROW(1:" & nIntervalles & _
")-1)/" & CDbl(nParJour) & "))+" & CDbl(Jr1 + Hh1)
V = Evaluate(S)
=
Remerciements,
Christophe
J'ai une macro ci-dessous qui génère une liste de créneaux horaires e=
n fonction de dates et d'heures de début et de fin et d'une incrémentat=
ion horaire.
Cette macro fonctionne parfaitement avec Excel 2003 et 2007 mais avec Excel=
2010 j'obtiens a VBA runtime error "51" en
nParJour = 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 = CDate(InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7=
/27/10"))
Jr2 = CDate(InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "", "7/=
29/10"))
Hh1 = CDate(InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM"))
Hh2 = CDate(InputBox("Ending Time e.g. 5:30 PM", "", "5:30 PM"))
Pas = CDate(InputBox("Increment e.g. 00:30 for a 30 minutes interval"=
, "", "00:30"))
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + _
0.000001)) + 1
nIntervalles = (1 + Jr2 - Jr1) * nParJour
S = "TRANSPOSE(MOD(ROW(1:" & nIntervalles & ")-1," & _
nParJour & "))*" & CDbl(Pas) & _
"+TRANSPOSE(INT((ROW(1:" & nIntervalles & _
")-1)/" & CDbl(nParJour) & "))+" & CDbl(Jr1 + Hh1)
V = Evaluate(S)
=
Remerciements,
Christophe
Sans les données, on ne peut pas vooir grand-chose. Donne les valeurs
de toutes les variables de la ligne en erreur.
Cordialement.
Daniel
Ci-dessous la macro plus complète. Elle fonctionne sur Excel 2003 et 2007 mais bug sur Excel 2010.
Remerciements,
Christophe
Sub DATEandTIME()
If MsgBox(Prompt:="You are going to Reset the Dates & Times of you r scheduling project", Buttons:=vbYesNo + vbQuestion, _
Title:="Change Dates & Times") = vbNo Then
Exit Sub
End If
' Daniel M.
Sheets("DateTime").Select
Range("B2:B65536").Select
Selection.ClearContents
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 = CDate(InputBox("Starting Date as mm/dd/yy e.g. 7/27/10", "", "7 /27/10"))
Jr2 = CDate(InputBox("Ending Date as mm/dd/yy e.g. 7/29/10", "", "7/ 29/10"))
Hh1 = CDate(InputBox("Starting Time e.g. 10:00 AM", "", "10:00 AM"))
Hh2 = CDate(InputBox("Ending Time e.g. 5:30 PM", "", "5:30 PM"))
Pas = CDate(InputBox("Increment e.g. 00:30 for a 30 minutes interval" , "", "00:30"))
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
nIntervalles = (1 + Jr2 - Jr1) * nParJour
S = "TRANSPOSE(MOD(ROW(1:" & nIntervalles & ")-1," & _
nParJour & "))*" & CDbl(Pas) & _
"+TRANSPOSE(INT((ROW(1:" & nIntervalles & _
")-1)/" & CDbl(nParJour) & "))+" & CDbl(Jr1 + Hh1)
V = Evaluate(S)
Sheets("Country Appointments").Select
Sheets("Country Appointments").Range("B2").Resize(nIntervalles) = App lication.Transpose(V)
Range("B1").End(xlDown).Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "NO TIME SET (Int'l visitor request) (01)"
ActiveCell.Offset(1, 0).Select
End Sub
cause dans la ligne en erreur.
Daniel
Je ne sais pas répondre à cette question.
La seule chose que je puisse dire c'est que c'est la ligne
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
qui est surlignée en jaune lorsque j'utilise le debogger.
Merci.
Christophe
Définition d'une erreur de type 51 : "erreur interne"
pas très significative comme message!
| nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
Scinde cette ligne de code en section :
Stop
x = Hh2 - Hh1
y = IIf(Hh2 < Hh1, 1, 0)
z = Pas + 0.000001
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
Passe la commande STOP juste avant ces 3 lignes de code, de sorte que tu
pourras les exécuter pas à pas en utilisant la touche F8. Cela devrait te
permettre d'identifier la section qui pose problème et les valeurs associées
aux variables lorsque l'erreur est générée.
MichD
---------------------------------------------------------------
En fait, lorsque j'execute les ligne pas à pas, il n'y pas d'erreur jussq u'à ce que j'arrive sur nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
ou j'obtiens une erreur de type 51.
Sinon, en fin de macro par 2 fois, remplacer Sheets("DateTime") en lieu et place de Sheets("Country Appointments") mais ce n'est pas ce qui provoque l 'erreur ci-dessus.
Sur un forum microsoft US j'ai trouvé une erreur comparable avec access 2 010 pour des dates mais peut-être cela n'a strictement rien à voir.
http://answers.microsoft.com/en-us/office/forum/office_2010-access/access-2 010-variant-date-division-runtime-error-51/b0d94022-bd80-42a8-8093-b062b072 1025
Merci.
Christophe
la suggestion que je t'ai faite?
MichD
---------------------------------------------------------------
Désolé mais, sauf erreur de ma part, je croyais avoir appliqué ta sug gestion i.e.
Scindé la ligne de code comme suit:
Stop
x = Hh2 - Hh1
y = IIf(Hh2 < Hh1, 1, 0)
z = Pas + 0.000001
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
Comme indiqué dans mon post précédent, l'exécution du code pas à pas à l'aide de F8, ne révèle pas d'erreur en x = Hh2 - Hh1, ni en y = IIf(Hh2 < Hh1, 1, 0) et ni en z = Pas + 0.000001.
Ai-je manqué quelque chose?
Remerceiements,
Christophe
| pas d'erreur en
| x = Hh2 - Hh1
| ni en y = IIf(Hh2 < Hh1, 1, 0)
| et ni en z = Pas + 0.000001
Tu nous ne donnes pas la valeur des variables X, Y et Z...
As-tu tenté de simplement réécrire la ligne de code sans
utiliser le copier-coller simplement pour t’assurer qu'il
n'y a pas un parasite quelconque sur cette ligne de code
et d'effacer complètement la ligne originale.
nParJour = Int(((Hh2 - Hh1 + IIf(Hh2 < Hh1, 1, 0)) / Pas + 0.000001)) + 1
MichD
---------------------------------------------------------------
ReBonjour:
J'ai réécrit la ligne de code mais cela ne change rien.
je ne suis pas certain de comprendre ce que tu veux que je fasse.
J'ai scindé le code en 3 lignes comme indiqué.
Lorsque je lance la Macro elle s'arrête en Mode Break sur Stop, puis lors que j'utilise la touche F8, la macro s'arrête à nouveau sur chacune des lignes de code x, y et z sans provoquer de message d'erreur. Ceci dit je n e sais pas ou trouver la valeur des variables X, Y et Z.
Remerciements,
Christophe