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

Необходимо удаление/выделение дублей в таблице

16.08.2012, 12:26. Показов 4641. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день.

Очень нужна помощь таких гуру программирования, как участники данного форума.

Сразу прошу прощения, если решение моей задачи уже где-то есть и я его не увидел ... но я честно искал весь день на данном форуме решение и подходящего не нашёл.

Проблема в следующем есть таблица с данными остоящая из 6ти колонок.

Что я делаю на протяжении уже нескольких суток (что хотелось бы иметь возможность делать автоматом)

1. Ищу в колонке F "Увеличение" сумму Х (кликаю мышкой зажав ctrl)
2. Ищу в колонке G "Уменьшение" сумму Х (кликаю мышкой зажав ctrl)
3. Выделяю цветом / Удаляю
4. Ищу в колонке F "Увеличение" сумму Y (кликаю мышкой зажав ctrl)
5. Ищу в колонке G "Уменьшение" сумму Y (кликаю мышкой зажав ctrl)
6. Выделяю цветом / Удаляю

и т.д.

Суть этих действий.

Понятно что данная таблица это баланс определенного клиента.
Есть приход, есть расход, есть сумма на конец.

Моя задача найти закравшийся дисбаланс. Либо лишний приход ... либо лишний расход.

В основном приход и расход равны. Но бывает когда например расход (стоимость товара 12 т.р.) а приход это например 3550 и 8450.


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

Все решения которые есть в интернете, либо подразумевают отсутствие пустых ячеек, либо необходимо фильтровать данные.

МНЕ ЭТОГО ДЕЛАТЬ НЕЛЬЗЯ !!!

Иначе я не смогу потом найти по какой накладной данный дисбаланс.



Пример файла и то что я делаю уже не первые сутки во вложении (точнее вырезка. т.к. сам файл это порядка 45 тысяч строк).

