Vba максимальная дата excel

I have a column which has date value for different records, and I need to fetch the date which has the maximum value. One or more records can have the same date. How can I proceed with this? Not understanding on where to start the code on this:

for i = 3 to last_lin
max_dat = ws.Range("C" & i).Value
Next

last_line is the last line of the record till which data needs to be verified. I have put value in this variable «max_dat». Now what next should be done? Please let me know.

Community's user avatar

asked Mar 27, 2018 at 12:54

user9351236's user avatar

3

Taking an example case create the range as a variable and do Application.WorksheetFunction.Max on the range

Option Explicit

Sub test()

Dim max_dat As Date
Dim last_lin As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet3")

last_lin = 5
max_dat = Application.WorksheetFunction.Max(ws.Range("C3:C" & last_lin))

Debug.Print max_dat

End Sub

Data in sheet

Data

answered Mar 27, 2018 at 12:59

QHarr's user avatar

QHarrQHarr

82.9k11 gold badges55 silver badges99 bronze badges

0

У меня есть лист excel с датами в столбце A, и мне нужно найти последнюю дату и фильтр за 7 дней до этой последней даты. Я только нашел vba-коды онлайн, которые принимают сегодняшнюю дату — 7 дней, но я не могу использовать это, потому что эти даты относятся к прошлому году.

Пожалуйста и спасибо!

РЕДАКТИРОВАТЬ:

Спасибо за ваше предложение. Я попытался поместить его в свой код vba, но он фильтрует 0 результатов.

Sub Filter()
Dim maxDate As Date
maxDate = WorksheetFunction.Max(ActiveSheet.Range("A:A"))
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:= _
">" & maxDate - 6
End Sub

Не работает, так как этот файл макросов VBA датируется dd.mm.yyyy. (ПРИМЕЧАНИЕ DOT в конце), 0 приводит к моему случаю, он должен фильтровать dd.mm.yyyy (без точки). Я не знаю, как фильтровать без точки

EDIT2: Это сработало для меня.

Sub Largest()
Dim rng As Range
Dim dblMax As Double
Set rng = ActiveSheet.Range("A:A")
dblMax = Application.WorksheetFunction.Max(rng)
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:= _
">" & dblMax - 7, Operator:=xlAnd
End Sub

0 / 0 / 0

Регистрация: 22.05.2015

Сообщений: 4

1

Excel

Найти максимальную дату среди значений в одной ячейке

03.12.2018, 10:38. Показов 4409. Ответов 2


Студворк — интернет-сервис помощи студентам

Добрый день!
Помогите, пожалуйста, написать функцию (или формулу, если это возможно), чтобы находить самую позднюю дату среди указанных в одной ячейке. Дат может быть от одной до непонятного количества.
Пример значения ячейки:» , , 07.08.2018, 07.08.2018, 10.08.2018, 17.08.2018, 07.08.2018, 06.08.2018, 07.08.2018, 06.08.2018″.
Понимаю, что можно разделить значение по столбцам, а потом найти максимальное из них, но, к сожалению, такой способ не подходит, поскольку существующая таблица довольно объемная и редактируется несколькими сотрудниками, не понятно, кому я могу случайно данные «затереть» своими датами.
Догадываюсь, что нужно разделить значение ячейки на отдельные даты, сунуть их в массив, и достать из него максимум, но с синтаксисом беда у меня, ерунда всякая получается.
Заранее благодарна!



0



Вопрос:

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

Run-time error ‘1004’: Application-defined or object-oriented error.

Ниже мой код:

Sub GenerateSheet()

Dim i, r, numAssignments As Integer
Dim ssrRng, DestRange As Range
Dim StartDate, EndDate, d As Date

numAssignments = Sheets("Data").Range("A1048576").End(xlUp).Row - 1
Sheets("Schedule").Select

EndDate = WorksheetFunction.Max(Sheets("Data").Range(Cells(2, 8), Cells(numAssignments, 8)))
StartDate = WorksheetFunction.Min(Sheets("Data").Range(Cells(2, 5), Cells(numAssignments, 5)))

End Sub

Здесь, Таблица данных имеет 8 столбцов, столбцы 5 и 8 – даты

Ответ №1

