Здравствуйте, помогите Определить диапазон по дате т.е если дата 04.03.2015 макрос должен вернуть диапазон D10:S17 на листе дата написана как 2015-03-04 если дата 06.03.2015 макрос должен вернуть диапазон D26:S29 на листе дата написана как 2015-03-06
Здравствуйте, помогите Определить диапазон по дате т.е если дата 04.03.2015 макрос должен вернуть диапазон D10:S17 на листе дата написана как 2015-03-04 если дата 06.03.2015 макрос должен вернуть диапазон D26:S29 на листе дата написана как 2015-03-06charony
Sub ertert() Dim dt As Date, sDt As String, r As Range dt = #3/6/2015# sDt = Format$(dt, "yyyy-mm-dd") On Error Resume Next: Err.Clear With Sheets("Tabelle1").Range("D1").CurrentRegion .Parent.AutoFilterMode = False .AutoFilter 8, sDt Set r = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(12) .AutoFilter If Err Then MsgBox "Oops", 64: Exit Sub End With MsgBox r.Address End Sub
[/vba] только надо строку заголовков добавить, чтобы фильтр правильно работал
вот например как-то вот так: [vba]
Код
Sub ertert() Dim dt As Date, sDt As String, r As Range dt = #3/6/2015# sDt = Format$(dt, "yyyy-mm-dd") On Error Resume Next: Err.Clear With Sheets("Tabelle1").Range("D1").CurrentRegion .Parent.AutoFilterMode = False .AutoFilter 8, sDt Set r = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(12) .AutoFilter If Err Then MsgBox "Oops", 64: Exit Sub End With MsgBox r.Address End Sub
[/vba] только надо строку заголовков добавить, чтобы фильтр правильно работалnilem
только надо строку заголовков добавить, чтобы фильтр правильно работал
поменял дату на 03.03.2015 показывает $D$2:$S$9 -- это не правильно
строку добавить нет возможности
и привязка должна быть именно к ячейкам даты, потому что они могут стоять в любом столбике т.е дата 03.03.2015 --> находим соответствующие этой дате ячейки $К$1:$К$9 --->$К$1 - 7 = $D$1, $К$9 + 8 = $S$9 только как это реализовать?
в оригинальном листе даты заполнены из программы, т.е там не даты а только линки
а так на тест файле работает, но в тест файле значения занесены для примера, к сожелению нет возможности выложить оригинал файла
только надо строку заголовков добавить, чтобы фильтр правильно работал
поменял дату на 03.03.2015 показывает $D$2:$S$9 -- это не правильно
строку добавить нет возможности
и привязка должна быть именно к ячейкам даты, потому что они могут стоять в любом столбике т.е дата 03.03.2015 --> находим соответствующие этой дате ячейки $К$1:$К$9 --->$К$1 - 7 = $D$1, $К$9 + 8 = $S$9 только как это реализовать?
в оригинальном листе даты заполнены из программы, т.е там не даты а только линки
а так на тест файле работает, но в тест файле значения занесены для примера, к сожелению нет возможности выложить оригинал файлаcharony
Sub ertert() Dim sDt As String, r As Range, rng As Range, adr$ sDt = Format$(#3/3/2015#, "yyyy-mm-dd") With Sheets("Tabelle2").Range("B1").CurrentRegion Set r = .Find(sDt, LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address Do If rng Is Nothing Then Set rng = r Else Set rng = Union(rng, r) Set r = .FindNext(r) Loop While r.Address <> adr End If MsgBox Intersect(rng.EntireRow, .Cells).Address End With End Sub
[/vba]
[p.s.]к сожалению[/p.s.]
ну давайте пробовать вот так, например: [vba]
Код
Sub ertert() Dim sDt As String, r As Range, rng As Range, adr$ sDt = Format$(#3/3/2015#, "yyyy-mm-dd") With Sheets("Tabelle2").Range("B1").CurrentRegion Set r = .Find(sDt, LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address Do If rng Is Nothing Then Set rng = r Else Set rng = Union(rng, r) Set r = .FindNext(r) Loop While r.Address <> adr End If MsgBox Intersect(rng.EntireRow, .Cells).Address End With End Sub
попробуйте добавить 2-3 колонки слева , или сверху добавьте две строки с текстом
я добавил одну колонку слева и вверху добавил одну строку с текстом работает не корректно первый адрес показывает не правильно А22:Т29, должно быть Е22:Т29
фаил в прицепе
@Kuzmich
на тест файле , работает но не совсем корректно
попробуйте добавить 2-3 колонки слева , или сверху добавьте две строки с текстом
я добавил одну колонку слева и вверху добавил одну строку с текстом работает не корректно первый адрес показывает не правильно А22:Т29, должно быть Е22:Т29
А не стоило бы задуматься над тем, зачем вообще нужно данное извращение? Почему нужен именно диапазон? Для чего и где он используется впоследствии, именно как диапазон? И да, в исходных данных даты всегда идут подряд, вместе (то есть диапазон уже отсортирован по полю с датами), или искомая дата все же может присуствовать в нескольких подддиапазонах строк? Только не говорите мне, что всё это делается, чтобы "передать этот диапазон в УФ и раскрасить табличку" :)
А не стоило бы задуматься над тем, зачем вообще нужно данное извращение? Почему нужен именно диапазон? Для чего и где он используется впоследствии, именно как диапазон? И да, в исходных данных даты всегда идут подряд, вместе (то есть диапазон уже отсортирован по полю с датами), или искомая дата все же может присуствовать в нескольких подддиапазонах строк? Только не говорите мне, что всё это делается, чтобы "передать этот диапазон в УФ и раскрасить табличку" :)AndreTM
AndreTM, даты идут всегда подряд, всегда в одной колонке, но адрес может быть другим
сейчас я это делаю руками, времени нужно меньше минуты, маркировать диапазон-копировать-занести в другой лист дальше работает макрос и VBScript, но если файлов больше 800
интересует именно диапазон, потом он обрабатывается в другом макросе
AndreTM, даты идут всегда подряд, всегда в одной колонке, но адрес может быть другим
сейчас я это делаю руками, времени нужно меньше минуты, маркировать диапазон-копировать-занести в другой лист дальше работает макрос и VBScript, но если файлов больше 800
интересует именно диапазон, потом он обрабатывается в другом макросеcharony
Сообщение отредактировал Serge_007 - Среда, 01.07.2015, 10:04
Sub ertert_1() Dim sDt As String, r As Range, rng As Range, adr$, adrL$, adrR$ sDt = Format$(#3/5/2015#, "yyyy-mm-dd") With Sheets("Tabelle1").UsedRange Set r = .Find(sDt, LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address adrL$ = r.End(xlToLeft).Address Do adrR$ = r.End(xlToRight).Address Set r = .FindNext(r) Loop While r.Address <> adr End If MsgBox "Диапазон с датой " & sDt & " " & adrL$ & ":" & adrR$ End With End Sub
[/vba]
[vba]
Код
Sub ertert_1() Dim sDt As String, r As Range, rng As Range, adr$, adrL$, adrR$ sDt = Format$(#3/5/2015#, "yyyy-mm-dd") With Sheets("Tabelle1").UsedRange Set r = .Find(sDt, LookIn:=xlValues, lookat:=xlWhole) If Not r Is Nothing Then adr = r.Address adrL$ = r.End(xlToLeft).Address Do adrR$ = r.End(xlToRight).Address Set r = .FindNext(r) Loop While r.Address <> adr End If MsgBox "Диапазон с датой " & sDt & " " & adrL$ & ":" & adrR$ End With End Sub
Ага, ну раз данные уже по датам отсортированы, но требуется диапазон для последующей обработки - то имеет право на жизнь и такой вариант:
[vba]
Код
Function findRange4Date(rng As Range, vDate) As Range Dim r As Range, rngUL As Range, rngBR As Range strDate$ = Format$(vDate, "yyyy-mm-dd") Set r = rng.Parent.UsedRange.Find(strDate, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Exit Function Set rngUL = r.End(xlToLeft) While r.Value = strDate Set r = r.Offset(1) Wend Set r = r.Offset(-1) Set rngBR = r.End(xlToRight) Set findRange4Date = Range(rngUL, rngBR) End Function
Sub a_test() Dim rng as Range Set rng = findRange4Date(Sheets("Tabelle1").Cells(1, 1), #3/4/2015#) If rng Is Nothing Then MsgBox "Данных нет" Else rng.Select End If End Sub
[/vba]
В функцию передаём ссылку на любую ячейку/диапазон на листе, где ищем данные (хоть в другой книге, естественно), и нужную дату, а получаем - необходимый диапазон как ссылку. Функция, кстати, может и выигрывать у предыдущей на больших таблицах (поскольку не производит лишнего перебора "за последним найденным - в начало - до первого найденного").
Ага, ну раз данные уже по датам отсортированы, но требуется диапазон для последующей обработки - то имеет право на жизнь и такой вариант:
[vba]
Код
Function findRange4Date(rng As Range, vDate) As Range Dim r As Range, rngUL As Range, rngBR As Range strDate$ = Format$(vDate, "yyyy-mm-dd") Set r = rng.Parent.UsedRange.Find(strDate, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Exit Function Set rngUL = r.End(xlToLeft) While r.Value = strDate Set r = r.Offset(1) Wend Set r = r.Offset(-1) Set rngBR = r.End(xlToRight) Set findRange4Date = Range(rngUL, rngBR) End Function
Sub a_test() Dim rng as Range Set rng = findRange4Date(Sheets("Tabelle1").Cells(1, 1), #3/4/2015#) If rng Is Nothing Then MsgBox "Данных нет" Else rng.Select End If End Sub
[/vba]
В функцию передаём ссылку на любую ячейку/диапазон на листе, где ищем данные (хоть в другой книге, естественно), и нужную дату, а получаем - необходимый диапазон как ссылку. Функция, кстати, может и выигрывать у предыдущей на больших таблицах (поскольку не производит лишнего перебора "за последним найденным - в начало - до первого найденного").AndreTM