Как я могу выполнить поиск и замену в столбцах, содержащих даты с общим форматированием?

#excel #vba #date #replace

#excel #vba #Дата #заменить

Вопрос:

Я пытался заменить все «-» на «/» в моей электронной таблице Excel с помощью VBA, но это работает не так, как я хочу. Пожалуйста, отправьте справку:’)

Проблема: ячейки, содержащие даты в формате 00-00-0000, изменяются на 00.00.0000 вместо желаемого формата 00/00/0000. Результаты будут такими же, даже если я сделаю это вручную, используя функцию поиска и замены Excel.

Некоторая информация о ячейках даты:

  • Они находятся в «общем» формате и меняются на формат «Дата» (некоторые по-прежнему остаются общими) после запуска кода

Код:

 Sub FindReplace()

Dim X, Y As Range

Set X = Range("A2").CurrentRegion

  For Each Y In X.Cells
      Y = Replace(Y, "-", "/")
  Next Y

End Sub
  

Спасибо за чтение 🙂

Комментарии:

1. Использовать Replace(Y, "-", "/") ? В настоящее время вы заменяете точку, а не тире.

2. Извините, что я виноват, но код по-прежнему не работает даже с dash

3. Вы можете попробовать использовать функцию ДАТЫ . Как расположены ваши значения? ДД / ММ / ГГГГ или ММ / ДД / ГГГГ или что-то еще?

4. можете ли вы опубликовать некоторые примеры данных?

5. @EvilBlueMonkey. Я попробовал функцию даты вручную, но она также не дает мне формат DD / MM / YYYY, который мне требовался.

Ответ №1:

Не просматривая данные, вы можете попробовать это…

 Sub FindReplace()

Dim x, y As Range

Set x = Range("A2").CurrentRegion

  For Each y In x.Cells
      y = format(y,"dd/mm/yyyy")
  Next y

End Sub
  

Комментарии:

1. Я попробовал предложенный вами код, но он выдал мне ошибку времени выполнения 6; Ошибка переполнения. x.x Данные представляют собой просто некоторые числа в ДД / ММ / ГГГГ или ДД / ММ / ГГГГ ЧЧ: ММ и в общем формате. Если я не ошибаюсь, некоторые знают эти данные как даты, отформатированные в тексте? Однако, даже когда я попытался найти и заменить даты в формате даты с помощью приведенного выше кода, это все равно не сработало.

2. Второй y в формуле в нижнем регистре. Попробуйте изменить его на верхний регистр.

3. @EvilBlueMonkey Да, вы правы, я изменил его. Спасибо.

Ответ №2:

Предполагая, что ваши исходные данные также находятся в формате ДД.ММ.ГГГГ, я написал эту подпрограмму:

 Sub FindReplace()

    Dim RngRange01 As Range
    Dim RngTarget As Range
    
    Set RngRange01 = Range("A2").CurrentRegion
    
    For Each RngTarget In RngRange01
        RngTarget.Value = DateSerial(Right(RngTarget.Value, 4), Mid(RngTarget.Value, 4, 2), Left(RngTarget.Value, 2))
    Next RngTarget

End Sub
  

Я протестировал его в диапазоне с датами, написанными с точкой вместо косой черты, и, похоже, это работает для меня.

Дополнительный совет: я бы не использовал одну букву для идентификации переменной. Их действительно сложно заменить и отследить. По крайней мере, 3 буквы, которые вы обычно не находите в остальной части кода, намного лучше. Что-то вроде xyz или sss или qwe . Еще лучше, если вы добавите небольшой тег, чтобы запомнить, какие это переменные (например Rng , для диапазона Byt , для байта или Dbl для double).

Комментарии:

1. К сожалению, это также не сработало для меня, поскольку проблема связана с моими региональными и языковыми настройками. Мне нужно было только изменить свой формат на английский (Великобритания), и проблема исчезла бы ~ Спасибо за ваш ответ и советы!!

2. Какие языковые / региональные настройки у вас есть? Возвращает ли подпрограмма какую-либо ошибку? Дает ли это вам какой-либо результат?

3. Извините за поздний ответ @EvilBlueMonkey, мои языковые / региональные настройки были на французском (Швейцария). Да, это так. Я получил ошибку времени выполнения ’13’: несоответствие типов.

4. Хм, я бы сказал, что он пытается скрыть данные, которые не должны быть датой. Вы можете либо попытаться лучше определить свой диапазон, не включая ничего, кроме дат, либо попытаться поставить a On Error Resume Next перед циклом For-Next. Я бы предложил первое.