2 Проблемы с макросами VBA и форматированием даты - PullRequest
0 голосов
/ 23 апреля 2020

Я просмотрел другие посты, но не могу найти ничего похожего на мои проблемы. Любая помощь будет оценена. У меня есть набор дат, которые приходят каждый день; даты поступают в следующем формате: ДД.ММ.ГГГГ (я живу в стране, в которой день первый). Мне нужны данные для преобразования в ДД / ММ / ГГГГ. Затем я использую эти даты в Vlookup как часть набора данных, который содержит информацию, которую я sh извлекает. Мне нужна помощь со следующими проблемами: Проблема # 1

Когда я использую макрос и переключаю "." с помощью "/" дни с 1 по 12 были переключены на следующий формат ДД / ММ / ГГГГ. Тем не менее, фактический месяц и день поменялись. В настоящее время работает в апреле, поэтому 01.04.2020 был переключен на 01.04.2020 (чтение как четвертое января); 02.04.2020 (второе февраля и тд ....). Как я могу предотвратить это, чтобы все оставалось на месте и только "." и "/" изменить. Задача № 2 Начиная с 13-го дня формат выглядит правильно «13/04/2020», однако, когда я использую его в Vlookup, формула не вернет никаких результатов. Чтобы Vlookup работал, я должен go перейти к ячейке, которую я только что изменил, и нажать delete перед первым di git, хотя там нет места; для того, чтобы Vlookup работал.

Почему это происходит? Что я могу сделать, чтобы он работал сразу после замены «.» и «/»

Ниже мой код

Sub Dates()

Range(Range("G12"), Range("G12").End(xlDown)).Select


Selection.NumberFormat = "dd.mm.yyy"

Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

Selection.NumberFormat = "dd/mm/yyy" 

End Sub 

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Try,

Sub test()
    Dim vDB, rngDB As Range
    Dim s As Variant
    Dim i As Long

    Set rngDB = Range("G12", Range("G12").End(xlDown))
    vDB = rngDB
    For i = 1 To UBound(vDB, 1)
        s = Split(vDB(i, 1), ".")
        vDB(i, 1) = DateSerial(s(2), s(1), s(0))
    Next i
    rngDB = vDB
    rngDB.NumberFormatLocal = "dd/mm/yyyy"
End Sub

Изображение ошибки

enter image description here

Правильное изображение

enter image description here

0 голосов
/ 25 апреля 2020

Спасибо за текст в колонку, советую вот что я сделал, чтобы он работал:

Sub Dates ()


Dim rg As Range

Set rg = Range("G12").CurrentRegion

    rg.TextToColumns Destination:=Range("H2"), ConsecutiveDelimiter:=True, DataType:=xlDelimited, Other:=True, OtherChar:="."

    lr = ActiveSheet.Cells(Rows.Count, "G").End(xlUp).Row

    Range("K2").Formula = "=DATE(J2,I2,H2)"

    Range("K2").AutoFill Range("K2:K" & lr)
0 голосов
/ 23 апреля 2020

Вот решение для вашего кода как .

Я настоятельно рекомендую прочитать и понять Как избежать Выберите в Excel VBA , чтобы улучшить свой код и снизить риск ошибок во время выполнения.

Если вы добавите этот код в конец вашей существующей процедуры (как показано в вашем вопросе), он пропустит oop через каждую ячейку и переформатирует его в правильное значение даты.

Dim myCell As Variant
Dim myRange As Range

Set myRange = Selection

For Each myCell In myRange
    myCell.Value = Format(CDate(myCell), "DD/MM/YYYY")
Next

. Вам может также пригодиться эта ссылка:

Лучший способ найти последнюю использованную строку

Если вы уточните свой код с учетом информация в обеих ссылках, вы в конечном итоге полностью избегаете .Select и Selection., и ваш целевой диапазон / ячейка будет менее двусмысленным.


Я переформатировал бы его следующим образом:

Примечание: Я написал это на Sheet1 новой рабочей книги, вам понадобится изменить ссылку Sheets("...") в соответствии с именем вашего листа.

Sub dates()

Dim myRange As Range
Dim LastRow As Long
Dim myCell As Range

    With ThisWorkbook.Sheets("Sheet1")
        LastRow = .Cells(.Rows.Count, 7).End(xlUp).Row
        Set myRange = Range("G12:G" & LastRow)

        For Each myCell In myRange
            myCell.Value = Replace(myCell, ".", "/")
            myCell.Value = Format(CDate(myCell), "DD/MM/YYYY")
        Next myCell
    End With
End Sub

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

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