Лучше изменить несколько аспектов вашего кода, несмотря на то, что не все они несут ответственность за полученную ошибку. В общем, ваш код более подвержен ошибкам (например, при смене кода или применении его в других случаях).

  • Использование Dim:
    Dim ssrRng, DestRange As Range объявляет ssrRng как Variant и DestRange как Range.
    Вы должны использовать Dim ssrRng As Range, DestRange As Range, считая, что хотите как диапазоны.

  • Используйте переменные вместо явных ссылок, в частности, если они повторяются.
    использование

    Dim ws as Worksheet

    Set ws = Workbooks(<your workbook name>).Sheets("Data")

    numAssignments = ws...

    вместо

    numAssignments = Sheets("Data")...

  • Полностью квалифицируйте диапазоны, используемые вами, если вы явно не хотите этого.

    • Заменить

      numAssignments = Sheets("Data")...
      с, например,

      numAssignments = Workbooks(<your workbook name>).Sheets("Data")...

      (или, лучше, следуйте точке 2, которая уже рассматривает эту точку).

    • Заменить

      EndDate = WorksheetFunction.Max(Sheets("Data").Range(Cells(2, 8), Cells(numAssignments, 8)))
      с

      EndDate = WorksheetFunction.Max(ws.Range(ws.Cells(2, 8), ws.Cells(numAssignments, 8)))
      Аналогично для StartDate. В этом случае эти строки были источником ошибки, так как Cells без квалификатора работает в ActiveSheet.

  • Избегайте использования Select, если вы явно не нуждаетесь в нем. Объявите и установите переменные и используйте их для ссылки Range или Object, с которой вы хотите работать.

Ответ №2

Вы указываете диапазон, что его родительский элемент Листы ( “Данные” ), но не ячейки. Для всех целей и целей вам нужен диапазон от Data! E2: Schedule! E99.

Sub GenerateSheet()

Dim i, r, numAssignments As Integer
Dim ssrRng, DestRange As Range
Dim StartDate, EndDate, d As Date

numAssignments = Sheets("Data").Range("A1048576").End(xlUp).Row - 1
Sheets("Schedule").Select

with Sheets("Data")
EndDate = WorksheetFunction.Max(.Range(.Cells(2, 8), .Cells(numAssignments, 8)))
StartDate = WorksheetFunction.Min(.Range(.Cells(2, 5), .Cells(numAssignments, 5)))
end with

End Sub

Использование With Sheets("Data") сообщает все внутри этого блока, которому предшествует период (aka . или полная остановка), что его родительский элемент Листы ( “Данные” ).

Найти минимальную/максимальную дату по условию

mkotik

Дата: Понедельник, 11.05.2015, 02:32 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте всем!
Пишу впервые, прошу прощения за формулировку вопроса.
1-й столбец — признак
2-й — организации
3-й, 4-й и 5-й — описание принадлежности к городу и региону организации
6-й и 7-й — существующие минимальные (даты открытия) и максимальные (даты закрытия, в случае «» — еще не закрыт) даты
Не получается перенос дат на более высокий уровень: выдает или циклическую ошибку или #н/д или 0.
Заранее благодарен за помощь!

К сообщению приложен файл:

Ne_idet.xls
(74.5 Kb)

 

Ответить

Samaretz

Дата: Понедельник, 11.05.2015, 09:04 |
Сообщение № 2

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 215


Репутация:

62

±

Замечаний:
0% ±


Excel 2010; 2013; 2016

Не знаю, странно или нет, но все работает…

К сообщению приложен файл:

4595467.xls
(72.0 Kb)


Благодарность можно отправить на Яндекс-кошелек: 410011414293115

 

Ответить

mkotik

Дата: Понедельник, 11.05.2015, 12:27 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Samaretz, спс за оперативность, но:
1. Массив имеет более 25 000 строк (руками сделать устанешь).
2. Он с каждым днем изменяется (предприятия открывают/закрывают).
3. Выделенные столбцы и информация в них — это те значения, которые хотелось бы получать.
4. Применял формулы вида:

Код

{=ИНДЕКС($K$2:$K$68;ИНДЕКС(ПОИСКПОЗ(D16&E16&K16;$D$2:$D$68&$E$2:$E$68&$K$2:$K$68;0);0))}

и

Код

{=ИНДЕКС($K$2:$K$68;ИНДЕКС(ПОИСКПОЗ(1=1;D16&E16&K16=$D$2:$D$68&$E$2:$E$68&$K$2:$K$68;1);0))}

и

Код

{=ПРОСМОТР($D$1:$D$68&$E$1:$E$68=D15&E15;МИН(ЕСЛИ(K16:K27;K16:K27)))}

Хотелось получить формулу для всех уровней

Сообщение отредактировал mkotikПонедельник, 11.05.2015, 12:29

 

Ответить

Nic70y

Дата: Понедельник, 11.05.2015, 19:37 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

mkotik, из Ваших формул ничего не понял.
может это поможет:

Код

