Вроде должно быть всё просто, но что то не могу найти как сделать. Есть ячейка в ней текст 500х700х300
Ставлю формулу =ПОДСТАВИТЬ(A1;"х";"*";) Получаю "Знач" Дальше пытался присоединить сюда ДВссыл и правдами и неправдами присоединить знак "=" Всё тщетно
Что делаю не так? и как мне текст 500х700х300 заменить на формулу =500*700*300
Начал изучать PQ и умные таблицы. Оказалось всё не так радужно как представлялось. (Да и информации в интернете как-то меньше чем думалось) Создал файл, сделал в нём 12 вкладок и на каждой умная таблица с одинаковыми заголовками и кол-вом столбцов Дальше встала задача объединить эти таблицы в одну (по сути скопировать друг под друга). Ну и я такой думаю этож умные таблицы щас я влёгкую сделаю сводную за секунду, просто перечислив названия таблиц. На самом деле нихрена так не работает оказалось надо делать 12 запросов PQ и потом запрос, объединяющий эти запросы.
В общем к сути дела Вопрос такой "Можно ли, при создании запроса Power Query к другому файлу Excel, указать в качестве результата не весь лист(вкладку) а только диапазон умной таблицы находящейся на этой вкладке?"
Вот такой код мне пишет PQ когда обращается ко всему листу. (но должен же быть способ сказать ему обратится не ко всему листу а к диапазону, к умной таблице)
Код
let
Источник = Excel.Workbook(File.Contents("C:\Users\Admin\Desktop\ШАБЛОН Свод данных по запасам.xlsb"), null, true),
Базасвод1 = Источник{[Name="Базасвод"]}[Data]
in
Базасвод1
Что то никак не могу найти информацию как сделать это объединение везде пишут про повер квери или про консолидацию. Но мне нужно чтобы вид таблицы не менялся чтобы она не становилось умной.
Тоесть для лучшего понимания например: Есть таблица (она может быть простой типо 4 колонки "товар/ цена/ сумма/ комент", а может быть какойнить замудреной на формулах но заполнятся в ней будет теже 4 колонки)
И вот есть эта таблица она рассылается 10 разным людям и они заполнив каждый свои строчки (строчки и текстовые и числовые) присылают обратно.
И всё что прислали надо соединить в одну таблицу, в виде просто обычной таблицы не преобразовывая её никак. Тоесть какбы добиться эффекта что каждый заполнял по очереди один и тотже файл
Первая мысль которая меня посетила это закопировать данные 10 присланных таблиц друг под друга подряд, удалить дубликаты и через впр собрать в одной, заменив потом впр значениями. Но тоже не сказать чтобы простой способ.
Плюс если ктото изменит свою таблицу (типо ой не указал вот это) то надо искать фрагмент в общей и его по новой вставлять, в общем тот ещё гемор).
Может кто что предложит подойдут любые варианты не меняющие вид таблицы ( в тч макросы) Тоесть просто из 10 одинаковых таблиц собрать значения в одну)
Есть таблица в ней по определённой методике присваиваются значения. Основа этой методики ВПР, который ищет определенную связку, и если находит, то ставит соответствующее значение.
Вопрос возможно ли сделать так чтобы формула искала не точное совпадение а частичное.
Основная сложность в том что, например при использовании ВПР, у меня искомое значение как бы фиксированное.
В общем словами сложно описать.
Приложил файл, в нём постарался максимально подробно описать ситуацию.
На просторах интернета была найдена статья Как получить данные из закрытой книги? Из различных вариантов был выбран макрос с названием "метод - при помощи GetObject"
Описание ситуации: Есть 2 файла .xlsb В первом файле массив данных из 1С к которому прикручено множество формул "ЕСЛИ" и "ВПР" которые друг внутри друга и куча вспом листов из которых берутся данные для этих формул Во втором файле, по сути данные из первого файла по схеме копировать вставить "значениями+форматирование" и на основе этих данных сводные таблицы. Сами файлы лежат на сетевом диске в разных папках
Задача: Облегчить пользователю процесс копирования данных из одного файла в другой при помощи макроса. Получается "файл номер 1" формирует данные, а "файл номер 2" эти данные использует как значения Таким образом выгрузив данные в "файл номер 2" можно быстро и без подтормаживаний работать с данными в т.ч. автофильтром
Пользователь знает о существовании обоих файлов иногда может работать одновременно в двух а иногда только в одном. Плюс чаще будет ситуация когда первый пользователь меняет данные в 1 файле а второй пользователь их подгружает во 2 файл
Желательно чтобы внешний вид данных не менялся, просто формулы менялись на значения (так как файл на формулах очень много весит за счет самих формул и кол-ва строк)
Применяемое решение: Макрос через GetObject вполне подходит. С другими макросами были проблемы в плане форматирования, плюс пустые ячейки заменялись на ноль, и некоторые данные неправильно отображались (например текст 44.02 менялся на 44,02) и прочие подобные проблемы. Но в GetObject таких проблем вроде нет. Так что он устраивает.
Мои знания по разделу макросы: Самый начальный уровень (добавить новый модуль/осознаём как сделать название макроса/в остальном всё на уровне копировать вставить/)
Используемая версия Excel: Microsoft Office 2016
Вопросы: Вопрос 1 Возможно есть уже какойто более новый и лёгкий способ решить задачу? (чтобы не вдаватся в подробности и не засорять тему напишите очень кратко или просто дайте ссылку) (так как меня всётаки больше интерисует доработка макроса)
2 Приложу макрос в том виде, в котором он получился у меня и чуть ниже опишу вопросы конкретно по макросу.
Код
Sub Скопировать_данные_из_основной_таблицы()
Dim sShName As String, sAddress As String, vData
Dim objCloseBook As Object
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("C:\Users\Admin\Desktop\рабочий файл\01 Массив формулами 2024.xlsb")
sAddress = "1:300000"
'получаем значение
vData = objCloseBook.Sheets("База").Range(sAddress).Copy
'Записываем данные на активный лист книги,
'с которой запустили макрос
If IsArray(vData) Then
[A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
[A1] = vData
[A1].PasteSpecial xlPasteValues 'вставляем значения
[A1].PasteSpecial xlPasteFormats 'вставляем форматы
End If
'Чистим буфер обмена
objCloseBook.Sheets("База").Range("A1").Copy
'Закрываем книгу(из которой получали значения) без сохранения
objCloseBook.Close False
'Включаем обновление экрана
Application.ScreenUpdating = True
End Sub
Певая проблема которая возникла стало выскакивать сообщение "Хотите ли вы сохранить большой объем данных в буффере обмена" так появилась строчка (и проблема ушла)
Код
'Чистим буфер обмена
objCloseBook.Sheets("База").Range("A1").Copy
Следуший вопрос который появился "Что будет если прожать макрос в то время как первая книга с данными открыта у другого пользователя" Логика подсказывает что должно появится сообщее "Желаете открыть книгу в режиме чтения /Да/Нет/" Но этого собщения не появляется и макрос просто копирует данные и вродебы это устраивает. Но я доконца не протестировал правильно ли он копирует. Странно что ничего не спрашивает, но вроде копирование проводит и ошибку не выдаёт.
Вопрос 2.А Учитывая что знания по макросам, у меня нулевые, предполагаю что вот эти строки вообще лишние и их надо зачистить? но я не уверен.
Код
If IsArray(vData) Then
[A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
[A1] = vData
Вопрос 2.Б Как в этот код добавить проверку на то открыта ли у пользователя книга из которой берутся данные? (по логике описанной ниже) Получается если она открыта и там были изменения, макрос копирует данные с этими "изменениями" и закрывает книгу не сохраняя её К этому вопросу, опятьже найдена статья на просторах интернета. ru(тчк)stackoverflow(тчк)com/questions/1169701
В которой очень удачно описана логика действий (хотелосьбы также) 'проверяем, открыта ли книга' 'если закрыта, открываем, если открыта - обращаемся к открытой' 'если это мы ее открыли, закрываем'
Код на всякий случай приложу, но но сделан вообще в другом формате по сравнению с нашим, поэтому в нём мы только смотрим логику. Этот код нигде, ни как не используется, это пример, его редактировать не нужно.
Скрытый текст
Код
Dim isOpen As Boolean
Dim wb As Workbook
Const originalPath As String = "C:\example.xlsm"
Const fileName As String = "example.xlsm"
'проверяем, открыта ли книга'
isOpen = IsBookOpen(originalPath)
'выключаем уведомления'
With Application: .ScreenUpdating = False: .DisplayAlerts = False: End With
'если закрыта, открываем, если открыта - обращаемся к открытой'
If Not isOpen Then Set wb = Workbooks.Open(originalPath)
If isOpen Then Set wb = Workbooks(fileName)
'строчка для того, чтобы посчитать и вытащить значения в текущую книгу'
ThisWorkbook.Activate
'начинаем работу со сторонней книгой'
On Error Resume Next
With wb.Worksheets("name")
'...'
End With
'закончили работу со сторонней книгой'
'если это мы ее открыли, закрываем'
If Not isOpen Then wb.Close savechanges:=False
'включаем уведомления обратно'
With Application: .ScreenUpdating = True: .DisplayAlerts = True: End With
Вопрос 2.В В этой части "нашего" кода описано как записать данные на активный лист. А как записать данные не на активный лист а на тот который я выберу?
Код
'Записываем данные на активный лист книги,
'с которой запустили макрос
If IsArray(vData) Then
[A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
[A1] = vData
[A1].PasteSpecial xlPasteValues 'вставляем значения
[A1].PasteSpecial xlPasteFormats 'вставляем форматы
End If
Тоесть допустим книга в которой у меня макрос содержить 3 листа 1 лист "Кнопки с макросами" 2 лист "Данные из листа База" (сами данные соответственно в файле GetObject("C:\Users\Admin\Desktop\рабочий файл\01 Массив формулами 2024.xlsb")/objCloseBook.Sheets("База")) 3 лист "Данные из листа База2" (сами данные соответственно в файле GetObject("C:\Users\Admin\Desktop\рабочий файл\01 Массив формулами 2024.xlsb"/objCloseBook.Sheets("База2"))) И нажимаем одни макрос выгружается лист "база", нажимаем другой выгружается лист "база2" (у каждого листа свой источник)
Вопрос 2.Г Былобы вообще идеально (если канеш не сложно) понять как использовать макрос в обратном направлении. Не "брать" данные из закрытой книги, а "ложить" данные в закрытую книгу. (Этот вариант мне даже нравится больше так как в файле со значениями не нужно будет делать макрос, и пользователю не нужно будет включать макросы) (Плюс файл со значениями, весит меньше чем основной(на формулах), а значит открывается быстрее, и соответственно макрос выполняется быстрее)
Тоесть я например, в основном файле с данными, провёл анализ, формулами всё распределил, нажал макрос. И макрос открыл книгу в которой всё стоит значениями и поставил туда новые данные, тоже значениями. При этом проверил, перед вставкой занята ли книга какимто пользователем, если занята то вести сообщение "что с книгой работает другой пользователь, в идеале фио этого пользователя) И также проверил открыта ли книга в которую вставляем данные, у меня. И соответственно также нужно название листов (Брать из "файла 1" с листа "база" ложить в "файл 2" на лист "данные из база"
Ещё лучше чтобы данные копировались не в одну книгу а сразу в две (тоесть весь тот же алгоритм, но не один файл со значениями, а два) Важно понимать что не нужно создавать новые файлы (нужно обновлять данные в старых)
Все вопросы в данной теме по сути касаются одного и тогоже макроса поэтому делить на несколько тем не целесообразно. Приложу файл базы, зачищенный от всего что можно включая колонки и формулы (по сути можно взять вообще любую базу)