Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail


           Интенсив по Python 3-5 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2013, 00:23   #1
alexp21
Пользователь
 
Регистрация: 24.09.2011
Сообщений: 25
По умолчанию Обновление дат при помощи макроса

Здравствуйте, помогите написать макрос для проведения расчетов в таблице, нужно выявить подходящие ячейки и подставить к ним обновленные даты.

Мы имеем 3 таблицы с данными:
1 Таблица – Столбец «А» – ID, столбец «В» – их значения.
2 Таблица – Столбец «F» – ID, столбец «H» – Старые даты.
3 Таблица – Столбец «J» – значения ID, столбец «K» – Новые даты.

Нужно сравнить значение ID из столбца «J» со значением ID из столбца «B» найти схожие и таким образом выявить их ID из столбца «А», затем сравнить наши ID с ID из столбца «F», найти схожие и сверить даты из столбца «К» со столбцом «H», если даты не совпадают, подставить из столбца «К».
Если какие либо данные мы не находим, «ID», «значения ID» либо «Дату», ничего не меняем, просто идем дальше.

Пример:
Берем первое значение ID из столбца «J» – «А28», ищем схожее значение в столбце «B», выявляем его ID из столбца «А» = «37», ищем этот ID в столбце «F» и сверяем даты, старая дата в столбце «Н» для нашего ID = «2013-02-26 00:00:00.000», а новая «15.09.2013», необходимо подставить новую дату в формате старой, и в итоге получить: «2013-09-15 00:00:00.000».

Буду Вам очень признателен за помощь. Спасибо!
Вложения
Тип файла: rar id.rar (7.7 Кб, 10 просмотров)

Последний раз редактировалось alexp21; 26.09.2013 в 00:24. Причина: файл
alexp21 вне форума Ответить с цитированием
Старый 26.09.2013, 11:49   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,163
По умолчанию

Сделал макросом, если что. Жду по договорённости
Но есть одна тонкость - формат этих изменяемых дат. Нужно в виде строки или даты? Можно или так, или так, Можно кодом, а можно сперва столбцу задать формат вручную - там пока тупо стоит General/Основной.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.09.2013, 14:56   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,163
По умолчанию

Долетело
Код:
Option Explicit

'http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=51436
'собираем словарь ID из А с значениями без пробелов, и словарь "Значение ID" (без пробелов) из J с датами.
'Затем цикл по массиву F-H, ищем в словаре ID, если есть - получаем из второго словаря дату, преобразуем-заменяем.

Sub voznja_s_datami()
    Dim a(), i&, t$, td As Date
    Dim idDic As Object, idznDic As Object

    Set idDic = CreateObject("Scripting.Dictionary"): idDic.comparemode = 1
    Set idznDic = CreateObject("Scripting.Dictionary"): idznDic.comparemode = 1


    'собираем словарь ID из А с значениями без пробелов
    a = Range([B2], Range("A" & Rows.Count).End(xlUp)).Value
    For i = 1 To UBound(a)
        idDic.Item(a(i, 1)) = Replace(a(i, 2), " ", "")
    Next

    'и словарь "Значение ID" (без пробелов) из J с датами.
    a = Range([K2], Range("J" & Rows.Count).End(xlUp)).Value
    For i = 1 To UBound(a)
        'idznDic.Item(a(i, 1)) = a(i, 2)'это если изначально в данных нет пробелов
        idznDic.Item(Replace(a(i, 1), " ", "")) = a(i, 2)    'это если есть
    Next

    'Затем цикл по массиву F-H, ищем в словаре ID, если есть - получаем из второго словаря дату, преобразуем-заменяем.
    a = Range([H2], Range("F" & Rows.Count).End(xlUp)).Value
    For i = 1 To UBound(a)
        If idDic.exists(a(i, 1)) Then
            t = idDic.Item(a(i, 1))
            If idznDic.exists(t) Then
                td = idznDic.Item(t)
                If td > 0 Then
                    t = Format(td, "yyyy-mm-dd hh:mm:ss.000")
                    't = Format(td, "yyyy-mm-dd") & " 00:00:00.000" 'или так, если всегда в конце нужны нули
                    a(i, 3) = t
                End If
            End If
        End If
    Next

    [H2].Resize(UBound(a), 1).NumberFormat = "yyyy-mm-dd hh:mm:ss.000"
    '[H2].Resize(UBound(a), 1).NumberFormat = "@"'если нужен текст, а не дата

    [F2].Resize(UBound(a), UBound(a, 2)).Value = a

End Sub
Вариант для двух случаев формата - ненужное переключить.
Файл могу закинуть вечером.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ

          Оплата за обучение в Kata Academy только после твоего трудоустройства в IT!
          Начни карьеру Middle Java-разработчика, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание макроса для обновление прайса Magicmax Microsoft Office Excel 5 21.06.2010 19:59
Иморт данных из SQL в Excel при помощи QueryTable VBS, Иморт данных из SQL в Excel при помощи QueryTable Valdocco Microsoft Office Excel 1 16.07.2009 21:50
Проблема при открытии базы при помощи ADO SlavaSH БД в Delphi 21 30.06.2009 16:51
Формирование списка дат при помощи формул EducatedFool Microsoft Office Excel 10 17.03.2009 09:30
Изменить цвет при помощи макроса А. Долматов Microsoft Office Excel 5 26.09.2007 21:02