=МИН(ЕСЛИ(D$2:D$68&E$2:E$68=D2&E2;ЕСЛИ(F$2:F$68<>»»;F$2:F$68)))

Код

=СУММПРОИЗВ(МАКС((D$2:D$68&E$2:E$68=D2&E2)*F$2:F$68))

К сообщению приложен файл:

_idet_Li.xls
(76.5 Kb)


ЮMoney 41001841029809

 

Ответить

mkotik

Дата: Понедельник, 11.05.2015, 19:52 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Nic70y, спасибо, но к сожалению ни 1-я, ни 2-я не решает проблему пустых значений — те случаи, когда организация существует

 

Ответить

Nic70y

Дата: Понедельник, 11.05.2015, 20:11 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

Код

=МАКС(ЕСЛИ(D$2:D$68&E$2:E$68=D2&E2;ЕСЛИ(G$2:G$68<>»»;G$2:G$68)))

вдруг правильно, я в первый раз ошибся в диапазоне %)


ЮMoney 41001841029809

 

Ответить

mkotik

Дата: Понедельник, 11.05.2015, 20:42 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Nic70y, к сожалению формула переносит только значения, которые и так известны, в подгруппах по прежнему «0» girl_sad

 

Ответить

_Boroda_

Дата: Понедельник, 11.05.2015, 21:34 |
Сообщение № 8

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Так нужно?

Код

=ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(A2;{«Пр»:»Р»:»Ф»};));МИН(F3:ИНДЕКС(F3:F$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА())));F2)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

mkotik

Дата: Понедельник, 11.05.2015, 22:51 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

_Boroda_, спасибо за внимание к моим сложностям :D!
К сожалению, не все улавливает по датам закрытия, может быть я не объяснил (извините заранее): пустые даты закрытия означают, что организации работают и, если хотя бы одна организация не закрыта (дата закрытия = «»), город и более высокие урони считаются действующими — т.е. там тоже должны быть даты закрытия = «»
В файле выделил неточности желтым цветом

Сообщение отредактировал mkotikПонедельник, 11.05.2015, 22:52

 

Ответить

ShAM

Дата: Вторник, 12.05.2015, 06:01 |
Сообщение № 10

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

Почему у Вас в ячейке М15 — «2014, Июнь», а в М36, например, пусто? Как правильно?

У Александра (_Boroda_) диапазон чуть съехал. Для столбца Н формула такая:

Код

=ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(A2;{«Пр»:»Р»:»Ф»};));МИН(F2:ИНДЕКС(F2:F$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА())));F2)

Сообщение отредактировал ShAMВторник, 12.05.2015, 06:05

 

Ответить

mkotik

Дата: Вторник, 12.05.2015, 12:44 |
Сообщение № 11

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

ShAM, спасибо огромное за внимание к моей задаче!
Согласен полностью с Вами — у меня косяк — в M15 должно быть пусто («») — руками вбивал и ошибся :) (сорри) — организации там есть и они работают :)
Исправил с учетом Ваших изменений — все ок по датам открытия — спасибо большое!
Остаются даты закрытия :(

 

Ответить

_Boroda_

Дата: Вторник, 12.05.2015, 13:13 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

mkotik, а откуда у Вас взялись даты в ячейках F2, F4, F6? Их же не должно быть в выгрузке. Вы вручную их дописали? Короче, я оттуда даты стер. И еще — Вы предоставили не родную выгрузку, а измененную — некоторые пустые ячейки у Вас действительно изначально пустые, а некоторые — стертые. Первые в формуле дают «», а вторые — 0. Приходится усложнять формулу. А в ячейке G19 вообще 3 пробела.
Алишер, спасибо.
Для закрытия формула массива (вводится одновременным нажатием Контрл Шифт Ентер)

Код

=ЕСЛИ(F2;G2;ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(;ЕСЛИ(F3:ИНДЕКС(F2:F$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА()));G3:ИНДЕКС(G2:G$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА())));));»»;МАКС(ЕСЛИ(F3:ИНДЕКС(F2:F$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА()));G3:ИНДЕКС(G2:G$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;);999-СТРОКА()))))))

Можно укоротить, но я что-то торможу.

К сообщению приложен файл:

1808250.xls
(90.5 Kb)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

mkotik

Дата: Вторник, 12.05.2015, 14:52 |
Сообщение № 13

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Александр, Алишер — ОГРОМНОЕ СПАСИБО, на исходном массиве все получилось, буду проверять на большом!
С уважением, Игорь

 

Ответить

ShAM

Дата: Среда, 13.05.2015, 12:41 |
Сообщение № 14

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

