Данные на листе dashboard формируются из нескольких источников, в частности добавляются комментарии с листа db, через уникальную связку order-item.
Подскажите, пожалуйста, как потом записать измененные данные обратно на лист db (либо удалить, если комментарий удаляется), не порождая дубликаты , без использования всяких надстроек.
Пока получилось только добавлять, соответственно с дубликатами. Насколько это вообще верное направление.. ради двух колонок не хотелось бы переходить на аксес.
Доброго времени,
Данные на листе dashboard формируются из нескольких источников, в частности добавляются комментарии с листа db, через уникальную связку order-item.
Подскажите, пожалуйста, как потом записать измененные данные обратно на лист db (либо удалить, если комментарий удаляется), не порождая дубликаты , без использования всяких надстроек.
Пока получилось только добавлять, соответственно с дубликатами. Насколько это вообще верное направление.. ради двух колонок не хотелось бы переходить на аксес.user0
в общем - направление верное... но, я смотрю - более 20 просмотров темы, и ни одного ответа. Скорее всего у всех такая же проблема, как и у меня - не совсем понятно, что и как меняется, и что нужно получить в конце; по какому событию.
в общем - направление верное... но, я смотрю - более 20 просмотров темы, и ни одного ответа. Скорее всего у всех такая же проблема, как и у меня - не совсем понятно, что и как меняется, и что нужно получить в конце; по какому событию.Michael_S
На листе db есть данные обо всех комментариях, которые подтягиваются при заполнении листа dashboard. Затем пользователь меняет/добавляет/удаляет комментарий (оранжевые колонки). По этому событию необходимо соответствующим образом изменить данные листа db.
например - на листе dashboard меняем commentD, на commentXXX -> на листе db строка "333 2 commentC commentD" меняется на "333 2 commentC commentXXX" - на листе dashboard стираем commenA -> на листе db строка "111 1 commenA " меняется на "111 1 " или сразу удаляется, так как ни одного комментария нет. Или потом в самом конце отсортировать по убыванию и удалить пустые..
Особенность в том что можно сразу обновить несколько комментариев (вставив из буфера или протянув ячейки), хотя это вроде уже учтено.
Наверное задача сводится к сравнению двух массивов. Возможно лучше использовать коллекции, чтобы добавлялись только уникальные записи?
Ок, обновил пример, убрав все лишнее.
На листе db есть данные обо всех комментариях, которые подтягиваются при заполнении листа dashboard. Затем пользователь меняет/добавляет/удаляет комментарий (оранжевые колонки). По этому событию необходимо соответствующим образом изменить данные листа db.
например - на листе dashboard меняем commentD, на commentXXX -> на листе db строка "333 2 commentC commentD" меняется на "333 2 commentC commentXXX" - на листе dashboard стираем commenA -> на листе db строка "111 1 commenA " меняется на "111 1 " или сразу удаляется, так как ни одного комментария нет. Или потом в самом конце отсортировать по убыванию и удалить пустые..
Особенность в том что можно сразу обновить несколько комментариев (вставив из буфера или протянув ячейки), хотя это вроде уже учтено.
Наверное задача сводится к сравнению двух массивов. Возможно лучше использовать коллекции, чтобы добавлялись только уникальные записи?user0
StoTisteg, ок, спасибо. boa, спасибо, можно и так. Но тогда увеличится кол-во "измененных данных", которое необходимо будет сравнивать с базой. Сейчас в массив передаются только измененные данные с листа dashboard.
Насколько я понял, дальнейшие шаги такие: 1) загоняем данные "всей базы" и "измененные" в два массива 2) сравниваем их, чтобы удалить из базы измененные данные, одновременно добавляя оставшиеся данные базы в словарь 3) добавляем измененные данные в словарь 4) очищаем лист базы и записываем словарь 5) (опционально) данные на листе базы по составному ключу
StoTisteg, ок, спасибо. boa, спасибо, можно и так. Но тогда увеличится кол-во "измененных данных", которое необходимо будет сравнивать с базой. Сейчас в массив передаются только измененные данные с листа dashboard.
Насколько я понял, дальнейшие шаги такие: 1) загоняем данные "всей базы" и "измененные" в два массива 2) сравниваем их, чтобы удалить из базы измененные данные, одновременно добавляя оставшиеся данные базы в словарь 3) добавляем измененные данные в словарь 4) очищаем лист базы и записываем словарь 5) (опционально) данные на листе базы по составному ключуuser0
Но тогда увеличится кол-во "измененных данных", которое необходимо будет сравнивать с базой.
А зачем сравнивать? вы же не используете результаты сравнения (типа: был коммент - стал коммент) вас, как я понял, интересуют актуальные комментарии вот я вам и предлагаю вариант с таблицей во-первых она возьмет только записи в которых есть комменты, а во вторых для нее(таблицы) не важно как вы эти комменты будете заполнять. или копипастом из другого источника, или блоками, или поштучно. После рефреша таблицы перед вами актуальная информация. Для автоматизации, можно на событие активации листа поставить обновление таблицы.
Но тогда увеличится кол-во "измененных данных", которое необходимо будет сравнивать с базой.
А зачем сравнивать? вы же не используете результаты сравнения (типа: был коммент - стал коммент) вас, как я понял, интересуют актуальные комментарии вот я вам и предлагаю вариант с таблицей во-первых она возьмет только записи в которых есть комменты, а во вторых для нее(таблицы) не важно как вы эти комменты будете заполнять. или копипастом из другого источника, или блоками, или поштучно. После рефреша таблицы перед вами актуальная информация. Для автоматизации, можно на событие активации листа поставить обновление таблицы.boa
boa, может пример немного неверный или я что-то упускаю. у меня же данные на первом и втором листе не повторяют друг друга один в один.
допустим записей (ключ-комментарий) на втором листе 100 штук, на первом листе только 10*, из 100 записей базы, к 10 относятся только 5 и они подставляются на лист 1. меняем какую-то запись на листе 1 и она должна поменяться на листе 2, где все также остается 100 записей если удаляем с листа 1, то на листе 2 уже 99 и тд. * в следующий раз, при импорте из внешних источников, будет другое кол-во.
boa, может пример немного неверный или я что-то упускаю. у меня же данные на первом и втором листе не повторяют друг друга один в один.
допустим записей (ключ-комментарий) на втором листе 100 штук, на первом листе только 10*, из 100 записей базы, к 10 относятся только 5 и они подставляются на лист 1. меняем какую-то запись на листе 1 и она должна поменяться на листе 2, где все также остается 100 записей если удаляем с листа 1, то на листе 2 уже 99 и тд. * в следующий раз, при импорте из внешних источников, будет другое кол-во.user0
Sub Search_comments() Dim MyArr, TempArr Dim a, i&, j&, sKey$ Dim Separ$: Separ = " | " 'чисто для формирования уникальных ключей словаря
Dim MeTime As Date: MeTime = Time Dim Start!: Start = Timer
Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary") Dic.CompareMode = vbTextCompare
On Error Resume Next For Each a In Worksheets("db").[a1:a1000] 'таблица 1, которая хранит все комменты. Можно задать динамическим диапазоном Dic.Add CStr(a & Separ & a.Offset(, 1).Value), Array(a, a.Offset(, 1), a.Offset(, 2), a.Offset(, 3)) Next a
For Each a In Worksheets("dashboard").[d2:d1000] 'таблица 2, которую обрабатываем sKey = a & Separ & a.Offset(, 1).Value If Len(a.Offset(, 7).Value & a.Offset(, 8).Value) > 0 Then 'если комменты есть, то If Dic.Exists(sKey) Then 'проверяем, что мы насобирали с таблицы 1 Dic.Item(sKey) = Array(a, a.Offset(, 1), a.Offset(, 7), a.Offset(, 8)) 'если элемент имеется, то обновляем значения комментов Else Dic.Add CStr(sKey), Array(a, a.Offset(, 1), a.Offset(, 7), a.Offset(, 8)) 'если не находит, то добавляет End If Else If Dic.Exists(sKey) Then Dic.Remove sKey 'удаляет записи без комментариев End If
Next
TempArr = Array(Dic.Items) 'передаем в массив ReDim MyArr(1 To Dic.Count, 1 To 4) For i = 0 To Dic.Count - 1 For j = 0 To 4 MyArr(i + 1, j + 1) = TempArr(0)(i)(j) 'готовим массив для экспорта на лист Next Next
With Worksheets("db") .UsedRange.Clear 'очищаем старые данные .Range(.Cells(1, 1), .Cells(Dic.Count, 4)) = MyArr 'записываем новые End With
Debug.Print Timer - Start MsgBox "Затрачено: " & Format(Time - MeTime, "hh:mm:ss") & vbLf & "найдено " & Dic.Count & " записей для отображения." End Sub
[/vba]
Запустите макрос у себя в книге
user0, Ну тогда без словаря ни как
[vba]
Код
Sub Search_comments() Dim MyArr, TempArr Dim a, i&, j&, sKey$ Dim Separ$: Separ = " | " 'чисто для формирования уникальных ключей словаря
Dim MeTime As Date: MeTime = Time Dim Start!: Start = Timer
Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary") Dic.CompareMode = vbTextCompare
On Error Resume Next For Each a In Worksheets("db").[a1:a1000] 'таблица 1, которая хранит все комменты. Можно задать динамическим диапазоном Dic.Add CStr(a & Separ & a.Offset(, 1).Value), Array(a, a.Offset(, 1), a.Offset(, 2), a.Offset(, 3)) Next a
For Each a In Worksheets("dashboard").[d2:d1000] 'таблица 2, которую обрабатываем sKey = a & Separ & a.Offset(, 1).Value If Len(a.Offset(, 7).Value & a.Offset(, 8).Value) > 0 Then 'если комменты есть, то If Dic.Exists(sKey) Then 'проверяем, что мы насобирали с таблицы 1 Dic.Item(sKey) = Array(a, a.Offset(, 1), a.Offset(, 7), a.Offset(, 8)) 'если элемент имеется, то обновляем значения комментов Else Dic.Add CStr(sKey), Array(a, a.Offset(, 1), a.Offset(, 7), a.Offset(, 8)) 'если не находит, то добавляет End If Else If Dic.Exists(sKey) Then Dic.Remove sKey 'удаляет записи без комментариев End If
Next
TempArr = Array(Dic.Items) 'передаем в массив ReDim MyArr(1 To Dic.Count, 1 To 4) For i = 0 To Dic.Count - 1 For j = 0 To 4 MyArr(i + 1, j + 1) = TempArr(0)(i)(j) 'готовим массив для экспорта на лист Next Next
With Worksheets("db") .UsedRange.Clear 'очищаем старые данные .Range(.Cells(1, 1), .Cells(Dic.Count, 4)) = MyArr 'записываем новые End With
Debug.Print Timer - Start MsgBox "Затрачено: " & Format(Time - MeTime, "hh:mm:ss") & vbLf & "найдено " & Dic.Count & " записей для отображения." End Sub