С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
1

Сравнение дат

17.05.2016, 17:21. Показов 4329. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый, день. Подскажите пожалуйста как можно решить поставленную задачу.

Для каждой записи CAMA нужно проверить ближайшие ряды с записями MLS.
Сравнить дату CAMA i дату ближайшей по дате записи МLS.
Если разница в датах меньше или ровна 10 дням, свести записи вместе и соединить ячейки в столбце H указав в объединённой ячейке букву М.
Вывести разницу в днях и в годах между парой значений.

Если запись MLS уже является частью пары оно не может быть использовано повторно для другой записи CAMA.

подскажите как решить задачу? при помощи каких инструментов?

Спасибо заранее.Пример 2.xlsx
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2016, 17:21
Ответы с готовыми решениями:

сравнение дат
Привет! Помогите с задачкой. в 2 текстбокса через маску пользователь вводит даты формата 00.00.00...

Сравнение дат
Подскажите кто-нибудь пожалуйста: задание снять показания в течении 7 последних дней при сравнении...

Сравнение дат
Добрый день! Помогите пожалуйста, решить такой вопрос. Нужно, чтобы при нажатии в форме на...

Сравнение дат и автоподастановка данных
Добрый день! Помогите, пожалуйста, решить такой вопрос (пример во вложении). На первом листе...

10
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
17.05.2016, 17:25  [ТС] 2
Пример1.xls
0
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
17.05.2016, 18:19 3
При помощи мозгов и языка VBA, других особых инструментов нет.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub CAMA_MLS_группировать()
    Dim i&, j&, EndRow&, A
    EndRow = Cells(Rows.Count, 1).End(xlUp).Row
    A = Range("A1:E" & EndRow + 1).Value
    For i = 3 To EndRow
        If A(i, 1) = "CAMA" Then
            For j = i - 1 To i + 1 Step 2
                If A(j, 1) = "MLS" And Cells(j, 6).MergeCells = False Then
                    If IsDate(A(i, 5)) And IsDate(A(j, 5)) Then
                        If Abs(A(i, 5) - A(j, 5)) <= 10 Then
                            Range(Cells(i, 6), Cells(j, 6)).Merge
                            Range(Cells(i, 7), Cells(j, 7)).Merge
                            Range(Cells(i, 8), Cells(j, 8)).Merge
                            Cells(i, 6) = Abs(A(i, 5) - A(j, 5))
                            Cells(i, 7) = DateDiff("yyyy", A(i, 5), A(j, 5))
                            Cells(i, 8) = "М"
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    Next
End Sub
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
17.05.2016, 19:10  [ТС] 4
Спасибо за то что ответили. Макрос не совсем правильно работает. Например он не соединил ряды подчеркнутые красным и синим хотя они попадают под требования (разница в датах ровна или ниже 10 дней). Можно ли его приспособить к таблице с заголовками а не только к диапазону?
Пример.xlsx
0
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
18.05.2016, 09:41 5
Если объединять по несколько строк CAMA и несколько строк MLS в один блок, то надо подробнее описать алгоритм.
Особенно в части противоречия с правилом:
Если запись MLS уже является частью пары оно не может быть использовано повторно для другой записи CAMA
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
18.05.2016, 09:55  [ТС] 6
Можно ли модифицировать макрос так что бы он работал не для диапазона а для таблицы с заголовками.
1. При нахождение значения КАМА в столбце Clasiffication вывести М1
2. Поиск ближайшего значения МЛС в диапазоне 10 дней от даты КАМА
3. Вывод для найденного значения МЛС в столбце Classification М1 (Таким образом создать пару МЛС/КАМА с индикатором М1 не объеденяя ячейки, МЛС с заполненной ячейкой Classification не должен использоваться повторно.)
4. Перейти к следующему значению КАМА вывести в столбце Classification M2 создав пару КАМА/МЛС с индикатором М2
5. Для значений КАМА которые не имеют пары МЛС в интервале 10 дней вывести значение P если значение находится в интервале 12 месяцев от ПОСЛЕ даты ближайшего значения КАМА у которого есть пара
5. Для значений КАМА которые не имеют пары МЛС в интервале 10 дней вывести значение H если значение находится в интервале 12 месяцев от ПЕРЕД датой ближайшего значения КАМА у которого есть пара
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
18.05.2016, 10:04  [ТС] 7
Графический пример
Сравнение дат
0
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
18.05.2016, 11:49 8
Объединение ячеек в базе - всегда плохая идея.
Макрос работает с таблицей.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Sub CAMA_MLS_пометить()
    Dim i&, j&, k&, d%, minJ&, minDelta%, Delta%, EndRow&, A
    EndRow = Cells(Rows.Count, 1).End(xlUp).Row
    Cells.UnMerge
    A = Range("A1:H" & EndRow).Value
    For d = 1 To 11
        For i = 2 To EndRow
            minDelta = d
            If A(i, 1) = "CAMA" And Trim(A(i, 8)) = "" Then
                For j = 2 To EndRow
                    If A(j, 1) = "MLS" And Trim(A(j, 8)) = "" Then
                        Delta = Abs(A(i, 5) - A(j, 5))
                        If Delta < d Then
                            If minDelta > Delta Then minDelta = Delta: minJ = j
                            If Delta = 0 Then Exit For
                        End If
                    End If
                Next
                If minDelta < d Then
                    k = k + 1
                    A(i, 8) = "M" & k 'M латинское
                    A(minJ, 8) = "M" & k
                    A(i, 6) = minDelta
                    A(minJ, 6) = A(i, 6)
                    A(i, 7) = Abs(DateDiff("m", A(i, 5), A(minJ, 5))) ' Месяцы, как в таблице , а не в задании
                    A(minJ, 7) = A(i, 7)
                End If
            End If
        Next i
    Next d
    For i = 2 To EndRow
        If A(i, 1) = "CAMA" And Trim(A(i, 8)) = "" Then
            minDelta = 1000
            For j = 2 To EndRow
                If A(j, 1) = "CAMA" And Trim(A(j, 8)) <> "" Then
                    Delta = Abs(A(i, 5) - A(j, 5))
                    If minDelta > Delta Then minDelta = Delta: minJ = j
                    If Delta = 0 Then Exit For
                End If
            Next
            If minDelta < 1000 Then
                If A(i, 5) >= A(minJ, 5) And A(i, 5) < DateAdd("m", 12, A(minJ, 5)) Then
                    A(i, 8) = "P" ' латинское
                ElseIf A(i, 5) < A(minJ, 5) And A(i, 5) > DateAdd("m", -12, A(minJ, 5)) Then
                    A(i, 8) = "H" ' латинское
                End If
            End If
        End If
    Next
    Range("A1:H" & EndRow).Value = A
