Как запретить Excel форматировать даты при копировании в лист из другой книги? - PullRequest
0 голосов
/ 26 февраля 2020

Я записал в свою книгу макрос, который открывает указанный файл .csv и копирует содержимое на новый лист в моей исходной книге. Один из столбцов в .csv содержит даты в неамериканском формате, а Excel считывает некоторые из них как американские и преобразует их (например, 12 февраля 2020 года [не 02/20/2020 неамериканских] читается как 2 De c 2020 [12/02/2020 American].

Большинство дат - после 12-го дня и, следовательно, не могут быть преобразованы в американский формат и считываются как текст. Остальные сохраняются как целое число даты.

Как мне остановить это поведение программно?

Рабочая книга будет использоваться несколькими пользователями на разных машинах, поэтому изменение значений по умолчанию Windows не является решением.

Спасибо!

правки: исходный лист создается другой системой, а файлы архивируются в сетевом расположении с данными столбца B в формате "дд / мм / гггг".

Dim Source_Sheet As Worksheet
Set Source_Sheet = Workbooks("example").Worksheets("example")

Dim Target_Sheet As Worksheet
Set Target_Sheet = Workbooks("example2").Worksheets("example2")

Source_Sheet.Copy After:=Target_Sheet

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

CSV открывается как:

Workbooks.Open ("file")

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Если формат, в котором отображаются данные вашей даты, это «дд / мм / гггг», то будет применяться приведенный ниже код.

Sub Test()
    Dim vR()
    Dim rngDB As Range, rng As Range
    Dim Source_Sheet As Worksheet
    Dim Target_Sheet As Worksheet
    Dim Ws As Worksheet
    Dim r As Long, n As Long
    Dim s As String, vS As Variant

    Set Source_Sheet = Workbooks("example.xlsx").Worksheets("example")
    Set Target_Sheet = Workbooks("example2.xlsx").Worksheets("example2")

    Source_Sheet.Copy After:=Target_Sheet
    Set Ws = Target_Sheet.Next

    With Source_Sheet
        Set rngDB = .Range("b1", .Range("b" & Rows.Count).End(xlUp))
    End With

    r = rngDB.Rows.Count
    ReDim vR(1 To r, 1 To 1)
    For Each rng In rngDB
        n = n + 1
        s = rng.Text
        If InStr(s, "/") Then
            vS = Split(s, "/")
            vR(n, 1) = DateSerial(vS(2), vS(1), vS(0))
        Else
            vR(n, 1) = s
        End If
    Next rng

   With Ws.Range("b1").Resize(r)
        .Value = vR
        .NumberFormat = "mm/dd/yyyy"
   End With
End Sub
0 голосов
/ 26 февраля 2020

Как бы вы ни "импортировали" свои данные, я настоятельно рекомендую немедленно преобразовать ваши строки в значения реальной даты при их импорте (непосредственно перед тем, как записать их в ячейку). В противном случае вы легко можете оказаться в беспорядке.

Например, используйте функцию Split(), чтобы разбить строки по их разделителю / на день, месяц и год, а затем использовать функцию DateSerial(year, month, day)

Dim RealDate As Date
RealDate = DateSerial(2020, 2, 12)

Range("A1").Value = RealDate

, чтобы создать реальное значение даты, которое затем можно отформатировать в любой , который выглядит следующим образом:

Range("A1").NumberFormat = "yyyy-mm-dd"

Эта дата является значением реальной даты и может быть отсортирована и рассчитывается с помощью.

0 голосов
/ 26 февраля 2020

Предполагая, что все значения имеют одинаковый формат, т. Е. dd/mm/yyyy.

. При копировании в excel используйте оператор, равный ="12/02/2020". Это заставит Excel сохранить данные в виде текста без изменения формата даты.

После копирования вы можете преобразовать текст в дату в формате dd/mm/yyyy.

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