2013-09-21 2 views
4

Мне нужно отформатировать эти даты в формате yyyy/mm/dd, чтобы запросить базу данных MySQL - глядя на эти два утверждения, вы думаете, что они произведут тот же результат, не так ли?Функция «Формат» функции «VBA» несовместимо -

dateOne = Format(#9/1/2013#, "yyyy/mm/dd") 
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd") 

dateOne теперь равно 2013/09/01, а dateTwo - 9/1/2013. Я сумасшедший? Это происходит в самом begininng моего сценария, я получил Option Explicit, и я знаю, что сохранение в правильных переменных ..

Sub main() 

Dim dateOne, dateTwo As Date 
Dim answer As Integer 
answer = MsgBox("Would you like to generate a Transfer Report?", vbYesNoCancel + vbQuestion) 
If answer <> 6 Then Exit Sub 

'dateOne = InputBox("Input the first (earliest) date in mm/dd/yyyy format") 
'dateTwo = InputBox("Input the second (latest) date in mm/dd/yyyy format") 

dateOne = Format(#9/1/2013#, "yyyy/mm/dd") 

dateTwo = Format(#9/1/2013#, "yyyy/mm/dd") 

Теперь dateOne является 2013/09/01, и dateTwo является 9/1 /2013.

Я изначально имел их в разные сроки, чтобы запросить диапазон - прежде чем ударить головой в мою клавиатуру, чтобы сделать абсолютно уверенным Я выполнял функцию таким же образом на обоих, я скопировал текст в dateOne , наклеил его на строку вниз и изменил переменную до даты. Точная та же команда, выполняемая двумя строками, создавая разные результаты. Сценарий почти завершен, но как, почему, он делает то, что он делает?

Возможно, я могу попросить пользователя ввести его в формате yyyy/mm/dd, но я действительно хочу знать, почему это происходит. Может ли кто-нибудь помочь?

ответ

7

Есть две вещи, которые не так с вашей обычной, которые объединяются, чтобы произвести эти, казалось бы, нелогичные результаты:

Sub main() 

Dim dateOne, dateTwo As Date 
Dim answer As Integer 
. 
. 
. 
dateOne = Format(#9/1/2013#, "yyyy/mm/dd")  
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd") 

во-первых, Format(..) создает Variant строку, но по всей видимости, рассматривая его, как будто это делает a Date.

Во-вторых этой линии: Dim dateOne, dateTwo As Date делает не объявить две переменные Дата, как вы, вероятно, считали, когда вы написали. Скорее, он объявляет dateTwo переменной Date, но объявляет dateOne как Вариант (по умолчанию), потому что вы ничего не сделали. Чтобы сделать их обоих, вам понадобится Dim dateOne As Date, dateTwo As Date.

Итак, что происходит с dateOne, так это то, что Format делает строку так, как вы ее намереваетесь, а затем, поскольку целевая переменная является вариантом, сохраняет ее там как Variant String.

dateTwo работает по-разному, однако, как это первый делает финиковой строку, как вы сказать это («2013/09/01»), но потом видит, что вы говорите это, чтобы назначить String к Date, которые отличаются типы данных, поэтому затем преобразует строку назад в дату, но использует настройки локальной сети вашей локальной системы, чтобы определить, как интерпретировать строку, которая (в вашем случае) приводит к замене чисел месяца и дня.

Очистить?

+0

Спасибо. Я потратил слишком много времени на это. Я изменил их оба на строки, и теперь я могу завершить этот проект. Я искренне ценю это. – Acantud

5

Вы столкнулись с классическим приобретением VBA. Вы объявляете DateOne как Variant и DateTwo как Date.Для того, чтобы исправить, изменить его на:

Dim dateOne As Date, dateTwo As Date 

Чтобы узнать больше, обратитесь к этой Chip Pearson page и прокрутите вниз к разделу «Обратите внимание на переменные, объявленные с One Dim заявление.»

+0

Бах. Я сделал это раньше, я думаю, я не узнаю. Спасибо, тонна, я ценю это. Изменены даты для строк, поэтому они объединяются в оператор sql. – Acantud

Смежные вопросы