Форматирование столбцов даты в виде текста с использованием VBA - Вопрос - PullRequest
0 голосов
/ 19 апреля 2019

Проблема: даты, отображаемые в моих файлах Excel, не являются фактическими датами, введенными в каждую ячейку. Например, я мог бы визуально увидеть 18.04.2009, но когда я щелкаю по ячейке, она показывает 18.04.2009 в 18:48:00. Это становится проблемой, когда я запускаю макрос, который я использую для преобразования моего файла xlsx в txt. Сгенерированный текстовый файл покажет 19.04.2009 18:48:00 в поле даты, а не то, что я хочу, 18.04.2017.

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

Это элементарное исправление на самом деле работает довольно хорошо при генерации нужного мне результата. За исключением одной проблемы: если в столбцах даты есть пробелы, он вставляется 01.01.1900. Пробелы в столбцах даты довольно часто встречаются в работе, которую я выполняю, поэтому это большая проблема.

Я пытался добавить это Если после вставки / вставки значений / удаления кода:

'Фиксировать формат даты в столбцах A и C

Columns("B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("B1").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm"/"dd"/"yyyy"")"
Range("E1").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm"/"dd"/"yyyy"")"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B" & EndRow)
Range("E1").Select
Selection.AutoFill Destination:=Range("E1:E" & EndRow)
Range("B1:B" & EndRow).Select
Selection.Copy
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("E1:E" & EndRow).Select
Selection.Copy
Range("D1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Columns("E").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("B").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft

If Range("A1:A") = "01/01/1900" Then ClearContents

Но я получаю эту ошибку «Ошибка компиляции: Sub или Function не определены», с выделенным словом Range в операторе If. Я не понимаю, почему он не распознает диапазон, поскольку он используется без проблем всего на несколько строк. Я должен делать что-то не так, но я потерян. Есть идеи?

PS - If - это всего лишь средство для достижения цели, как для устранения пробелов, но я уверен, что есть лучший способ преобразовать эти столбцы даты в текст или в нужный мне формат даты. Если у вас есть какие-либо рекомендации по более легкому способу достижения тех же результатов, я весь в ушах.

Спасибо, ребята, я действительно ценю это!

1 Ответ

0 голосов
/ 19 апреля 2019
Range("A1:A")
  1. Это ссылка для 'всего от A1 до последней использованной ячейки в столбце A' , не в стиле VBA.Либо обратитесь ко всему столбцу (например, Range("A:A")), либо измените конечную строку с помощью EndRow var (например, Range("A1:A" & EndRow)).

  2. Форматирующая маска используется в приложении VBA формулы TEXT кажется неправильным.При использовании кавычки внутри строки в кавычках удваивайте кавычку один раз каждый раз, когда она используется.Формула TEXT возвращает строку (т.е. текст);Вам не нужно предпринимать дальнейших преобразований.

    ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm/dd/yyyy"")"
    
  3. И формулы xlR1C1, и относительные стили xlA1 применяются ко всем ячейкам одновременно.Объединение целевых ячеек в столбцах B и E дополнительно ускоряет вставку формулы.

    Range("B1:B" & EndRow & ",E1:E" & EndRow).formular1c1 = "=TEXT(RC[-1],""mm/dd/yyyy"")"
    
  4. Невозможно напрямую сравнить диапазон нескольких ячеек с одним значением.Либо выполните цикл по ячейкам, либо используйте широкодиапазонное сравнение, например Range.Find, функцию MATCH на рабочем листе или автофильтр, чтобы отобразить соответствующие ячейки как xlCellTypeVisible.

    dim m as variant
    
    m = application.match("01/01/1900", ActiveSheet.Range("A:A"), 0)
    
    do while not iserror(m)
        ActiveSheet.Cells(m, "A").clearcontents
        m = application.match("01/01/1900", ActiveSheet.Range("A:A"), 0)
    loop
    
  5. Если вы 'мы прочитали это далеко, самый простой метод удаления даты из даты-времени - это Text-to-Columns.Просто отбросьте что-нибудь после 10-го символа (например, мм / дд / гггг из мм / дд / гггг чч: мм ампер / пм ).

    With ActiveSheet.Columns("A")
        .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(Array(0, 1), Array(10, 9))
        .NumberFormat = "mm/dd/yyyy"
    End With
    
  6. Я бы смиренно предложил вам потратить некоторое время на изучение Как избежать использования Select в Excel VBA .Если вы продолжаете разрабатывать VBA для повышения эффективности приложений Office, вам следует как можно скорее начать использовать рекомендуемые методы.

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