Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208

Поиск и сравнение значений в столбцах по двум параметрам

06.12.2012, 16:18. Показов 7228. Ответов 19

Студворк — интернет-сервис помощи студентам
Добрый день.
Помогите с проблемой. В VBA не силен, но очень СРОЧНО нужно. Буду рад любой помощи.
Задача:
Есть колонки в excele: Номер заказ 1, Сумма 1, Номер заказа 2, Сумма 2, Разница.
Необходимо найти в столбце "Номер заказа 2" значение из "Номер заказ 1", когда значение найдено, нужно сравнить сумму найденного заказа из столбца "Номер заказ 1" с суммой в столбце "Номер заказа 2". Если суммы разные, тогда записать разницу в столбце "Разница" напротив обрабатываемого заказа.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2012, 16:18
Ответы с готовыми решениями:

Поиск значения по двум двум параметрам (вертикали и горизонтали)
Добрый день! Прошу, пожалуйста, помощи. Никак не могу понять ,какие формулы необходимо применить. Имеем: таблицу шашечного...

Поиск по двум параметрам
Доброго дня. Имеется один список (TStringList) и два искомых значения к примеру 12345 (1 значение) Ddv (2 значение) мне...

Поиск по двум параметрам
Здравствуйте! Помогите решить следующую проблему. Необходим поиск по двум параметрам в таблице В ячейке А3 задаётся поиск по шкале...

