Доброго времени суток, господа форумчане! Проконсультируйте, пожалуйста, либо помогите исправить код в макросе (см.вложение). Задача такова, что имеется таблица с входными данными, обновляющаяся раз в минуту из CSV файла. 1-ый столбец - Дата 2-ой столбец - Время 3-ий и последующие - это значения на определенную дату и время. Необходимо, чтобы макрос сравнивал данные введенные в пользовательскую UserForm с 4-мя text-boxами, 2 из которых Дата (с-по), 2 других Время (с-по) с первым и вторым столбцом соответственно. Например, вводя в форму такие данные: "с 03.11.2017 по 07.11.2017 и с 10:30 по 13:30" Мы должны получить табличку начинающуюся строкой 03.11.2017 10:30 и оканчивающуюся строкой 07.11.2017 13:30, а между первой и последней строкой, соответсвенно должны располагаться строки попадающие в заданный диапазон. По-моему мению, я могу очень сильно заблуждаться, макрос должен выполнить следующий алгоритм: 1. Найти в первом столбце первое вхождение даты равной либо большей от "Начальной" (т.е. введенной в ТекстБокс1), и найти во втором столбце время равное либо большее от "Начального" (т.е. введенного в ТекстБокс3) - при нахождении и совпадении двух этих параметров, код должен определить такую строку, как первую для дальнейшей выборки (копирования). 2. Найти в первом столбце последнее вхождение даты равной либо меньшей от "Конечной" (т.е. введенной в ТекстБокс2), и найти во втором столбце время равное либо меньшее от "Начального" (т.е. введенного в ТекстБокс4) - при нахождении и совпадении двух этих параметров, код должен определить такую строку, как последнюю для дальнейшей выборки (копирования). Загводка в том, что удалось, на данный момент, сделать выборку только по дате, одновременно с временем форма выборки работать отказывается. Возможно, дело в неправильно заданных операторах либо параметрах TimeStart/TimeFinish [vba]
Код
If Cells(i, 1) >= DateStart And Cells(i, 2) >= TimeStart Then 'Ищем начальную дату в первом столбце и начальное время во втором
If Cells(i, 1) <= DateFinish And Cells(i, 2) <= TimeFinish Then 'Ищем конечную дату в первом столбце и конечное время
[/vba] Прикладываю два файла: 1 - ый, где функционирует выборка по дате, и выборка времени просто "закомменчена" 2 - ой, где время и дата связаны через And, но не работает выборка, ни по дате, ни по времени Пожалуйста, помогите разобраться! Заранее благодарна. _______________________________________________ Отдельное спасибо Parovoznic за неоценимые помощь и поддержку на всех этапах реализации.
Доброго времени суток, господа форумчане! Проконсультируйте, пожалуйста, либо помогите исправить код в макросе (см.вложение). Задача такова, что имеется таблица с входными данными, обновляющаяся раз в минуту из CSV файла. 1-ый столбец - Дата 2-ой столбец - Время 3-ий и последующие - это значения на определенную дату и время. Необходимо, чтобы макрос сравнивал данные введенные в пользовательскую UserForm с 4-мя text-boxами, 2 из которых Дата (с-по), 2 других Время (с-по) с первым и вторым столбцом соответственно. Например, вводя в форму такие данные: "с 03.11.2017 по 07.11.2017 и с 10:30 по 13:30" Мы должны получить табличку начинающуюся строкой 03.11.2017 10:30 и оканчивающуюся строкой 07.11.2017 13:30, а между первой и последней строкой, соответсвенно должны располагаться строки попадающие в заданный диапазон. По-моему мению, я могу очень сильно заблуждаться, макрос должен выполнить следующий алгоритм: 1. Найти в первом столбце первое вхождение даты равной либо большей от "Начальной" (т.е. введенной в ТекстБокс1), и найти во втором столбце время равное либо большее от "Начального" (т.е. введенного в ТекстБокс3) - при нахождении и совпадении двух этих параметров, код должен определить такую строку, как первую для дальнейшей выборки (копирования). 2. Найти в первом столбце последнее вхождение даты равной либо меньшей от "Конечной" (т.е. введенной в ТекстБокс2), и найти во втором столбце время равное либо меньшее от "Начального" (т.е. введенного в ТекстБокс4) - при нахождении и совпадении двух этих параметров, код должен определить такую строку, как последнюю для дальнейшей выборки (копирования). Загводка в том, что удалось, на данный момент, сделать выборку только по дате, одновременно с временем форма выборки работать отказывается. Возможно, дело в неправильно заданных операторах либо параметрах TimeStart/TimeFinish [vba]
Код
If Cells(i, 1) >= DateStart And Cells(i, 2) >= TimeStart Then 'Ищем начальную дату в первом столбце и начальное время во втором
If Cells(i, 1) <= DateFinish And Cells(i, 2) <= TimeFinish Then 'Ищем конечную дату в первом столбце и конечное время
[/vba] Прикладываю два файла: 1 - ый, где функционирует выборка по дате, и выборка времени просто "закомменчена" 2 - ой, где время и дата связаны через And, но не работает выборка, ни по дате, ни по времени Пожалуйста, помогите разобраться! Заранее благодарна. _______________________________________________ Отдельное спасибо Parovoznic за неоценимые помощь и поддержку на всех этапах реализации.Jerdas
2 - ой, где время и дата связаны через And, но не работает выборка, ни по дате, ни по времени
[vba]
Код
If Cells(i, 1) >= DateStart And Cells(i, 2) >= Val(TimeStart) / 24 Then 'Ищем начальную дату в первом столбце и начальное время во втором
' ---------------------- ДОБАВКА (МОЖЕТ И НЕПРАВИЛЬНО ?--------------------------------------------------- If Cells(i, 1) <= DateFinish And Cells(i, 2) <= Val(TimeFinish) / 24 Then
[/vba]
Цитата
2 - ой, где время и дата связаны через And, но не работает выборка, ни по дате, ни по времени
[vba]
Код
If Cells(i, 1) >= DateStart And Cells(i, 2) >= Val(TimeStart) / 24 Then 'Ищем начальную дату в первом столбце и начальное время во втором
' ---------------------- ДОБАВКА (МОЖЕТ И НЕПРАВИЛЬНО ?--------------------------------------------------- If Cells(i, 1) <= DateFinish And Cells(i, 2) <= Val(TimeFinish) / 24 Then
Kuzmich, Добрый вечер! К сожалению, не сработало...:-( Не могли бы Вы глянуть наметанным взглядом на весь код в целом? Примеры я выложила, но могу вставить и в тело сообщения, если необходимо. Благодарю.
Kuzmich, Добрый вечер! К сожалению, не сработало...:-( Не могли бы Вы глянуть наметанным взглядом на весь код в целом? Примеры я выложила, но могу вставить и в тело сообщения, если необходимо. Благодарю.Jerdas
Kuzmich, Спасибо Вам огромное! Прошу прощения, после Вашего комментария, проверила на другом компьютере с другой версией Excel и действительно все формируется как надо. Если Вам не сложно, подскажите, пожалуйста, почему время прописывается именно так [vba]
Код
Val(TimeStart) / 24
[/vba] Не отказалась бы и от ссылочки на литературу, если такая имеется, так как только учусь VBA
Kuzmich, Спасибо Вам огромное! Прошу прощения, после Вашего комментария, проверила на другом компьютере с другой версией Excel и действительно все формируется как надо. Если Вам не сложно, подскажите, пожалуйста, почему время прописывается именно так [vba]
Код
Val(TimeStart) / 24
[/vba] Не отказалась бы и от ссылочки на литературу, если такая имеется, так как только учусь VBA Jerdas
На этом сайте посмотрите и скачайте литературу http://www.excelworld.ru/index/vba/0-12 Время у вас вводится в текстовом формате, поэтому его надо преобразовать в значение. Время в VBA - это дробная часть от 24 часового дня, поэтому делим на 24. Удачи!
На этом сайте посмотрите и скачайте литературу http://www.excelworld.ru/index/vba/0-12 Время у вас вводится в текстовом формате, поэтому его надо преобразовать в значение. Время в VBA - это дробная часть от 24 часового дня, поэтому делим на 24. Удачи!Kuzmich
Kuzmich, Еще раз благодарю Вас за ответ! Внесу небольшую ремарку в предыдущий отзыв: Данный код работает только для "круглых" часов (10:00, 11:00 и тп). Собственно потому у меня ничего в первые разы и не формировалось, так как я вводила часы и минуты.
Kuzmich, Еще раз благодарю Вас за ответ! Внесу небольшую ремарку в предыдущий отзыв: Данный код работает только для "круглых" часов (10:00, 11:00 и тп). Собственно потому у меня ничего в первые разы и не формировалось, так как я вводила часы и минуты.Jerdas
Вводила в TextBox формы, так что в текстовом. Кстати, обнаружилась еще одна немаловажная деталь. Если использовать при введении в ActivForm дату, которая раньше, чем начальная дата из основной таблицы, то время учитывается на следующую найденную с того, которое задано в ActiveForm. Поясню на примере: Имеем входные данные в таблице: Дата Время Значение 1 03.11.2017 10:00 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4 05.11.2017 12:30 5
Выбираем в ActiveForm начальную дату 02.11.2017 / конечную дату 05.11.2017 Выбираем в ActiveForm начальное время 11:00 / конечное время 12:00 В итоге получаем выборку в таком виде:
Дата Время Значение 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4
А должно было быть: Дата Время Значение 1 03.11.2017 10:00 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4 Получается, что конечная дата и время отрабатываются правильно, а начальная ищет совпадение следующим образом, если в первом столбце не найдена дата, то +1 день, если не найдена, то снова +1 день и только после этого ищет еще и совпадение по времени. Получается, что если у меня в исходной таблице будут данные за 3 число с 0:01 по 23:59, то при заданных параметрах 02.11.2017 / 05.11.2017 11:00 / 12:00, выборка начнется не с 03.11.2017 0:01, а с 03.11.2017 11:00. Попробовала задать через Else, но тогда вообще не происходит формирования, но и ошибок не выдает. Просто пустая таблица выборки. Господа форумчане, подскажите, пожалуйста, в чем может быть дело?
Вводила в TextBox формы, так что в текстовом. Кстати, обнаружилась еще одна немаловажная деталь. Если использовать при введении в ActivForm дату, которая раньше, чем начальная дата из основной таблицы, то время учитывается на следующую найденную с того, которое задано в ActiveForm. Поясню на примере: Имеем входные данные в таблице: Дата Время Значение 1 03.11.2017 10:00 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4 05.11.2017 12:30 5
Выбираем в ActiveForm начальную дату 02.11.2017 / конечную дату 05.11.2017 Выбираем в ActiveForm начальное время 11:00 / конечное время 12:00 В итоге получаем выборку в таком виде:
Дата Время Значение 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4
А должно было быть: Дата Время Значение 1 03.11.2017 10:00 1 03.11.2017 11:00 2 04.11.2017 10:00 3 04.11.2017 12:00 4 Получается, что конечная дата и время отрабатываются правильно, а начальная ищет совпадение следующим образом, если в первом столбце не найдена дата, то +1 день, если не найдена, то снова +1 день и только после этого ищет еще и совпадение по времени. Получается, что если у меня в исходной таблице будут данные за 3 число с 0:01 по 23:59, то при заданных параметрах 02.11.2017 / 05.11.2017 11:00 / 12:00, выборка начнется не с 03.11.2017 0:01, а с 03.11.2017 11:00. Попробовала задать через Else, но тогда вообще не происходит формирования, но и ошибок не выдает. Просто пустая таблица выборки. Господа форумчане, подскажите, пожалуйста, в чем может быть дело?Jerdas
If (CDbl(Cells(i, 1)) + CDbl(Cells(i, 2))) >= (CDbl(DateStart) + CDbl(1 / 24 * TimeStart)) Then 'Ищем начальную дату в первом столбце и начальное время во втором If CDbl(Cells(i, 1)) + CDbl(Cells(i, 2)) <= CDbl(DateFinish) + CDbl(1 / 24 * TimeFinish) Then 'Ищем конечную дату в первом столбце и конечное время .Cells(LR, 1).Resize(, 7).Value = Cells(i, 1).Resize(, 7).Value .Cells(LR, 1).NumberFormat = "m/d/yyyy" .Cells(LR, 2).NumberFormat = "[$-F400]h:mm:ss AM/PM" LR = LR + 1 'Увеличили на единичку номер первой свободной строки отчета End If End If
[/vba]
[vba]
Код
If (CDbl(Cells(i, 1)) + CDbl(Cells(i, 2))) >= (CDbl(DateStart) + CDbl(1 / 24 * TimeStart)) Then 'Ищем начальную дату в первом столбце и начальное время во втором If CDbl(Cells(i, 1)) + CDbl(Cells(i, 2)) <= CDbl(DateFinish) + CDbl(1 / 24 * TimeFinish) Then 'Ищем конечную дату в первом столбце и конечное время .Cells(LR, 1).Resize(, 7).Value = Cells(i, 1).Resize(, 7).Value .Cells(LR, 1).NumberFormat = "m/d/yyyy" .Cells(LR, 2).NumberFormat = "[$-F400]h:mm:ss AM/PM" LR = LR + 1 'Увеличили на единичку номер первой свободной строки отчета End If End If
RAN, Здравствуйте!Благодарю Вас за ответ. К сожалению, выдает ошибку type mismatch на участках кода CDbl(1 / 24 * TimeFinish) и CDbl(1 / 24 * TimeStart) С чем это может быть связанно? Возможно, виноват текстовый формат даты?
RAN, Здравствуйте!Благодарю Вас за ответ. К сожалению, выдает ошибку type mismatch на участках кода CDbl(1 / 24 * TimeFinish) и CDbl(1 / 24 * TimeStart) С чем это может быть связанно? Возможно, виноват текстовый формат даты?Jerdas
Я бы на листе "данные" в столбце H сделал колонку с датой и временем (в H4 =A4 + B4 и протянуть вниз) Процедура Report тогда будет такая [vba]
Код
Option Explicit Public DateStart As Date 'Начало периода Public DateFinish As Date 'Конец периода Public TimeStart As String Public TimeFinish As String Public BeginDate As Date Public EndDate As Date
Sub Report() Dim i As Long, LastRow As Long, LR As Long LR = 5 ' строка для нового отчёта будет =5 With Sheets("отчет") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку на втором листе Range(.Cells(5, 1), .Cells(LastRow + 5, 7)).Clear 'Очистили диапазон отчета полностью .Cells(1, 6) = "Сформировано :" & " " & Format(Now, "dd:mm:yy" & " " & "в" & " " & "hh:mm:ss") & "" .Cells(3, 2) = "Отчет с :" & " " & DateStart & " по " & DateFinish & " " 'Заполнили заголовок отчета LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку на первом листе BeginDate = DateStart + Split(TimeStart, ":")(0) / 24 + Split(TimeStart, ":")(1) / 24 / 60 EndDate = DateFinish + Split(TimeFinish, ":")(0) / 24 + Split(TimeFinish, ":")(1) / 24 / 60 For i = 4 To LastRow 'Начали цикл (на первом листе) со строки № 4 по последнюю If Cells(i, 8) >= BeginDate Then 'If Cells(i, 1) >= DateStart And Cells(i, 2) >= Val(TimeStart) / 24 Then 'Ищем начальную дату в первом столбце и начальное время во втором
' ---------------------- ДОБАВКА (МОЖЕТ И НЕПРАВИЛЬНО ?--------------------------------------------------- If Cells(i, 8) <= EndDate Then
[/vba]
Я бы на листе "данные" в столбце H сделал колонку с датой и временем (в H4 =A4 + B4 и протянуть вниз) Процедура Report тогда будет такая [vba]
Код
Option Explicit Public DateStart As Date 'Начало периода Public DateFinish As Date 'Конец периода Public TimeStart As String Public TimeFinish As String Public BeginDate As Date Public EndDate As Date
Sub Report() Dim i As Long, LastRow As Long, LR As Long LR = 5 ' строка для нового отчёта будет =5 With Sheets("отчет") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку на втором листе Range(.Cells(5, 1), .Cells(LastRow + 5, 7)).Clear 'Очистили диапазон отчета полностью .Cells(1, 6) = "Сформировано :" & " " & Format(Now, "dd:mm:yy" & " " & "в" & " " & "hh:mm:ss") & "" .Cells(3, 2) = "Отчет с :" & " " & DateStart & " по " & DateFinish & " " 'Заполнили заголовок отчета LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку на первом листе BeginDate = DateStart + Split(TimeStart, ":")(0) / 24 + Split(TimeStart, ":")(1) / 24 / 60 EndDate = DateFinish + Split(TimeFinish, ":")(0) / 24 + Split(TimeFinish, ":")(1) / 24 / 60 For i = 4 To LastRow 'Начали цикл (на первом листе) со строки № 4 по последнюю If Cells(i, 8) >= BeginDate Then 'If Cells(i, 1) >= DateStart And Cells(i, 2) >= Val(TimeStart) / 24 Then 'Ищем начальную дату в первом столбце и начальное время во втором
' ---------------------- ДОБАВКА (МОЖЕТ И НЕПРАВИЛЬНО ?--------------------------------------------------- If Cells(i, 8) <= EndDate Then