Копировать данные из разных книг

Автор Tin, 27 января 2016, 00:12

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

Tin

Добрый день. Я совсем недавно столкнулась с Libre и пока плохо разбираюсь в UNO. Столкнулась я с такой проблемой: нужно выделить диапазон ячеек (до последней заполненной) в одной книге и скопировать его в другую. Цикл, который определяет последнюю заполненную ячейку я написала, а вот связать две книги у меня никак не получается. Застопорилась вся работа. Помогите, пожалуйста!

JohnSUN

Добро пожаловать на форум!
Скорее всего, цикл писала зря - последнюю заполненную ячейку в Calc'е ищут немножко иначе...
Расскажи, пожалуйста, чуть больше о самой задаче: сколько приблизительно файлов нужно собрать в общую книгу, какого они типа, в одной ли папке лежат или каждый нужно искать по всему диску (и такое бывает), как часто это нужно делать (раз понадобился макрос, значит регулярно - но насколько часто?)... В один лист нужно вставлять данные одной сплошной таблицей или каждый файл нужно сделать отдельным листом? Книгу-результат нужно сохранять в одно и то же место с одни и тем же именем (обновлять одну и ту же книгу)? Или нужно будет их накапливать в каком-то каталоге одну за другой (каждый раз создавать новую по шаблону)?
А еще лучше было бы получить образцы данных.
Не могла бы ты свернуть в zip-архив папку с несколькими из исходных файлов и заготовку своей книги-результата и прикрепить к следующему письму (ниже окна редактирования сообщения есть кнопка "Выберите файл")?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Tin

Здравствуйте. Задача в следующем: отдельной книгой есть прайс, из него нужно копировать значения в базу данных, создав новый лист (название задается пользователем). Лист прайса один. Файлы, с которыми работаю, я прикрепляю. OSTATKI - это прайс, из которого копирую данные. Название файла каждый раз меняется. Voratex - база данных, в которую копируются данные с прайса. Макрос пишу именно в ней. В начале там уже написан кусочек на открытие прайса, а вот дальше я подвисла(

Tin

Цитата: JohnSUN от 27 января 2016, 05:26сколько приблизительно файлов нужно собрать в общую книгу, какого они типа, в одной ли папке лежат или каждый нужно искать по всему диску (и такое бывает), как часто это нужно делать (раз понадобился макрос, значит регулярно - но насколько часто?)...

Файл каждый раз один, типа .xls. На счет одной папки нужно уточнить, но в макросе на открытие книги я дала возможность пользователю самому указывать адрес расположения и имя книги на всякий случай. На счет частоты тоже не в курсе, вроде как каждый месяц, но возможно и чаще.

Пример скопированного диапазона есть на листе 2016-01-11, правда там он уже немного изменен. Конечный результат будет как на листе 2016-01-11_prom-ua. Наверное, проще было бы сразу все копировать на итоговый лист, но пользователь попросил, чтобы промежуточный лист сохранялся (зачем-то ему это нужно).

JohnSUN

#4
Мне очень жаль, но Voratex дошёл без макросов... Так что посмотреть, как это всё было задумано, не получилось.
Забавно... Очень похожую задачу решал очень давно (на этой неделе полторы тысячи дней исполняется - какой никакой, а юбилей). Задача похожа, хоть и не очень точно совпадает... Всё равно, стоит этот CollectData скачать - некоторые процедуры из него можно будет использовать "живьём". Например функцию CopySpreadsheetTransferableContent или getOrCreateSheet. Или просто подсмотреть, как ищется номер последней заполненной строки:
GlobalScope.BasicLibraries.LoadLibrary("Tools") ' Загрузить библиотеку "Tools"
...
lastTargetRow = GetLastUsedRow(oSheet)


Сразу хочу предупредить про "грабли", которые обычно подворачиваются при копировании данных из книг .ods/.xls: к сожалению, исходный прайс не всегда бывает "просто данными", иногда отправитель оставляет в нём какие-нибудь формулы... При копировании в новую книгу эти формулы могут просто перестать работать, начать выдавать невнятные ошибки из-за потери связи с исходными данными.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Tin

Цитата: JohnSUN от 27 января 2016, 10:27При копировании в новую книгу эти формулы могут просто перестать работать, начать выдавать невнятные ошибки из-за потери связи с исходными данными.

В прайсе формул не будет, там только данные. Но на будущее предупреждение может быть актуальным)

Цитата: JohnSUN от 27 января 2016, 10:27Очень похожую задачу решал очень давно

Я, к сожалению, очень сильно не дружу с английским, но попробую разобраться)

Вот то, что у меня сейчас написано в макросе.

Sub Main
Dim oDesk as Object
Dim oDoc as Object
Dim oFile as String
Dim oUrl as String
Dim oUrlTemp as String
Dim I as String
Dim NPrice as String
oDesk = createUnoService ("com.sun.star.frame.Desktop")
'Измените имя файла на такое, которое Вы можете написать
I = InputBox ("Введите адресс расположения файла", "Открытие прайса")
NPrice = InputBox ("Введите имя файла", "Открытие прайса")
oFile = I + "\" + NPrice + ".xls"
oUrl = convertToUrl (oFile)
If fileExists (oFile) Then
oUrlTemp = oUrl
Else
MsgBox "Файл не существует"
Exit sub
End If
oDoc = oDesk.loadComponentFromURL (oUrlTemp, "_blank", 0, Array() )
rem _________________________________________________

End Sub

JohnSUN

#6
Я как раз пытаюсь отыскать здесь, на этом форуме, ещё один макрос... Должен пригодиться. Там перенос данных с листа на лист по наименованиям (заголовкам) колонок...
Ага, код Main увидел... А сортировка промежуточной копии в _prom-ua еще не готова?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: Tin от 27 января 2016, 10:37Вот то, что у меня сейчас написано в макросе.
У вас там написано "многа букав". JohnSUN не просто так спрашивал где находятся файлы, если они всегда в одной папке, то получить их проще с помощью FilePicker, а не InputBox

Tin

Цитата: JohnSUN от 27 января 2016, 10:40сортировка промежуточной копии в _prom-ua еще не готова

у-у, привыкла писать все по порядку)

Цитата: JohnSUN от 27 января 2016, 10:40Там перенос данных с листа на лист по наименованиям (заголовкам) колонок...

Было бы хорошо, но у меня проблема по большей части именно в обращении к книгам(

Tin

Цитата: rami от 27 января 2016, 11:00У вас там написано "многа букав". JohnSUN не просто так спрашивал где находятся файлы, если они всегда в одной папке, то получить их проще с помощью FilePicker, а не InputBox

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

JohnSUN

#10
Ну, расположение файла или его открытие - это как раз не проблема... В элементах управления офиса есть даже специальный прибамбас "Выбор файла", а в стандартной библиотеке Tools специальная функция OpenDocument...

Ты лучше вот о чем расскажи - формулы в _prom-ua, все эти VLOOKUP'ы - так и останутся? Или подменишь на вычисленные значения? Курс для колонки T будешь спрашивать в диалоге или будешь заранее писать в отдельную ячейку? Каким образом задаются коэффициенты для розницы? Они везде разные, системы не улавливаю...

P.S. А перенос столбцов все-таки нашёл. Но у тебя в буферном листе и в итоговом названия колонок разные. Так что тоже "вживую" использовать не получится, придется править...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Tin

Цитата: JohnSUN от 27 января 2016, 11:19Ты лучше вот о чем расскажи - формулы в _prom-ua, все эти VLOOKUP'ы - так и останутся? Или подменишь на вычисленные значения? Курс для колонки T будешь спрашивать в диалоге или будешь заранее писать в отдельную ячейку? Каким образом задаются коэффициенты для розницы? Они везде разные, системы не улавливаю...

Вычисления тоже через макрос сделаю. Вычисление цены как раз самый сложный момент, потому как зависит от скидки и наценки. Скидка разная для разных сезонов, а вот наценка позапаристей. Она зависит от диаметра шины и от бренда. Есть наценка для разных диаметров, но при этом на определенные бренды и разные виды их шин наценки тоже разные. Тут скорей всего буду пробегаться циклом и делать ветвление, а значения скидок и наценок вытащу на Эталон или даже на еще один отдельный лист. Если есть вариант, как можно это попроще оформить, то подскажите, пожалуйста.

JohnSUN

Цитата: Tin от 27 января 2016, 11:01вытащу ... на еще один отдельный лист
Это, пожалуй, самое правильное. Эталон и так раздут слишком сильно, еще и коэффициенты туда совать не резон.

Насколько я понял после разглядывания показанных файлов, вся задача формулируется так: по присланному прайсу сформировать таблицу пригодную для выгрузки в интернет-магазин (Google AdWords, Яндекс.Директ и т.п.).
То есть:
1. Просто конвертируем данные из глупо оформленного прайса в плоскую таблицу, дополняя сведениями из справочника Эталон и - скорее всего - еще каких-то (валют, курсов, наценок/скидок...)
2. Скорее всего, "раз в месяц" - слишком оптимистичный прогноз: раз речь идёт об интернете, то это будет или "раз в день" или вообще "несколько раз в день". А это в свою очередь означает, что пользовательский интерфейс обязан быть примитивным до ужаса, а значит программисту придётся корячиться будь здоров. Мои соболезнования...
3. Сейчас заказчик свои хотелки сформулировал совершенно не задумываясь о последствиях, по ходу разработки придётся его убеждать, что многое сделать, как он хотел изначально, просто не получится. Например, нельзя сохранять всю эту ерунду в одной книге... Уже сейчас, всего с двумя прайсами Vortex тянет на полтора мегабайта. Каждый новый прайс будет утяжелять его ещё приблизительно на половину мегабайта... Очень скоро начнутся жуткие тормоза. Поэтому лучше бы всё-таки сохранять результат в отдельный файл, не наращивать книгу лист за листом.

Окончательную таблицу будут выгружать в csv (xml? xls?) или будут закидывать на сайт напрямую, через обычный копи-паст? Впрочем, при любом варианте было бы желательно избавиться от формул в окончательном листе, одни только строки и числа...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Tin

Цитата: JohnSUN от 27 января 2016, 12:44Окончательную таблицу будут выгружать в csv (xml? xls?) или будут закидывать на сайт напрямую, через обычный копи-паст? Впрочем, при любом варианте было бы желательно избавиться от формул в окончательном листе, одни только строки и числа...

Да я вот тоже думала сделать сохранение на отдельный лист, осталось донести это заказчику) На счет того, как она дальше будет использоваться я ничего не знаю, но в любом случе все вычисления вгоню в макрос)

Tin

Цитата: JohnSUN от 27 января 2016, 11:19А перенос столбцов все-таки нашёл.

Я посмотрела этот код, но не совсем его поняла... Получается мне, чтобы переходить между книгами нужно создавать переменные типа Object (или Worcbook?) и оперировать ими?