19
1250 / 408 / 52
Регистрация: 14.06.2009
Сообщений: 629
06.12.2012, 16:36
Зачем здесь VBA? В экселе есть ф-ция ВПР, весьма вероятно её окажется достаточно для этой задачи.
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
06.12.2012, 16:41  [ТС]
Нужно что б тетечка нажала на кнопочку и у нее появился результат. А то так очень сложно для нее(

Добавлено через 3 минуты
я уже 3 день сижу. может это и легкая задачка, но я с VBA на большом ВЫ(((
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
06.12.2012, 17:45
hoot, выкладывайте книгу Excel с примерными данными и поясните, что нужно сделать.
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
06.12.2012, 19:00  [ТС]
Вот файлик. Необходимо найти заказ из первого столбца в третем, когда заказ найден сравнить суммы этих заказов, после чего записать в столбце F номер заказа и разницу между сумами. Файлик прикреплен ниже
Вложения
Тип файла: xlsx Book1.xlsx (10.0 Кб, 69 просмотров)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
06.12.2012, 19:45
hoot, только сейчас внимание обратил, вам нужно именно решение с помощью макросов, хоть ваша задача, я так понимаю, решается простой формулой?
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
06.12.2012, 19:53  [ТС]
можно хоть формулу, а то что-то я уже закипел(((
мне сказали что через макрос это нужно сделать, но я с VBA практически не работал. только университетские пару месяцев(

Добавлено через 40 секунд
Если можете, буду вам очень благодарен если вы мне все таки через макрос. отдать и забыть про этот вынос мозга(((
0
1250 / 408 / 52
Регистрация: 14.06.2009
Сообщений: 629
06.12.2012, 20:47
Формулами, например, так.
Вложения
Тип файла: xlsx Book1.xlsx (9.8 Кб, 106 просмотров)
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
07.12.2012, 02:41  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Спасибо, но соль вся в том, что нужно без ручной сортировки. данные в хаосе. И они так будут приходить всегда.((( Я отсортировать смогу, но те кто будет пользоваться этим, будут или забывать или лень им или еще какая-то причина.
По этой причине и нужно что б с начало был авто поиск , а потом сравнение(
Вообщем я думаю, вы и сами понимаете каких трудов стоит "научить" женский коллектив как правильно нужно подготавливать инфу перед работой. И я уже не буду говорить о ситациях, на подобии: "...у мен не работает мышка! А она у вас подключина к компу? нет! Тогда подключите!..."
0
1250 / 408 / 52
Регистрация: 14.06.2009
Сообщений: 629
07.12.2012, 03:32
hoot, не нужна ручная сортировка.
Просто в вашем файле номера заказов были вообще друг напротив друга, так как-то неинтересно.
Поэтому я и "перемешал" третий и четвертый столбцы. То, что данные в третьем столбце оказались отсортированы по возрастанию, просто случайное совпадение, не обратил внимания. Но сортировать ничего не нужно.
Вложения
Тип файла: xlsx Book1.xlsx (9.7 Кб, 89 просмотров)
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
07.12.2012, 18:04  [ТС]
Спасибо, работает корректно. Но показал Ваш вариант, сказали что много ручной работы и по этому нужен макрос.
И снова я там откуда начинали((((

Добавлено через 1 час 0 минут
Кто-то может написать скрипт для этой задачки?
0
1250 / 408 / 52
Регистрация: 14.06.2009
Сообщений: 629
10.12.2012, 15:48
Такой вариант.

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 test()
Dim mass(), ws As Worksheet, dc, i As Long
Application.ScreenUpdating = False
Set ws = ActiveSheet
mass() = ws.Range("A1").CurrentRegion.Value
Set dc = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(mass, 1)
    dc.Add mass(i, 3), mass(i, 4)
Next
For i = 2 To UBound(mass, 1)
    If dc.exists(mass(i, 1)) Then
        If mass(i, 2) = dc.Item(mass(i, 1)) Then
            mass(i, 2) = ""
        Else
            mass(i, 2) = mass(i, 2) - dc.Item(mass(i, 1))
        End If
    Else
        mass(i, 2) = "Íîìåð çàêàçà íå íàéäåí"
    End If
    ws.Range("F" & i).Value = mass(i, 1)
    ws.Range("G" & i).Value = mass(i, 2)
Next
Application.ScreenUpdating = True
End Sub
1
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
10.12.2012, 16:01  [ТС]
Спасибо за помощь.

Правда я сам уже сделал. Также еще дописал, в случаи нескольких заказов с одним номером, их суммы суммируются.

Вот код, кому нужно:

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 CompareSub()
 
Dim ACell As Range
Dim CCell As Range
Dim i As Integer
 i = 0
    For Each ACell In Range("A2", Cells(Rows.Count, 1).End(xlUp))
    For Each CCell In Range("C2", Cells(Rows.Count, 3).End(xlUp))
         If CCell.Value = ACell.Value Then
            a = 0
            b = 0
            a = ACell.Offset(0, 1)
            b = CCell.Offset(0, 1)
           
            If i = 0 Then
            CCell.Offset(0, 3) = b - a
            End If
            
            If i > 0 Then
            CCell.Offset(0, 3) = CCell.Offset(0, 3) - a
            'CCell.Offset(0, 4) = CCell.Offset(0, 4) + CCell.Offset(0, 3)
            End If
            CCell.Interior.Color = 5296274
            i = i + 1
         End If
      Next
      Next
  
 
End Sub
Кстате, если у кого есть идеи по оптимизации, пишите!
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
13.12.2012, 13:29  [ТС]
Люди, а кто-то может помочь с реализацией этой же задачи, но если загружаются данные с двух файлов.
тобишь в одном файле номер заказа и цена и в другом файле номер заказа и цена. Если возможно что б указывалось на первой странице путь к этим файлам, а на второй результат сранения.

Помогите пожалуйста,очень нужно.
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
14.12.2012, 16:05  [ТС]
Кто-то может помочь. ОЧЕНЬ нужно. плз.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
14.12.2012, 18:22
Будет быстро/оптимально полностью на словаре и массивах, примерно как Все имена заняты написал, но ещё "массивнее".
Но мне не вполне ясна задача - нужно выводить все номера или только те, у кого разница?
Что делать с теми, которые только на одной стороне?
Если брать диапазоны из разных файлов - как должен выглядеть процесс? Самое простое - юзер сам открывает файлы и мышью выделяет сравниваемые диапазоны. Но это кажется тёткам будет сложно...
Если покажете два исходных файла и результат в третьем, и желательно пожелания по процедуре "взятия" данных - может быть через пару дней получите код (говорю про себя, сегодня точно ничего делать не буду )
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
16.12.2012, 15:02  [ТС]
Нужно что б на первой странице пользователь указывал путь к двум файлам, которые нужно сравнить.
После чего подгружается два файла и сравнивается первый столбец в каждом файле (это сравнение номера заказа) если найдено совпадение, то эта строка записывается в наш файл. После этого в создается новый столбец в нашей ниге, где пишется разница сумм из этих двух файлов(пусть будет второй столец в файлах)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
16.12.2012, 17:12
Цитата Сообщение от Hugo121 Посмотреть сообщение
Если покажете два исходных файла и результат в третьем...
.....
0
 Аватар для hoot
101 / 22 / 7
Регистрация: 10.11.2010
Сообщений: 208
17.12.2012, 12:38  [ТС]
Вот два файла. которые хочу подгрузить. Код сравнения приведен выше. но там сравнение происходит когда данные находятся на одном листе активной книги.
Сможете помочь?
Вложения
Тип файла: xls f1.xls (27.5 Кб, 14 просмотров)
Тип файла: xls f2.xls (38.5 Кб, 11 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
17.12.2012, 13:55
Просил ведь - покажите результат.
Пока представляю так - в третьем файле пишутся строки
Номер заказа разница
Вопрос - что от чего отнимать, или брать абсолютное значение?
Как отображать те позиции, которые только в одном файле - или такие игнорировать (в примере таких нет).
Что делать, если вдруг номера заказов повторяются?


Ну а пока так - в активном в момент запуска кода файле в A1 и A2 пути к файлам ("Сумма" на "Разница" не менял):

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
Option Explicit
 
Sub compare()
    Dim a(), i&, ii&
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
 
        With CreateObject("scripting.dictionary")
 
            With GetObject([a1])
                a = .Sheets(1).[a1].CurrentRegion.Value: .Close 0
            End With
            For i = 2 To UBound(a): .Item(a(i, 1)) = a(i, 2): Next
 
            With GetObject([a2])
                a = .Sheets(1).[a1].CurrentRegion.Value: .Close 0
            End With
            ii = 1
            For i = 2 To UBound(a)
                If .exists(a(i, 1)) Then
                    ii = ii + 1: a(ii, 1) = a(i, 1)
                    a(ii, 2) = .Item(a(i, 1)) - a(i, 2)
                End If
            Next
 
        End With
        If ii > 1 Then Workbooks.Add(1).Sheets(1).[a1].Resize(ii, 2) = a
 
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2012, 13:55
Помогаю со студенческими работами здесь

Вывод значений по двум параметрам из таблицы
Здравствуйте. Подскажите пожалуйста как мне сделать так, чтобы после заполнения работ по данному оборудованию по датам, на втором листе я...

Поиск в таблице БД по двум параметрам
Здравствуйте! подскажите пожалуйста, как проверить есть ли в таблице базы акссес строка в которой числовое поля id=Edit1, Kdef= Edit2 ?

Поиск через grep по двум параметрам
Как в одной строке записать, чтобы grep искал в файлах строки "#include <soubor>" и "#include "soubor""?

Макрос слияния строчек по двум параметрам ячеек с суммированием значений
Уважаемые Гуру по Excel и VBA! Прошу помощи по написанию макроса для данного файла. Есть файл, в нем макрос, но объединение и суммирование...

Поиск ячейки по двум параметрам и запись в нее данных
Ребята, прошу помощи! Наверняка уже есть решение по моей задачке. Бросьте ссылочку пожалуйста или решение. Во вложенном файле пример,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru