Страницы: 1
RSS
Как перенести по уникальному значению данные с одного листа на другой
 
Добрый день, подскажите, пожалуйста макрос как сожно решить такую задачу.
Есть лист1, в котором есть счет 67 и компания ВТБ и в который на строчку ниже нужно перенести данные из листа2 по совпадающему критерию - счету 67, т.е. у листа1 и листа2 есть общий критерий - счет 67. На листе1 строк меньше чем на листе 2, т.е. нужно чтобы макрос добавлял на листе1 строку при необходимости и переносил в нее данные. Данные которые нужно перенести на листе2 отметил зеленым цветом. Результат который нужен - на листе 3. То есть по сути нужно чтобы макрос увидел что на листе1 и листе2 есть одинаковый счет 67, понял что нужно перенести 4 строки и добавил бы 3 (т.к. одна со счетом 67 уже есть на листе1), ну и перенес бы содержимое этих строк на лист 1.  
 
Покажите все это в файле Excel. Как есть - Как надо. Тут, все таки, форум не по фотошопу
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Покажите все это в файле Excel. Как есть - Как надо.
 
roma roma, пока ждете макрос можете потестировать
д.массив (эксель 2021+)
...если есть, конечно, такая возможность
 
roma roma, Добрый день.
Чтобы писать макрос (и не переписывать потом всё) нужно знать все детали.
Например - интересуют только строки где нет суммы? Иначе почему никак не изменилась сумма у счёт 91?
На втором листе всегда так всё сгруппировано, или может быть перемешано? Если перемешано - можно ли отсортировать по счетам?
Ну а с тем что видим алгоритм простой - запомнили адреса групп второго листа, затем циклом по первому снизу вверх проверяем на пустоту и копипастим запомненные адреса...
 
Цитата
написал:
roma roma , пока ждете макрос можете потестировать
У меня к сожалению excel 2019, решение интересное, но не уверен что мне подойдет.
Необходимо было чтобы данные перенеслись из листа2 в лист1 (в котором уже есть данные, но имеющиеся данные нужно сохранить)
У меня формула отображается так, это значит я ее н смогу редактировать в 2019 версии?
Код
=_xlfn.LET(_xlpm._л1;Лист1!A2:C6;_xlpm._л2;Лист2!A2:C9;_xlpm.ч1_;ЧСТРОК(_xlpm._л1);_xlpm.ф_;_xlfn._xlws.FILTER(_xlpm._л2;ЕЧИСЛО(ПОИСКПОЗ(ИНДЕКС(_xlpm._л2
;;1);_xlfn._xlws.FILTER(ИНДЕКС(_xlpm._л1;;1);(ИНДЕКС(_xlpm._л1;;3))="")));_xlpm.п2_;_xlfn.SEQUENCE(_xlpm.ч1_+ЧСТРОК(_xlpm.ф_));_xlpm.е_;ЕСЛИ(_xlpm.п2_>_xlpm.ч1_;ИНДЕКС(_xlpm.ф_;_xlpm.п2_-_xlpm.ч1_;{1;2;3});_xlpm._л1);_xlfn._xlws.SORT(_xlfn._xlws.FILTER(_xlpm.е_;ИНДЕКС(_xlpm.е_;;3))))
 
Цитата
написал:
roma roma , Добрый день.Чтобы писать макрос (и не переписывать потом всё) нужно знать все детали.Например - интересуют только строки где нет суммы? Иначе почему никак не изменилась сумма у счёт 91?На втором листе всегда так всё сгруппировано, или может быть перемешано? Если перемешано - можно ли отсортировать по счетам?Ну а с тем что видим алгоритм простой - запомнили адреса групп второго листа, затем циклом по первому снизу вверх проверяем на пустоту и копипастим запомненные адреса...
Нужен чтобы макрос сопоставил колонку счет из листа1 и колонку счет из листа2. При сопоставлении он обнаруживает наличие в данных колонках одинаковых счетов (67). Дальше он считает количество совпавших строк на листе2 по данному счету (67), их четыре, задача перенести эти 4 строки (а точнее перенести содержимое колонок компания и сумма по данным 4 строкам) на лист1 на строку ниже счета 67 - между счетом 67 и 91 (то есть другими словами на листе1 придется вставить дополнительные три строки между счетом 67 и 91). В результате на листе1 будет четыре счета 67 (один там был и три мы добавили). К этим четырем строкам нужно перенести как я ранее писал содержимое колонок компания и сумма.
Сейчас колонки счет на листе1 совпадают не только по 67 счету, но и по 91. В идеале нужен макрос чтобы все сопадения отрабатывал, но если хотя бы и для одного счета сможете подсказать, может быть я смогу допилить его)
 
Цитата
написал:
На втором листе всегда так всё сгруппировано, или может быть перемешано? Если перемешано - можно ли отсортировать по счетам?
На втором листе может быть перемешано, можно отсоритровать, второй лист это источник информации, результат на первом листе.
 
Еще добавлю что на листе1 никакие данные затираться не должны (только добавляться)
 
roma roma, "побаловался" немного в Power Query. Сразу скажу, что знание этого инструмента у меня несколько поверхностные )
Может быть спецы здесь чуть упростят ;-)
pq
 
Цитата
roma roma написал:
совпадают не только по 67 счету, но и по 91
- ну так это тоже непонятно - по 91 совпадает, но данные не обновлены. Вывод - искать только для пустых ячеек?
Пока нет ясности в ТЗ - я лично никуда не тороплюсь.
 
Подскажите пожалуйста как в файле макр (11).xlsm поправить макрос "Сопоставить счета". Он нормально работает, но отрабатывает только первое совпадение (по счету 67). Нужно чтобы и другие совпадение отрабатывал, в данном случае по счету 91.
 
roma roma,  там беда в том что в цикле переменную lastRow1 менять нет смысла (да она и не меняется), я сразу написал что циклом нужно идти снизу вверх.
Ну вот так поправил - кнопка похоже из моего файла позаимствована, пусть и чуть кода тоже будет ))
Я перевернул цикл, добавил ещё названия, ну и закомментировал лишнее
Скрытый текст
Изменено: Hugo - 10.05.2025 21:58:13
 
Цитата
написал:
roma roma ,  там беда в том что в цикле переменную lastRow1 менять нет смысла (да она и не меняется), я сразу написал что циклом нужно идти снизу вверх.Ну вот так поправил - кнопка похоже из моего файла позаимствована, пусть и чуть кода тоже будет ))Я перевернул цикл, добавил ещё названия, ну и закомментировал лишнее
Спасибо большое! В целом уже похоже на желаемый результат. Но я видимо упустил один момент, внес небольшие изменения в исходный файл, во первых на листе 2 по счету 67 не должно быть не уникальных компаний - поправил, и на листе 1 добавил сторку 5.
В результате логика должна быть такая - макрос видит совпадение по счету 67, все что далее описано необходимо дописать в макрос - далее он определяет что у счета 67 на листе 1 есть две компании(их порядок может быть хаотичным), нужно проверить есть ли эти две компании по счету 67 на листе 2. Если есть соответственно переносим сумму напротив данной компании в колонку сумма. В данном случае сумма по двум компаниям перенесется, а еще по двум уже нужно вставить на новые строки добавленные ниже. Подскажите пожалуйста как можно скорректировать макрос.
Изменено: roma roma - 10.05.2025 23:11:22
 
Добрый день.

Как поменять код чтобы в 22 счет на листе 1 перенеслась сумма и компания (но логика остальная сохранилась бы)?
Код
Sub СопоставитьСчета()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim i As Long
    Dim j As Long
    Dim currentRow As Long
    Dim companyFound As Boolean
    
    ' Установим ссылки на листы по индексам
    Set ws1 = ThisWorkbook.Sheets(1) ' Первый лист в книге
    Set ws2 = ThisWorkbook.Sheets(2) ' Второй лист в книге
    
    ' Найдем последнюю строку в каждом листе
    lastRow1 = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
    lastRow2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
    
    ' Проходим по всем счетам на Листе1
    For i = 2 To lastRow1 + 1000 ' Начинаем с 2, чтобы пропустить заголовок на Листе1, + 1000 добавлено эксперементальным путем
        
        If ws1.Cells(i, 1).Value <> "" Then ' Проверяем, что счет не пустой
            
            ' Ищем совпадения по счету и компании на Листе2, + 1000 добавлено эксперементальным путем
            For j = 2 To lastRow2 + 1000
                
                If ws1.Cells(i, 1).Value = ws2.Cells(j, 1).Value Then ' Совпадение по счету
                    
                    companyFound = False
                    
                    If ws1.Cells(i, 2).Value = ws2.Cells(j, 2).Value Then ' Совпадение по компании
                        companyFound = True
                        ' Переносим сумму из Листа2 в Лист1
                        ws1.Cells(i, 3).Value = ws2.Cells(j, 3).Value
                    End If
                    
                End If
                
            Next j
            
            ' Если компания не найдена на Листе2 для данного счета, добавляем новые строки с компаниями из Листа2 под последней найденной компанией для этого счета на Листе1
            If Not companyFound Then
                
                For j = 2 To lastRow2
                    
                    If ws1.Cells(i, 1).Value = ws2.Cells(j, 1).Value And _
                       Application.WorksheetFunction.CountIf(ws1.Range("B:B"), ws2.Cells(j, 2).Value) = 0 Then
                    
                        i = i + 1 ' Переходим к следующей строке для вставки новой компании

                        ' Вставляем новую строку и переносим данные из Листа2 в Лист1
                        ws1.Rows(i).Insert Shift:=xlDown

                        ws1.Cells(i, 1).Value = ws2.Cells(j, 1).Value
                        ws1.Cells(i, 2).Value = ws2.Cells(j, 2).Value
                        ws1.Cells(i, 3).Value = ws2.Cells(j, 3).Value

                    End If
                    
                Next j
                
            End If
            
        End If
        
    Next i
    
    MsgBox "Сопоставление завершено!"
End Sub
Изменено: roma roma - 11.05.2025 12:00:05
 
Вместо 1000 прибавляйте ilastrow2 - это максимум на сколько может сдвинуться последняя строка.
Ну если идти снизу не нравится...
По остальному не смотрел, выходной.
Изменено: Hugo - 11.05.2025 13:54:44
Страницы: 1
Читают тему
Наверх