Excel, VBA и даты - PullRequest
       17

Excel, VBA и даты

1 голос
/ 23 марта 2011

Все, что я пытаюсь сделать, это взять дату, добавить ее к дате, вставить ее в лист и позволить листу запустить формулы на введенную дату. Все ячейки отформатированы как английские даты, но когда я присваиваю значение ячейки с помощью приведенного ниже кода, она думает, что указанная дата в американском формате, хотя она уже в английском формате, и поэтому пытается преобразовать ее в английский формат. Как я могу помешать этому думать по-американски?

Я отказался от всех функций VBA и создал функцию добавления одной к дате, потому что VBA просто доставляла мне головную боль.

Dim D, M, Y As String
    Dim S1, S2, NewDay, NewMonth, NewYear As Integer
    S1 = InStr(1, StartDate.Value, "/")
    S2 = InStr(S1 + 1, StartDate.Value, "/")
    Debug.Print (CStr(S1) + " " + CStr(S2))
    D = Mid(StartDate.Value, 1, S1 - 1)
    M = Mid(StartDate.Value, S1 + 1, S2 - S1 - 1)
    Y = Mid(StartDate.Value, S2 + 1)
    Debug.Print (D + " " + M + " " + Y)

    NewDay = CInt(D) + 1
    NewMonth = CInt(M)
    NewYear = CInt(Y)
    If NewDay > DaysInMonth(M, Y) Then
        NewDay = 1
        NewMonth = NewMonth + 1
        If NewMonth > 12 Then
            NewMonth = 1
            NewYear = NewYear + 1
        End If
    End If

    StartDate.Value = CStr(NewDay) + "/" + CStr(NewMonth) + "/" + CStr(NewYear)

тогда в другой функции я просто устанавливаю значение ячейки примерно так:

With sheet.Range("A2")
'.. Stuff    
.Offset(i, 1) = StartDate.Value

Ответы [ 4 ]

2 голосов
/ 23 марта 2011

VBA ожидает, что все даты будут по-американски: мм / дд / гг.
Я просто использую константу для правильного формата: kUsFmt = "#mm\/dd\/yyyy#"
Тогда везде, где мне нужна дата, я использую функцию форматирования с kUsFmt:

strSql = "...WHERE myDate = " & Format (Date,kUsFmt)

редактирование:

А почему вы разделяете вещи в M d y в своем коде? Добавить 1 к дате так же просто, как
myDate = myDate + 1!

1 голос
/ 24 марта 2011
Function AddDay(StartDate As Date) As Date
    AddDay = StartDate + 1
End Function

Возможно, я не понимаю вашу проблему, но если вы относитесь к вашей дате как Тип даты , Excel сделает это за вас.Вам не нужно думать о конце месяца или конце года.

Как это будет выглядеть в вашей ячейке Excel, это другая часть.это чистое форматирование.Либо вы форматируете ячейку напрямую (щелкните правой кнопкой мыши -> отформатировать ячейку -> выберите «Дата» и выберите свой формат), либо в VBA вы должны указать Объект ячейки , какой формат отображать.

Пожалуйста, не делайте этого своими собственными манипулирующими строками, это все равно что заново изобретать колесо.

Здесь можно многое узнать о датах в Excel cpearson.com / Excel / DateFunctions и вообще в Excel.

Обновление: Эта - лучшая ссылка, моя первая - в формулах даты внутри ячеек.

1 голос
/ 23 марта 2011

Я думаю, что проблема заключается в манипулировании в виде строки.Почему бы не попробовать что-то вроде этого:

StartDate.Value = Format (DateSerial (NewYear, NewMonth, NewDay), "дд / мм / гггг")

0 голосов
/ 24 марта 2011

Я знаю, что использование дат может быть чрезвычайно плодотворным, но, пожалуйста, не пишите еще одну процедуру преобразования / добавления / форматирования даты, вы будущие сопровождающие вас не поблагодарите.

О единственном универсальном формате является гггг-мм-дд, который будет правильно читаться практически всеми функциями даты.Попробуйте писать в этом формате и читать в стандартном британском формате даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...