Страницы: 1
RSS
Поиск минимальной даты в ячейках текстового формата через VBA
 
Всем привет! Думаю простой вопрос для знатоков.
Есть лист, на нем есть Range с датами, записанными в текстовом формате. Нужно через VBA в этом Range найти минимальное значение даты.
При этом не нужно менять формат самих ячеек на листе и записывать формулу на лист (через формулу массива, записываемую на листе, я знаю как это сделать, но хочу понять как это делать, ничего не меняя на листе и не записывая на него).
Как это сделать циклом (в т.ч. массивом + циклом) я тоже знаю. Но мне кажется что есть способ просто записать формулу, которая будет работать как формула массива, через WorksheetFunction, и никаких циклов не понадобится. Итого вопрос звучит примерно так: во вложении пример с попытками записать формулы типа "формул массива" через WorksheetFunction. Как их записать правильно?
 
См. вариант:
Код
Sub qqq()
Dim DateMin As Date, rCell As Range, Adr As String
    DateMin = CDate(Range("A1"))
    Adr = "A1"
    For Each rCell In Range("A2:A9")
        If CDate(rCell) < DateMin Then
            DateMin = CDate(rCell)
            Adr = rCell.Address
        End If
    Next
    MsgBox "Минималоьная дата найдена в ячейке " & Adr, 64, "Для сведения"
    Range(Adr).Select
End Sub
Только не понимаю, в чём прелесть запрета на преобразование в нормальные даты? Зачем героически преодолевать трудности, которые сами себе создаём? )
 
Юрий, спасибо за ответ! Но циклом я знаю как сделать.
Суть в том что есть Куб OLAP, из которого даты выгружаются в текстовом формате. И таких дат, допустим, 400 тыс. строк.
И нужно найти минимальную и максимальную даты с минимальными времязатратами. Делать дополнительные столбцы на листе для преобразования 400 тыс. строк не хочется, формулу массива записывать на лист для 400 тыс. строк тоже не хочется.
Циклом в целом это обработать не долго займет, особенно если в массив загнать, но я думал может быть эту формулу можно просто записать и посчитать в VBA, при этом физически не записывая ее на лист (и не использую цикл для решения).
Изменено: VasiliY_Seryugin - 18.01.2021 11:39:39
 
Зачем дополнительный столбец? Преобрразуйте на месте: выделяем диапазон (столбец) - Данные - Текст по столбцам - и сразу жмём на "Готово".
 
Цитата
VasiliY_Seryugin написал:
Суть в том что есть Куб OLAP, из которого даты выгружаются в текстовом формате
А каким инструментом из куба происходит выгрузка? Может на этом этапе преобразовывать, чтобы в выгрузке сразу получить нужные данные?
Вот горшок пустой, он предмет простой...
 
На мой взгляд, выхода два
1) преобразовывать в дату при выгрузке
2) arr = range("a1:a400000").value и далее циклом по массиву аrr преобразование и проверка, как показал Юрий выше
Изменено: New - 18.01.2021 12:29:44
 
3). Преобразовать (#4) и
Код
DateMin = Application.WorksheetFunction.Min(Range("A1:A9"))
End Sub
 
Цитата
New написал:
циклом по массиву
ТС хочет без циклов (хотя встроенные функции скорее всего работают на них же)
Не бойтесь совершенства. Вам его не достичь.
 
Да, вероятно так и есть.
Ладно, всем большое спасибо за помощь! Значит будет массив + цикл. Я просто думал может какой нибудь Evaluate все это можно было как то просто записать в одну строчку.
 
я в формулах не разбираюсь, но если вы знаете такую формулу массива для ячейки, которая это сделает, то в VBA она пишется [A1].FormulaArray = "тут ваша формула
Изменено: New - 18.01.2021 15:11:21
Страницы: 1
Наверх