Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 17

Автоматизация. Поиск оптимального решения

12.02.2015, 00:16. Показов 3833. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Исходные данные. Есть книга с n-количеством листов (ограничимся 2мя). На первом листе общая таблица данных. На остальных "выжимка"(копии строк) из общего листа согласно значению столбца F("здание"). Количество записей может меняться. Значения меняются лишь в столбце G ("Срок изготовления")
Уникальные значения: в столбце B, F.
* В книге реализована функция раскидывания строк по соответствующим листам, но она добавляет новые строки в конец таблицы и не отслеживает уникальность.

Задача стоит следующая.
Если на общем листе изменяется значение в столбце G("Срок изг"), то и на другом листе, где есть аналогичная строка должен измениться срок изготовления.


В связи с этим вопрос:
Как правильно, в общих словах, реализовать задуманное?

*Предполагается, что будет необходимо выделить строку(диапазон строк) и построчно сравнивать со строками на др. листе исходя из уникальных значений двух столбцов. И впоследствии замена значения столбца "Срок изг", но думаю будет проще тупо перезаписать всю строку. Но это же не автоматом)
Миниатюры
Автоматизация. Поиск оптимального решения  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2015, 00:16
Ответы с готовыми решениями:

Поиск оптимального решения
Поиск оптимального решения: критерий Ходжа Лемана и оптимистический критерий. Помогите разобраться в коде (написать комментарии) ...

Поиск оптимального решения
Помогите с алгоритмом. Есть матрица смежности - С и матрица веса time, время цикла - sum Условие - на каждом рабочем месте выполняются...

Задача на поиск оптимального решения
Нужна помощь с задачей Т_Т В цистерне N литров молока. Есть бидоны объёмом 1, 5 и 6 литров. Нужно разлить молоко в бидоны так, чтобы все...

24
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
19.02.2015, 03:21
Студворк — интернет-сервис помощи студентам
Andr_K, а как бы Вы решали эту задачу без VBA? Речь не идет о ручном сравнении и удалении. В арсенале Excel есть мощные средства для работы с данными - в данном случае можно использовать Расширенный фильтр по критерию формулы.
Этот код реализует то же действие с помощью VBA. В нем нет циклов, поэтому можете пройти по шагам (F8) и наблюдать, что происходит.
Если измерить время выполнения, то выделение диапазона удаляемых строк (до сообщения) происходит чуть быстрее, чем в коде Hugo121, а само удаление - в 2 раза медленнее. Но все равно это сотые доли секунды. Какой код быстрее на реальных больших данных - смотреть Вам.
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
Sub tt3()
  Dim n&, s$, refStyle
  
  With Application
    refStyle = .ReferenceStyle
    .ReferenceStyle = xlA1
    .ScreenUpdating = False
  End With
    
  n = Sheets(2).[a1].CurrentRegion.Rows.Count
  s = Sheets(2).Name
  
  With Sheets(1)
    .Range("K1:K2").Clear
    .Range("K2").Formula = "=MATCH(B3&""|""&F3,INDEX('" & s _
      & "'!B3:B" & n & "&""|""&'" & s & "'!F3:F" & n & ",),)"
    With .Range("A2:G" & .[a1].CurrentRegion.Rows.Count)
      .AdvancedFilter xlFilterInPlace, Sheets(1).Range("K1:K2")
MsgBox "Посмотрели? Удаляем! :)"
      .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    .Range("K1:K2").Clear
    .ShowAllData
  End With
  
  With Application
    .ReferenceStyle = refStyle
    .ScreenUpdating = True
  End With
End Sub
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 17
19.02.2015, 18:25  [ТС]
Просмотрел я этот алгоритм через F8, впечатляет, но в так и не увидел, что он что либо удалял.
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 17
19.02.2015, 18:58  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Ну ладно, без данных, образно:
Что-то закрались сомнения по применению Словаря.
Мб я некорректно выражаюсь, но мне нужно однозначно определить строку по уникального сочетания значений двух столбцов. А в словаре "ключ" и "значение"
Сегодня лишь в конце рабочего дня удалось заняться этим вопросом. За оставшееся время создал аж два словаря, сравнил между собой =) В "значение" запихнул всю строку). Но так и не удалось удалить по ключу запись из словаря.
В оставшееся время выгрузил в массивы значения в виде строк( длина строк позволяет о длине не думать) и массив ключей.
Попробовал массивы сравнить, все замечательно сравнивается, но опять же не могу удалить теперь из массива значений.


Visual Basic
1
2
3
4
5
6
7
8
 'Сравнение массивов Items
   For m = 1 To UBound(ArrItems)
        For k = 1 To UBound(ArrItems2)
            If ArrItems(m) = ArrItems2(k) Then
                dicData2.Remove (k) ' и не удаляет.
            End If
        Next
    Next
Вложения
Тип файла: rar Z.rar (45.8 Кб, 4 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
19.02.2015, 22:18
В словаре сравнивайте по ключам! А значения в данном случае не важны, я же написал об этом выше - "номер строки в словаре запоминать в данной реализации смысла нет, можно что угодно туда писать, хоть пустую строку."
Тот код в файле вообще не понял - зачем там словари? А вообще из словаря запись должна удаляться - если до этой строки дошло дело. Проверить не могу - нет у меня требуемых файлов...

Добавлено через 6 минут
Работа с словарём ведь такая простая - какие тут могут быть сомнения:
Чуть изменил код - выкинул вообще эти значения, чтоб не мешали:
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
Option Explicit
 
Sub tt()
    Dim a(), i&, multyRange As Range
 
    With CreateObject("scripting.dictionary"): .comparemode = 1
 
        a = Sheets(2).[a1].CurrentRegion.Value
        'заносим ключи в словарь
        For i = 3 To UBound(a): .Item(a(i, 2) & "|" & a(i, 6)) = Empty: Next
 
        a = Sheets(1).[a1].CurrentRegion.Value
        For i = 3 To UBound(a)
            'проверяем на дубликат в словаре
            If .exists(a(i, 2) & "|" & a(i, 6)) Then
                'если есть повтор - собираем диапазон на удаление
                If multyRange Is Nothing Then Set multyRange = Cells(i, 1) Else Set multyRange = Union(multyRange, Cells(i, 1))
            End If
        Next
 
        '        multyRange.Select
        '        MsgBox "Посмотрели? Удаляем! :)"
        multyRange.EntireRow.Delete
    End With
 
End Sub
Код для того примера выше - который 4H.xls

Добавлено через 3 минуты
Да, тут Cells(i, 1) без указания листа - потому что код запускается кнопкой с первого листа!
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 17
21.02.2015, 09:57  [ТС]
С наступающим! )
Благодарю за наглядный правильный код.
Не применю пока не разберусь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2015, 09:57

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

Анализ оптимального решения
Организация выпускает четыре вида пользующихся спросом изделия, причем месячная программа выпуска составляет по 10 изделий тип 1 и 3, 200...

Получение оптимального решения в Scilab
Рацион кормления коров на молочной ферме может состоять из трех продуктов – сена, силоса и концентратов. Эти продукты содержат питательные...

Выбор оптимального решения по нескольким критериям
Есть несколько решений, каждое решение оценивается по 4 параметрам A, B, C, D. Причем A самый главный параметр, B второстепенный и тд. ...

Выбор оптимального метода для решения системы уравнений
Возможно ли решить подобную систему уравнений? относительно W1, W2, ... W18. Причем количество уравнений в системе не ограничивается...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru