Помогите с периодическим обновлением таблицы

Автор erih2017, 12 апреля 2017, 13:48

0 Пользователи и 1 гость просматривают эту тему.

erih2017

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

JohnSUN

Добро пожаловать на форум!
С чем помочь-то? "Оживить" макрос или рассказать возможные пути слияния таблиц?
В первом случае хотелось бы увидеть книгу с образцами данных (самое муторное в таких задачах - это высосать из пальца набор тестовых данных, написать для них работающий код и потом долго и нудно вносить в него изменения, потому что поступают всё новые и новые уточнения)
Во втором случае - как насчет того, чтобы просто дописать новые данные ниже старых, добавить колонку с функцией COUNTIFS(<от этой строки и до самого верха>) и применить стандартный фильтр по условию "запись встретилась только один раз"?
Формула будет похожа на что-то в таком роде:
=COUNTIFS($A$1:A3;A3;$B$1:B3;B3;$C$1:C3;C3)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

#2
Путей много, но навскидку - или простой (можно сказать "учебный") построчный макрос с 2-мя циклами, или умный макрос (через обмен Array-Range) или через базу данных Base+SQLite, на языке SQL (и его потрясающей возможностью игнорить дубликаты при INSERT и очень быстро работать с индексами, примерно в 5 раз быстрее самого Calc).

Простой макрос работает с объектами вида "ячейка", и желательно "для скорости" вставить всё из месячного файла в основной, на лист 2. Чтобы всегда знать номер первой пустой строки в Основном файле - можно написать, скажем в ячейку С1 формулу типа =COUNT(A2:A65535)+1. Меньше кода - больше формул, это лозунг для "учебных" примеров.  

Значит "три столбца", например дата+время+ФИО, - дают уникальный идентификатор, при ненахождении которого в базе - строка должна добавляться.

Тогда делаем в обоих файлах скрытый столбец-индекс с формулой вида =B2&C2&D2 и дальше простой вложенный цикл (код не проверял, набрано на коленке, специально на VBA, чтобы было проще понять):

   
Option VBASupport 1
Option Compatible

Sub MergeMonthTableToMainTableUnicalRows

for each m in sheets(2).[A2:A65535]
 if m.value="" then exit for
 emptyStr=[C1]
 for each b in Sheets(1).[A2:A65535]
   if b.value="" then exit for
   if m.value=b.value then
     Cells(emptyStr,1)=m: Cells(emptyStr,2)=m.offset(0,1): Cells(emptyStr,3)==m.offset(0,2)
     'конечно, это нужно делать через Range(Cell1, Cell2)
     exit for
   end if
 next b
next m
end sub
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

erih2017

спасибо, уважаемые. оба совета оказались очень полезны, попробую применит их на практике . Еще раз очень благодарю!