End Sub
Для индикаторов P, H не определено что ставить, если дата CAMA совпадает с CAMA ближайшей пары.
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
18.05.2016, 12:26  [ТС] 9
Макрос работает почти правильно

1. В столбце H есть буквы "М" без цифры.
2. В ячейке "H15" стоит значение "Р" хотя должно быть "М5" так как оно следующее после заполненной ячейки КАМА М35.
3. Для дат что совпадают с датой пары вывести букву F.

Как модифицировать макрос чтобы он работал для таблицы в который нет объеденных ячеек?

Могу я вас как то отблагодарить ?
0
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 7
18.05.2016, 12:28  [ТС] 10
Пример.xls
0
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
18.05.2016, 13:44 11
М без цифры осталось из замусоренного примера, предварительно надо очистить и разрупировать ячейки в столбцах F:H.
Неочищенная зона приводит к неправильным результатам.
Очищение внес в макрос.
Последние макросы работают с таблицами, где нет объединенных ячеек.
Если нужна не минимальная разница дат, а обработка в порядке следования строк, то это легче.
Но теперь не всегда разница дат в паре будет минимальна:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sub CAMA_MLS_пометить()
    Dim i&, j&, k&, minJ&, minDelta%, Delta%, EndRow&, A
    EndRow = Cells(Rows.Count, 1).End(xlUp).Row
    Intersect(ActiveSheet.UsedRange, Columns("F:H")).Offset(1, 0).ClearContents
    A = Range("A2:H" & EndRow).Value
    EndRow = EndRow - 1
    For i = 1 To EndRow
        minDelta = 1000
        If A(i, 1) = "CAMA" And Trim(A(i, 8)) = "" Then
            For j = 1 To EndRow
                If A(j, 1) = "MLS" And Trim(A(j, 8)) = "" Then
                    Delta = Abs(A(i, 5) - A(j, 5))
                    If Delta < 11 Then
                        If minDelta > Delta Then minDelta = Delta: minJ = j
                        If Delta = 0 Then Exit For
                    End If
                End If
            Next
            If minDelta < 1000 Then
                k = k + 1
                A(i, 8) = "M" & k 'M латинское
                A(minJ, 8) = "M" & k
                A(i, 6) = minDelta
                A(minJ, 6) = A(i, 6)
                A(i, 7) = Abs(DateDiff("m", A(i, 5), A(minJ, 5))) ' Месяцы, как в таблице , а не в задании
                A(minJ, 7) = A(i, 7)
            End If
        End If
    Next i
    For i = 1 To EndRow
        If A(i, 1) = "CAMA" And Trim(A(i, 8)) = "" Then
            minDelta = 1000
            For j = 1 To EndRow
                If A(j, 1) = "CAMA" And Trim(A(j, 8)) <> "" Then
                    Delta = Abs(A(i, 5) - A(j, 5))
                    If minDelta > Delta Then minDelta = Delta: minJ = j
                    If Delta = 0 Then Exit For
                End If
            Next
            If minDelta < 1000 Then
                If A(i, 5) = A(minJ, 5) Then
                    A(i, 8) = "F"
                ElseIf A(i, 5) > A(minJ, 5) And A(i, 5) < DateAdd("m", 12, A(minJ, 5)) Then
                    A(i, 8) = "P" ' латинское
                ElseIf A(i, 5) < A(minJ, 5) And A(i, 5) > DateAdd("m", -12, A(minJ, 5)) Then
                    A(i, 8) = "H" ' латинское
                End If
            End If
        End If
    Next
    Range("A2:H" & EndRow).Value = A
End Sub
Умная таблица теперь не исчезает.

yandex деньги RUB 41 001 669 949 812
Webmoney RUB R119252510320
Webmoney US Z370921952742
0
18.05.2016, 13:44
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2016, 13:44
Помогаю со студенческими работами здесь

Сравнение дат и вывод диапазона в ячейки
Добрый день. Сижу разбираюсь тут с основами VBA Excel. Прилетела задача на работе. В общем смысл...

Сравнение дат с текущей в системе и вывод значений
Добрый день! Пытаюсь длительное время решить задачу: Нужно сравнить прошедшие и прогнозные даты в...

Сравнение дат с сегодняшней, копирование и перенос данных
Добрый день! Прошу помочь в решении задачи: Есть таблица с текстовыми данными и датами. По...

Условие макроса сравнение дат и времени работает не корректно.Как это исправить?
Sub Макрос_1() For i = 5 To Sheets(&quot;Ввод Данных&quot;).Range(&quot;A&quot; &amp; Rows.Count).End(xlUp).Row If...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Администрирован­­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru