Подстановка значений из одной таблицы в другую.

Автор Zegordo, 18 февраля 2016, 16:39

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

Zegordo

Необходима помощь макросоделов на либре.
Суть задачи такова:
Есть две таблицы в разных отдельных файлах.
в первой например
вася  500
лена 300
оля   400
иван 200
то есть в одной столбце название, в другом число
во второй таблице в одном столбце те же самые названия, а в другом данные, которые надо добавить в первую таблицу в третий столбце соответственно такому же названию
то есть если во второй таблице
лена 50
иван 80
то в первой после использования макрос станет
вася  500 
лена 300   50
оля   400
иван 200   80

когда значений мало это просто вручную, но там сотни строк :<

во вложении кинул надстройку для excel, которая может выполнить эти же функции, но сама по себе обладает и ещё несколькими полезными пунктами.
может как-то поможет.

JohnSUN

Имеется в виду что-то вроде такого?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Zegordo

Цитата: JohnSUN от 18 февраля 2016, 17:59Имеется в виду что-то вроде такого?
да, выглядит похоже: сравнение по одной ячейчке и при наличии такого же значения сделать запись в другую
Расскажите, пожалуйста, как сделали? :>

JohnSUN

Это была не более чем шутка на тему "Добро пожаловать на форум!"
Настоящая формула, которая собственно и производит подстановку, спрятана в именованном диапазоне. Поставь курсор в любую ячейку в колонке C, где есть формула =НасдтройкаПодстановки, нажми Ctrl+F3 и увидишь её "живьём". (Если нажмёшь Ctrl+F3 пока выделена ячейка в другой колонке, увидишь "испорченную" формулу, вместо адресов в ней будут #ССЫЛ!)
Для поиска значения в таблице можно было бы использовать функцию VLOOKUP() - обычно для этой задачи пользуются именно ею.
Но эта функция возвращает только одно, первое найденное значение. А ведь в новой таблице, в которой будем искать совпадения, может оказаться несколько строк с Леной или Иваном. Чтобы наверняка сосчитать их все, использована функция SUMIF().

Разумеется, этот пример не будет учитывать случай, когда в новой таблице появятся новые имена, которых еще не было в старой, основной таблице. Правильный сценарий, скорее всего, предполагает, что таких новичков нужно дописать в конец существующей таблицы и заполнить числовые данные и для них тоже. Но тут, действительно, проще всего использовать макрос.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Zegordo

Цитата: JohnSUN от 19 февраля 2016, 11:41
Но тут, действительно, проще всего использовать макрос.
Проблема осложняется и тем что таблицы в отдельных файлах находятся.
Но вы как-то сложно описали и про изменений новых имён...
Суть в том что первая таблица с именами и значениями (лена 300) всегда будет одна.  Там могут и будут добавляться новые значения.
А таблица вторая, откуда будет в первую таблицу добавляться значения в новый столбец будет не одна: будут приходить новые и каждый раз нужно будет сверять, например, наличие лены в первой таблицы и записывать туда новое значение.
Я прикладывал надстройку с экселя и она работает именно так, но понятия не имею как адаптировать её под calc.
Она, в принципе, сложнее: сейчас нужно просто чтобы из таблицы первой макрос сверял столбец со столбцов в таблице 2 и при нахождении такого же значения записывать в таблицу имён нужное значение.
Не знаю, кажется снова сложно объяснил :>
В общем, прикрепил 2 таблицы "В" и "ИЗ"
Таблица "В" всегда будет одна но может дополняться некоторыми артикулами
А вот таблицы "ИЗ" будут приходить новые и разные и значения количества нужно будет всписывать в таблицу В

JohnSUN

Видишь ли в чем тут дело. Люди, которые общаются на этом форуме чаще всего не устанавливают на своих компьютерах МС Офис.
Поэтому не имеют возможности подробно рассмотреть содержимое этой надстройки.
Но и при просматривании её по диагонали по строкам сообщений
ЦитироватьВыберите справочник
Введите через запятую номера или имена колонок (цифры или буквы)
Для подстановки должно быть открыто не менее двух файлов с таблицами
Нельзя переносить данные внутри одного файла
Внимание! Вы выбрали выделение цветом изменённых ячеек. Это сильно замедляет работу макроса
можно догадаться о задуманном (и даже реализованном для Экселя) сценарии работы. Догадаться о сценарии в целом, без деталей. А здесь, похоже, детали имеют важное значение.
Цитата: Zegordo от 19 февраля 2016, 14:32
Не знаю, кажется снова сложно объяснил :>
Ну да, типа, отомстил за плохо объяснённую Ctrl+F3  ;D
Из твоего объяснения не понятно, в каком виде нужно получить третью колонку - в виде реальных значений (чисел) или в виде ссылок на соответствующие ячейки (тоже чисел, но в ячейке будет что-то вроде ='file:///C:/Postuplenie/ИЗ.ods'#Sheet1.A2:B4)
Ну, в смысле, получаешь новую книгу (чтобы много букв не писать, дальше будем называть её просто "ИЗ") - и что? Открываешь книгу "В", запускаешь макрос и про книгу "ИЗ" уже можно забыть, потому что все значения из неё уже здесь, в книге "В"?
(Хорошо, что перешли к нормальным артикулам. А то все эти "лены-оли" напоминали про "и только Вовочка во время диктанта написал слово "гальку" с маленькой буквы")
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Zegordo

Цитата: JohnSUN от 19 февраля 2016, 13:42в каком виде нужно получить третью колонку
в виде реальных значений (чисел) без ссылок на соответствующие ячейки. то есть работа макроса в этом случае копировать-вставить
Цитата: JohnSUN от 19 февраля 2016, 13:42Открываешь книгу "В", запускаешь макрос и про книгу "ИЗ" уже можно забыть, потому что все значения из неё уже здесь, в книге "В"?
именно так!


JohnSUN

ОК. Подождать сможешь? Отвлёкся на помощь другому пользователю - это потребует времени. Или, может быть, кто-то из ветеранов сделает...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Zegordo


rami

Цитата: Zegordo от 19 февраля 2016, 14:55Конечно, но надеюсь не пару месяцев :>
Не прошло и пары месяцев...

Оба документа должны быть в одной папке, отработанный документ "ИЗ" замещать новым с именем "ИЗ" (иначе не будет обновления данных)
Проверяйте на дубликатах.

P.S. с формулами было бы проще, хотя и так не сложно.

Zegordo

Я вам благодарен, но не понимаю как его адаптировать под настоящие документы.
т.к. код макроса, насколько я могу понять, берёт данные строго по тем столбцам, что были в документах "В" и "ИЗ" - а их я сделал просто для примера.
Настоящие же таблицы класса "В" имеют артикул и поле для вставки данных из таблиц "ИЗ" в разных столбцах. Тоже самое (разные места столбцов) и в таблицах "ИЗ"
То есть, мне надо будет внедрить этот макрос во все таблицы класса "В"(у которых разные места столбцов, но данные те-же - артикул и количество) и скармливать макросу таблицы класса "ИЗ", где столбцы могут тоже быть в разных местах, но суть работы по сверке артикула и вписыванию количества сохраняется.


rami

Цитата: Zegordo от 19 февраля 2016, 22:30
Я вам благодарен, но не понимаю как его адаптировать под настоящие документы.
т.к. код макроса, насколько я могу понять, берёт данные строго по тем столбцам, что были в документах "В" и "ИЗ" - а их я сделал просто для примера.
Настоящие же таблицы класса "В" имеют артикул и поле для вставки данных из таблиц "ИЗ" в разных столбцах. Тоже самое (разные места столбцов) и в таблицах "ИЗ"
То есть, мне надо будет внедрить этот макрос во все таблицы класса "В"(у которых разные места столбцов, но данные те-же - артикул и количество) и скармливать макросу таблицы класса "ИЗ", где столбцы могут тоже быть в разных местах, но суть работы по сверке артикула и вписыванию количества сохраняется.
Для примера нужно было сохранить структуру настоящих документов, изменив данные (если они секретные)
Если диапазоны данных всегда на одних и тех же местах, то их нужно скорректировать, если неизвестно где они находятся, нужно знать как их найти.

Zegordo

#12
Цитата: rami от 19 февраля 2016, 20:54если неизвестно где они находятся, нужно знать как их найти.
Ммм. в макросе для экселя были всплывающие окна с выбором нужных диапазонов данных.
В конце концов будут меняться только столбцы, строки всегда все придётся просматривать...
То есть достаточно указывать букву столбцов в том же всплывающем окне, как мне кажется.
Две буквы для "В" где артикулы и куда вводить данные и так же 2 буквы для "ИЗ" с артикулами и откуда вводить данные
И вопрос: если макро не найдёт в таблице "В" артикулы из таблицы "ИЗ", он не поделит себя на ноль? и как узнать какие он не нашёл?

Zegordo

REM  *****  BASIC  *****

Sub Main   Dim oURL$, oTitle$, p$, i%, j%, hDoc, hData, oData
oURL=ConvertFromURL(ThisComponent.URL)
oTitle=ThisComponent.Title
p=left(oURL,len(oURL)-len(oTitle))
Dim a(0) As new com.sun.star.beans.PropertyValue
a(0).Name="Hidden"
a(0).Value=true
hDoc=StarDesktop.LoadComponentFromUrl(ConvertToURL(p)+"ИЗЗ.ods","_blank",0,a())
hData=hDoc.Sheets(0).getCellRangeByPosition(0,1,1,UBound(hDoc.Sheets(0).Data)).DataArray
oData=ThisComponent.Sheets(0).getCellRangeByPosition(0,1,2,UBound(ThisComponent.Sheets(0).Data)).DataArray
For i=0 To UBound(oData)
For j=0 To UBound(hData)
If oData(i)(0)=hData(j)(0) Then oData(i)(2)=hData(j)(1)
Next
Next
ThisComponent.Sheets(0).getCellRangeByPosition(0,1,2,UBound(ThisComponent.Sheets(0).Data)).setDataArray(oData)
hDoc.Close(true)
End Sub

это код макроса от комрада выше.
скажите пожалуйста, какие в нём строчки цепляют столбы из документа ИЗ и какие строчки в документе В записывает и сверяет?