Саша, ты действительно супермозг! Меня хватило только на:

Код

=ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(A2;{«Пр»:»Р»:»Ф»};));ЕСЛИ(СУММ(ЕСЛИ(G3:ИНДЕКС(G3:G$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;)-1;))=»»;1;0))=0;МАКС(G3:ИНДЕКС(G3:G$999;ЕСЛИОШИБКА(ПОИСКПОЗ(A2;A3:A$999;)-1;)));»»);G2)

в одном месте по вполне понятным причинам «ошибка». Усложнять дальше времени не хватило.
Саш, зачем нужно вот это: «999-СТРОКА()»? Вроде и без него работает.
И еще одна странность. Формула в О2 говорит, что I2=M2, а УФ говорит обратное %)
ЗЫ: Пришлось сохранить в .xlsx, иначе вылетает за 100 кВ.

Сообщение отредактировал ShAMСреда, 13.05.2015, 12:42

 

Ответить

_Boroda_

Дата: Среда, 13.05.2015, 14:13 |
Сообщение № 15

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Спасибо, но мне совсем не нравится эта формула. Не должна она быть такой длинной.

зачем нужно вот это: «999-СТРОКА()»

Я ж говорю — тормозил я тогда, про ИНДЕКС с нулем не подумал даже.

Формула в О2 говорит, что I2=M2, а УФ говорит обратное

А там у тебя не УФ, а просто желтая покраска.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

mkotik

Дата: Среда, 13.05.2015, 15:29 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 178


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

ShAM, не обрабатывается в Вашем варианте — ячейка I10 (Харабали), организация там закрыта, т.е. значение I10 должно быть 2014, Июль.
В общем вариант ShAM считает более точно, но когда загрузил в оригинал базы на этом массиве — 2 сбоя есть: I10 и H10 — не пойму почему в H10 ошибку дает.
PS Просмотрел другие ошибки — создается ощущение, что при каких-то значениях на датах открытия (минимальных) идет сдвиг на 2 строки вниз

Сообщение отредактировал mkotikСреда, 13.05.2015, 15:43

 

Ответить

Excel VBA: код для поиска максимальной даты в строке, содержащей пустые ячейки

Dim s As Date

s = WorksheetFunction.Max((If IsNotEmpty (CDate(Range("A" & x + 1).Value), CDate(Range("B" & x + 2).Value), CDate(Range("C" & x + 1).Value)))
MsgBox s

У меня есть таблица, в которой есть около 8 столбцов, содержащих даты (бывшая дата начала, дата окончания и т. Д.). Теперь для каждой строки некоторые столбцы пусты. Я должен найти максимальную дату в каждой строке.

введите описание изображения здесь

3 ответа

Лучший ответ

Я бы посоветовал вам сделать это:

sub tryme()

For i = 1 To 50
    Max_date = Application.WorksheetFunction.Max(Rows(i))
    if isempty(Max_date) = False then
    MsgBox cDate("The most recent date for row : " & i & "is : " & Max_date)
    end if
Next
end sub

Где i — номер вашей строки; вам нужно будет указать количество строк или найти его с помощью .Count


0

neophlegm
18 Сен 2019 в 13:06

Вы можете попробовать:

Option Explicit

Sub test()

    Dim i As Long, y As Long
    Dim dDate As Date

    With ThisWorkbook.Sheets("Sheet1")

        'Loop rows 1-10
        For i = 1 To 10
            'Set a default date
            dDate = "1/1/1900"
            'Loop columns from 1-8
            For y = 1 To 8
                If .Cells(i, y).Value <> "" And .Cells(i, y).Value > dDate Then
                    dDate = .Cells(i, y).Value
                End If
            Next y

            Debug.Print "Max date for row " & i & " is date " & dDate

        Next i

    End With

End Sub


0

Error 1004
18 Сен 2019 в 12:07

Здравствуйте, обратитесь к приведенному ниже коду для ячейки A1 к AA1, также содержит дату с пустой ячейкой

Sub maxdaterow()
Max_date = Application.WorksheetFunction.Max(Range("A1:AA1"))
MsgBox Max_date
End Sub

Код ниже, чтобы найти максимальную дату в столбце A, который также содержит пустые ячейки

Sub maxdate()
Max_date = Application.WorksheetFunction.Max(Columns("A"))
MsgBox Max_date
End Sub


0

Angad Gupta
18 Сен 2019 в 11:30

Like this post? Please share to your friends:
  • Vba макросы массивы excel
  • Vba макросы excel окно
  • Vba макрос при запуске word
  • Vba макрос excel сортировка
  • Vba макрос excel поиск