Буду ОООчень признателен за помощь...помогите пож-та ...
Вложения
Тип файла: xlsx Баланс_клиента.xlsx (24.1 Кб, 31 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2012, 12:26
Ответы с готовыми решениями:

Удаление текста после ALT+Enter либо удаление дублей в массиве
подзадача заключается в том, чтобы после определенного символа в моем случае это "ALT+Enter" удалить все слова внутри ячейки....

Подскажите программы удаления сложных дублей в таблице бд
Уважаемые форумчане! Подскажите пожалуйста по такой проблеме. Я работаю в НКО, есть картотека лиц, но в ней очень много ошибок из-за...

Удаление дублей
Как с наименьшей трудоемкостью удалить дубли из таблицы InterBase. Т.е. имеем пары строк с совершенно одинаковыми данными - надо из этой...

39
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
17.08.2012, 12:07
Студворк — интернет-сервис помощи студентам
Хотя я кажется ошибся. Если скрывать строку или делать её высоту 0 пикселов, то это одно и то же.
0
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 12:22  [ТС]
Апострофф, я сейчас сделаю на примере 2х месяцев ... потому как если весь файл обрабатывать, то эксель вешается (не доступен) минут на 20. (на всякий случай пишу ... может в этом какая-то причина).

Добавлено через 10 минут
Апострофф, вот фалик с ошибками ... оьрабатывал последним запросом.

Синим выделена ошибка, две трети балансы видны, а треть была в скрытых ячейках (я их сделал узкими).

Зелёным выделил дубли которые почему-то не отошли автоматом.

А жёлтым, если возможно чтобы подобные дубли тоже убирались ... если это сильно усложнит задачу ... то не нужно ... я их и так поубираю.
Вложения
Тип файла: rar Балансы_клиента_9-10.rar (169.2 Кб, 7 просмотров)
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
17.08.2012, 12:26
Попробуй так:
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
Sub BALANS()
 
   Dim Debit: Set Debit = CreateObject("Scripting.Dictionary")  ' Создаем словарь
   Dim Kredit: Set Kredit = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Dim M
M = Range(Cells(8, 3), Cells(Cells(Rows.Count, 3).End(xlUp).Row, 7))
For r = 1 To UBound(M)
    If M(r, 4) <> "" Then
        If Debit.exists(M(r, 4)) Then
            Debit.Item(M(r, 4)) = Debit.Item(M(r, 4)) + 1
        Else
            Debit.Add M(r, 4), 1
        End If
    End If
Next r
 
For r = 1 To UBound(M)
    If M(r, 5) <> "" Then
        If Debit.exists(M(r, 5)) Then
             If Debit.Item(M(r, 5)) > 1 Then
             Debit.Item(M(r, 5)) = Debit.Item(M(r, 5)) - 1
             Else
             Debit.Remove (M(r, 5))
             End If
        Else
            Kredit.Add M(r, 5), 1
        End If
    End If
Next r
M = Debit.keys
 
s = "Непогашенные суммы Увеличения:" & vbCrLf
For r = 0 To UBound(M) - 1
s = s & M(r) & vbCrLf
Next r
 
s = s & "Непогашенные суммы Уменьшения:" & vbCrLf
M = Kredit.keys
For r = 0 To UBound(M) - 1
s = s & M(r) & vbCrLf
Next r
 
MsgBox s, 64, ""
End Sub
Изображения
 
1
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 12:31  [ТС]
Alex77755, вот такая ошибка
Миниатюры
Необходимо удаление/выделение дублей в таблице  
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
17.08.2012, 12:36
попробуй файл
Вложения
Тип файла: rar Баланс_клиента.rar (24.3 Кб, 9 просмотров)
0
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
17.08.2012, 12:44
Удалил сообщение.
0
 Аватар для Апострофф
9912 / 3935 / 743
Регистрация: 11.10.2011
Сообщений: 5,916
17.08.2012, 12:48
Цитата Сообщение от RIMS`V Посмотреть сообщение
Зелёным выделил дубли которые почему-то не отошли автоматом.
Потому что в первом примере данные начинались с 8-й строки, а теперь с 7-й!
Как-то определиться надо! Исправь в коде 8 на 7.

634,00 из ячейки G36 макрос нашел в F2817 и обе скрыл, а вот для ячейки G2811 пары уже не нашлось...

То есть алгоритм наш неверен?
0
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 12:50  [ТС]
Alex77755, применяю твой запрос к балансу за 2 месяца получаю следущее
Миниатюры
Необходимо удаление/выделение дублей в таблице  
0
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 12:55  [ТС]
Busine2012, процедура завершена ... и всё в файле изминений никаких.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
17.08.2012, 12:55
В макросе не указан лист. В образце был всего один лист. Макрос работает на активный.
Для точности необходимо давать точные исходные данные или дорабатывать макрос самому
1
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
17.08.2012, 12:58
Код написан к книге, выложенной в сообщении #1.
В столбцах F и G не должно быть формул.
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
53
54
55
Option Explicit
Sub Procedure_1()
 
    'Здесь нужно указать, с какой строки начинаются данные.
    Const lStartRow As Long = 8
 
    Dim lLastRow As Long
    Dim i As Long
    Dim rFind As Excel.Range
    
    'Определяем последнюю заполненную строку.
    'Последнюю строку определяю по столбцу "B".
    'Действие кода будет аналогично, если сделать активной
    'ячейку "B7" и нажать сочетание клавиш Ctrl+стрелка вниз.
    lLastRow = Range("B7").End(xlDown).Row
    
    'Скрываем мерцание экрана.
    Application.ScreenUpdating = False
    
    'Двигаемся сверху вниз по столбцу "F".
    'Просматриваем каждую ячейку столбца "F" и ищем
    'одинаковое числов в столбце "G".
    For i = 8 To lLastRow Step 1
        
        'Принимаем во внимание только ячейки с числами.
        'Считается, что пустые ячейки тоже содержат число (ноль),
        'поэтому нужно учесть, что ячейка может быть пустой.
        
        If IsNumeric(Cells(i, "F").Value) = True And _
                IsEmpty(Cells(i, "F").Value) = False Then
                
            'Осуществляем поиск в столбце "G".
            'After:=Range("G" & lLastRow) - чтобы поиск начинался с первой ячейки
            'в заданном диапазоне, а не со второй.
            Set rFind = Range("G" & lStartRow & ":G" & lLastRow).Find(What:=Cells(i, "F").Formula, _
                    After:=Range("G" & lLastRow), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
                    SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
                
            'Если совпадение найдено, то скрываем 2 строки.
            If Not rFind Is Nothing Then
                Rows(i).Hidden = True
                Rows(rFind.Row).Hidden = True
            End If
                    
        End If
    
    Next i
    
    'Включаем обновление монитора.
    Application.ScreenUpdating = True
    
    'Сообщение, что работа завершена.
    MsgBox "Работа завершена!", vbCritical
 
End Sub
Чтобы не учитывать форматирование (в ячейках формат чисел установлен, что мешает поиску), нужно писать другой код.
1
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 13:01  [ТС]
Апострофф, все я понял ... он нашел внизу в колонке F сумму 634 потом начал сравнивать с начала колонки G нашел первую 634 и" занулил".

Ну да по сути все верно ... но тогда найти где именно дисбаланс не получится.

А он может сначала искать в "ближайших" ячейках столбца G, а если не нашел то во всём ?
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
17.08.2012, 13:13
поставь код в модуль. Будет работать на активный лист

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
Sub BALANS()
 
   Dim Debit: Set Debit = CreateObject("Scripting.Dictionary")  ' Создаем словарь
   Dim Kredit: Set Kredit = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Dim M
M = Range(Cells(8, 3), Cells(Cells(Rows.Count, 3).End(xlUp).Row, 7))
For r = 1 To UBound(M)
    If M(r, 4) <> "" Then
        If Debit.exists(M(r, 4)) Then
            Debit.Item(M(r, 4)) = Debit.Item(M(r, 4)) + 1
        Else
            Debit.Add M(r, 4), 1
        End If
    End If
Next r
 
For r = 1 To UBound(M)
    If M(r, 5) <> "" Then
        If Debit.exists(M(r, 5)) Then
             If Debit.Item(M(r, 5)) > 1 Then
             Debit.Item(M(r, 5)) = Debit.Item(M(r, 5)) - 1
             Else
             Debit.Remove (M(r, 5))
             End If
        Else
        
            If Kredit.exists(M(r, 5)) Then
                Kredit.Item(M(r, 5)) = Kredit.Item(M(r, 5)) + 1
            Else
                Kredit.Add M(r, 5), 1
            End If
        End If
    End If
Next r
M = Debit.keys
 
s = "Непогашенные суммы Увеличения:" & vbCrLf
For r = 0 To UBound(M) - 1
s = s & M(r) & vbCrLf
Next r
 
s = s & "Непогашенные суммы Уменьшения:" & vbCrLf
M = Kredit.keys
For r = 0 To UBound(M) - 1
s = s & M(r) & vbCrLf
Next r
 
MsgBox s, 64, ""
End Sub

Добавлено через 4 минуты
Хотя по второму примеру тебе это не поможет: не помещается на месаге список непогашенных кредитов
1
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 13:14  [ТС]
Alex77755, работает ... но с результатом работать нельзя.

Получается огромное сообщение и всё. ... а мне то нужно с результатом дальше работать в поисках дисбаланса
0
 Аватар для Апострофф
9912 / 3935 / 743
Регистрация: 11.10.2011
Сообщений: 5,916
17.08.2012, 13:23
Цитата Сообщение от RIMS`V Посмотреть сообщение
все я понял ... он нашел внизу в колонке F сумму 634 потом начал сравнивать с начала колонки G нашел первую 634 и" занулил".
Немного наоборот - сначала в G берет значение, а потом ниже в F ищет дубль.
В этом и заключался мой непонятый вопрос - всегда ли значение в G должно предшевствовать (быть выше) соответствующего значения в F?
1
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
17.08.2012, 13:39  [ТС]
Цитата Сообщение от Апострофф Посмотреть сообщение
Немного наоборот - сначала в G берет значение, а потом ниже в F ищет дубль.
В этом и заключался мой непонятый вопрос - всегда ли значение в G должно предшевствовать (быть выше) соответствующего значения в F?
Да практически всегда, икслючения крайне редки.

Тогда наверное чтобы исключить такие совпадения, когда сумма доплаты = сумме сторонней накладной, нужно наверное сначала брать данные из колонки F (так как там полная стоимость) и затем искать в верх по G.

Тогда мы как раз получим расходки, для которых нет единой (полной) оплаты.

Можно так сделать ?


Т.е. получается нужно пойти снизу списка.
0
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
18.08.2012, 10:59
Лучший ответ Сообщение было отмечено как решение

Решение

И мой вариант, со скрытием парных:
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
Sub www()
    Dim m, a, b, i&, n&, j&
    Range(Cells(8, 6), Cells(Cells(Rows.Count, 3).End(xlUp).Row, 7)).EntireRow.Hidden = 0
    m = Range(Cells(8, 6), Cells(Cells(Rows.Count, 3).End(xlUp).Row, 7))
    ReDim a(1 To UBound(m), 1 To 2)
    With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(m)
        If m(i, 1) <> "" Then
            If .exists(m(i, 1)) Then
                a(.Item(m(i, 1)), 1) = a(.Item(m(i, 1)), 1) & "|" & i
            Else
                n = n + 1
                .Item(m(i, 1)) = n
                a(n, 1) = i
            End If
        End If
    Next i
 
    For i = 1 To UBound(m)
        If m(i, 2) <> "" Then
            If .exists(m(i, 2)) Then
                j = .Item(m(i, 2))
                a(j, 2) = IIf(a(j, 2) <> "", a(j, 2) & "|" & i, i)
            Else
                n = n + 1
                .Item(m(i, 2)) = n
                a(n, 2) = i
            End If
        End If
    Next i: End With
    Application.ScreenUpdating = 0
    For i = 1 To n
        If a(i, 1) <> "" And a(i, 2) <> "" Then
            m = Split(a(i, 1), "|")
            b = Split(a(i, 2), "|")
            For j = 0 To Application.Min(UBound(m), UBound(b))
                Rows(m(j) + 7).Hidden = -1
                Rows(b(j) + 7).Hidden = -1
            Next
        End If
    Next
    Application.ScreenUpdating = -1
End Sub
Вложения
Тип файла: rar Баланс_клиента.rar (29.1 Кб, 12 просмотров)
2
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
18.08.2012, 12:56  [ТС]
kuklp, Спасибо, работает ... парные скрывает. Причём делает это на удивление в разы быстрее чем запрос Аппострофа.

Но конечный вариант получился с той же проблемой к которой мы пришли. Посмотри последние посты, особенно 36й.
0
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
18.08.2012, 13:15
Во-первых мы с Вами не знакомы, поэтому ТЫкать мне не надо. То что я пытаюсь Вам помочь, не повод для фамильярности. По теме, замените строки:
Visual Basic
1
For i = 1 To UBound(m)
на
Visual Basic
1
For i = UBound(m) To 1 Step -1
в двух местах. Только в том примере никакой разницы не будет.
1
1 / 0 / 0
Регистрация: 16.08.2012
Сообщений: 19
19.08.2012, 11:15  [ТС]
kuklp, спасибо попробую.

По поводу "Ты" не обижайтесь, учту. Начинал на Вы, но ребята сами перешли на ТЫ, я так понял что здесть возможно так принято для простоты общения... значит ошибся.

Добавлено через 21 час 29 минут
Апострофф, Busine2012, Alex77755, kuklp,

Всем Вам ещё раз огромное спасибо за помощь, я Вам очень сильно признателен!

В итоге пользуюсь варинтом Апострофф`а "Hide_Dubl2" и запускаю не на весь огромный файл, а по месяцам ... тогда все хорошо получется.

Ещё раз огромное спасибо ... и здорово что есть такой сайт как Ваш.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2012, 11:15

Удаление дублей из textBox
Нужно сделать чтобы по нажатию на button удалялись дубли строк из textBox

Удаление дублей из массива
Имеется массив строк, в массиве имеются одинаковые строки, и не по одному дублю, а много. необходимо одинаковые строки отобразить только 1...

Удаление дублей по условию
Привет всем. Один вопрос. База в 2 млн. организаций. Есть дубли следующего рода: Ячейка А1 Ячейка В1 Ячейка С1 Компания (А) адрес...

Удаление дублей php
Добрый вечер. У меня в базу записывается некая статистика, и так как запрос &quot;INSERT INTO&quot; нельзя ограничить в одно добавление, изредко...

Удаление дублей в массиве
Помогите скриптом, который бы убирал дубли в массиве. Массив представляет собой список фамилий и номеров их очередей. Если есть...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит реквизиты: -. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru