VBA, вопрос форматирования даты - PullRequest
0 голосов
/ 04 октября 2018

У меня есть код, который

1) сравнивает даты от Col X до Col Y.

2) вставляет даты в Col Y, если между столбцами нет совпадений.

Столбец X мой формат выглядит как

08/15/2013
09/12/2013
10/03/2013

Но когда он вставляется в столбец Y, он идет,

15/08/2013
12/09/2013
03/10/2013

Как я могу отформатировать мою вставку, чтобы перейти к дд/mm/yyyy.

Добавлен дополнительный код для отображения массива:

   ReDim PasteArr(1 To 1, 1 To 6)
    subcount = 1

    For Cell1 = 1 To UBound(DataArr(), 1)
        For Each Cell2 In BusDates()
            If DataArr(Cell1, 1) Like Cell2 Then
                Matched = True
                Exit For                                      'if it matches it will exit
            ElseIf Cell2 Like BusDates(UBound(BusDates), 1) Then 'if it gets to the end, it's truly unique and needs to be added

                For index = 1 To 6
                    PasteArr(subcount, index) = DataArr(Cell1, index)
                Next index

                subcount = subcount + 1

                PasteArr = Application.Transpose(PasteArr)
                ReDim Preserve PasteArr(1 To 6, 1 To subcount)
                PasteArr = Application.Transpose(PasteArr)

                Matched = False

            End If
        Next Cell2

        If Matched = False Then
            BusDates = Application.Transpose(BusDates)
            ReDim Preserve BusDates(1 To UBound(BusDates) + 1)
            BusDates = Application.Transpose(BusDates)
            BusDates(UBound(BusDates), 1) = DataArr(Cell1, 1)
        End If

    Next Cell1
    Worksheets("stacks").Range("M" & LastRow + 1 & ":" & Cells(LastRow + UBound(PasteArr, 1) - 1, 18).Address).Value = PasteArr

Что я пробовал: Изменение формата ячеек

enter image description here

15/08/2013
12/09/2013
03/10/2013

, который теперь является правильным форматом для столбца X.

Но это вставка в столбец Y как:

enter image description here

, что

15/08/2013 - correct
09/12/2013 - incorrect
10/03/2013 - incorrect.

Ответы [ 5 ]

0 голосов
/ 16 октября 2018

Хитрость заключается в назначении значений из столбца X столбцу Y, используя затем свойство Range.value.Это обеспечит передачу данных в том же формате, в котором они существуют в столбце X (будь то дата, число, строка и т. Д.).Если вы установите одинаковое отображение в двух столбцах, то вы увидите одно и то же в обоих столбцах.

Я считаю ваш код запутанным, поэтому я переписал логику для поиска в первом столбце «X» и размещения уникальных вхождений во втором столбце.'Y'

Public Sub findOrAdd()
    Const COLUMN_SOURCE = "B"
    Const COLUMN_DEST = "D"
    Const ROW_STARTDATA = 2

    Dim x As Long, y As Long
    Dim foundMatch As Boolean

    Dim sht As Worksheet
    Set sht = Sheet1

    x = ROW_STARTDATA
    Do Until sht.Range(COLUMN_SOURCE & x).Value = "" 'X -variable loop walks through all cells in source column
        Debug.Print "Doing row " & x & " =" & sht.Range(COLUMN_SOURCE & x).Value
        foundMatch = False
        'search for value of current cell in destcells
        y = ROW_STARTDATA
        Do Until sht.Range(COLUMN_DEST & y).Value = "" 'Y -variable loop walks through all cells in dest column - checking if it exists
            If sht.Range(COLUMN_SOURCE & x).Value = sht.Range(COLUMN_DEST & y).Value Then
                'match found stop searching and do nothing
                foundMatch = True
                Exit Do
            End If
            y = y + 1
        Loop

        If foundMatch = False Then
            'Y loop completed and match was not found.
            'Append content as end of destination cells
            sht.Range(COLUMN_DEST & y).Value = sht.Range(COLUMN_SOURCE & x).Value

            '** NOTE value is added by assigned cell.value, which is not pasting.
            '** If the formats of the source and destination address are done the same then they will display the same thing in excel
        End If
        x = x + 1
    Loop
End Sub

Примечание: пустые строки приведут к выходу циклов

0 голосов
/ 10 октября 2018

Я живу в Португалии, и иногда у меня возникают проблемы такого же характера, касающиеся параметров форматирования даты.Обычно то, что я делаю (и обычно это работает), использует и злоупотребляет функцией DateSerial.Например, если бы я хотел заполнить ваш массив PasteArr, я бы сделал:

PasteArr(subcount, index) = DateSerial(Year(DataArr(Cell1, index)), Month(DataArr(Cell1, index)), Day(DataArr(Cell1, index)))

Чтобы записать дату в ячейку, я делаю следующее:

Worksheets("stacks").cells("M" & LastRow + 1).formulaR1C1 = DateSerial(Year(PasteArr(subcount, index)), Month(PasteArr(subcount, index)), Day(PasteArr(subcount, index)))

Честность предыдущегопроцедура кажется немного глупой.Действительно, это так!Однако это решает проблему с форматированием даты dd/mm/yyyy против mm/dd/yyyy.Если вы спросите меня, почему, я не знаю точно, как это работает!Но это работает каждый раз!

0 голосов
/ 09 октября 2018

Используйте dd/MM/yyyy в качестве формата ячейки.Нижний регистр m обозначает минуты, верхний регистр M - месяцы.

0 голосов
/ 10 октября 2018

За мой комментарий выше, если вы используете массивы, а не копируете диапазоны / ячейки напрямую.Если ваши массивы объявлены как строковые массивы, вы получите проблему транспонированных дней / месяцев.Например:

enter image description here

Может ли это быть проблемой?

0 голосов
/ 09 октября 2018

Проверьте формат своей ячейки.Должно быть:

Number
  Custom
    dd/mm/yyyy (depending on your locale, in my case (Dutch) it's dd/mm/jjjj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...