Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Что быстрее именованные диапазоны или умные таблицы
 
Цитата
ПооХкрд написал:
Искать границы диапазона формуле не нужно, эти данные все время хранятся в оперативке и загружаются в неё сразу при открытии файла
в именованном диапазоне, чтобы сделать его динамическим, нужно писать формулу, что-то типа
Код
=$A$2:ИНДЕКС($A$2:$A$100000; ПОИСКПОЗ(ПОВТОР("я";255);A2:A100000))

Вот и вопрос разве на связку индекс+поискпоз не будет постоянно тратиться ресурс?

Именованных диапазонов будет много, почти все столбцы

Что быстрее именованные диапазоны или умные таблицы
 
Ігор Гончаренко, спасибо. Тогда второй вопрос по именованным диапазонам:
использовать столбец целиком или же делать их динамическими?
Мое предположение, что особой разницы не будет из-за того,  что ресурсы на обработку статичного диапазона в целый столбец будут соизмеримы с ресурсами на поиск границ того самого динамического диапазона.
Или я неправ?

Речь не идет про динамические диапазоны в последних версиях 365 офиса, т.к. установлен офис 2019, а там этой фишки нет и приходится руками в именованных диапазонах извращаться
Изменено: BapuK - 23.07.2020 06:46:39
Что быстрее именованные диапазоны или умные таблицы
 
Цитата
PooHkrd написал:
VBA и Power Query быстрее. На таких объемах лучше без формул. И шансов ошибиться при копированиях/протягиваниях значительно меньше.
А лучше Python и MySQL и без экселя)
VBA будет использоваться для выгрузки данных, а все для чего мог бы понадобиться PQ планирую реализовать в БД из которой будут данные выгружаться

Цитата
Ігор Гончаренко написал:
ничего оптимизировать не получится пока не сократите количество формул
Количество формул и планируется сократить, т.к. будем переделывать БД с нуля, просто я замечал иногда, при работе с умными таблицами бывают зависоны, когда удаляешь строки, что-то дополнительно ВПРишь и т.п. хотя количество строк в таблице не превышало 10к, а формулы были написаны в 1-5 столбцах. Хотя недавно посмотрел видео,  где демонстрируется, что работа с умными таблицами сокращает время работы ВПРов и тому подобных формул.
Что быстрее именованные диапазоны или умные таблицы
 
Добрый день!
В месте где я работаю на моей должности используется большой экселевский файл, в который выгружается информация из БД порядка ~60 столбцов, плюс правее еще столько же столбцов, в которых записано куча формул с ВПР, СУММЕСЛИМН и подобными.
Количество строк в файле при этом может достигать и значений в 50000, т.е. итого порядка 6 млн. рабочих ячеек
Сейчас занимаюсь оптимизацией всего этого, т.к. местами работать стало невозможно.
При работе есть необходимость использовать именнованные диапазоны на столбцы для читабельности формул.

И собственно вопрос: что потенциально с таким количеством данных будет работать быстрее умная таблица или именованные диапазоны? Если именованные диапазоны, то какие: динамические или целый столбец = именованный диапазон?

Заранее спасибо за ваши ответы)
Изменено: BapuK - 22.07.2020 08:34:11
Необходимо переписать макрос выгрузки из access в excel
 
Андрей VG, если использовать ACE OLEDB 12.0 - это нормальные современные методы или есть что-то получше?

Нашел вот такой кусок кода:
Код
Private Sub Workbook_Open()Dim cn As Object, rs As Object
Dim intColIndex As Integer
Dim DBFullName As String
Dim TargetRange As Range
 
On Error GoTo Whoa
Set TargetRange = ActiveSheet.Range("A1")
 
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=T:\Tablica\TestMDB.mdb;" & _
              "Jet OLEDB:Database Password='****';"
 
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM TEST2", cn, , , adCmdText
 
' Write the field names
For intColIndex = 0 To rs.Fields.Count - 1
    TargetRange.Offset(1 - 1, intColIndex).Value = rs.Fields(intColIndex).Name 'ori nie bylo -1
Next
 
' Write recordset
TargetRange.Offset(1, 0).CopyFromRecordset rs
 
LetsContinue:
 
On Error Resume Next
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
On Error GoTo 0
Exit Sub
Whoa:
MsgBox "Error Description :" & Err.Description & vbCrLf & _
   "Error at line     :" & Erl & vbCrLf & _
   "Error Number      :" & Err.Number
Resume LetsContinue
End Sub
Изменено: BapuK - 19.01.2020 02:41:56
Необходимо переписать макрос выгрузки из access в excel
 
Всем привет
Имеется файл Excel, в который из базы Access макросом копируется часть данных из нужной таблицы с необходимыми фильтрами.
Внизу кусок кода, который за это отвечает.

Проблемы, которые хочется решить:
1) Файл не работает на 64-разрядной версии (а хочется, чтобы работал)
2) Файл не работает на версии Excel выше 2013 года (а хочется, использовать последнюю версию Excel)
3) На некоторых компьютерах файл иногда зависает, когда база Access и файл Excel лежат на сетевом диске, а не на диске компьютера

Если попробовать поменять версию, на ту, которая не соответствует одному из параметров, то Excel выдает ошибку ODBC 1004 на предпоследней строке кода

Можно переделать полностью базу Access, т.к. я подозреваю, что она тоже не оптимальна, т.к. сделана лет 7 назад, только данные обновляются ежедневно
Можно полностью переписать код макроса.
Подскажите что лучше сделать или подскажите что лучше почитать, чтобы это сделать самостоятельно?)

Комментарии по коду: переменные MySource, MyTable, MySelection, MyFilter определяются выше
MySource - путь к текущей папке, где лежит файл Excel и база Access
MyTable - Таблица в базе Access
MySelection - Имя одного из столбцов таблицы
MyFilter - одно из значений, которое может встретиться в столбце MySelection

P.S. использовать PQ не предлагать, нужна именно выгрузка значений из базы Access, чтоб потом их обрабатывать формулами, которые неудобно использовать в умных таблицах.
Код
With Sheets("Лист1").Cells(1, 1).QueryTable
.Connection = "ODBC;DBQ=" & MySource & "\Base.mdb; Default Dir=" & MySource & _
";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;" & _
"PageTimeout=5;ReadOnly=1;Safe Transactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"
.CommandText = Array( _
"SELECT ", _
"`Столбец1`, `Столбец2`,`Столбец3`" _
& Chr(13) & "" & Chr(10) & _
"FROM " & MyTable & Chr(13) & "" & Chr(10) & _
"WHERE (" & MySelection & "='" & MyFilter & "')" _
)
.Refresh BackgroundQuery:=False
End With
Изменено: BapuK - 18.01.2020 13:13:02
Принудительный пересчет книги
 
Добрый день.
Подскажите как с помощью макроса заставить пользователя дождаться пересчета книги?
Макрос расставляет много формул в большое количество ячеек и когда макрос заканчивает свою работу и можно уже менять значения в ячейках и многое другое, но формулы еще не посчитались.
Добавление строки Application.Calculate в конец макроса не помогает - макрос заканчивается раньше чем пересчет книги.
Имя столбца с наименьшим значением PQ
 
Цитата
PooHkrd написал:
Там вроде все просто.Вот только как вы его планировали применить - моей фантазии не хватает.
Сделать что-то типа

Код
КтоМолодец=Expression.Evaluate("=ФИО{List.PositionOf({"&ФИО_со_скобками&"},[МаксСумма])}")

Где ФИО_со_скобками это текст [Вася],[Коля],[Маша],[Петя] - который формируется, в зависимости от исходной таблицы
Имя столбца с наименьшим значением PQ
 
PooHkrd,то что нужно, а то я уже начал разбираться как работает Expression.Evaluate() и мой мозг начал уже взрываться  :D
Имя столбца с наименьшим значением PQ
 
Цитата
PooHkrd написал:
а вложение в яйце, а яйцо в утке, а утка улетела, поискать в районе функции Table.ColumnNames
Добавил утку в шапку   :D

Функцию Table.ColumnNames как раз использовал для получения списка, проблема в том, что нужно задать переменные параметры для функции List.PositionOf,
я в принципе даже могу сформировать текст "{[Вася],[Коля],[Маша],[Петя]}" средствами PQ, который нужно подать этой функции, но как сделать так чтобы этот текст преобразовывался в ссылку на столбцы не пойму (типа как в excel работает ДВССЫЛ())
Изменено: BapuK - 08.11.2018 17:48:22
Имя столбца с наименьшим значением PQ
 

Добрый день.
Наткнулся на следующую проблему, задача похожая как в ссылке:

https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=95733

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

Научился делать отдельный список из имен столбцов, но дальше дело зашло в тупик  :(

Пример во вложении.

Суть вопроса: как изменить вычисление столбца "КтоМолодец":

Код
=ФИО{List.PositionOf({[Вася],[Коля],[Маша],[Петя]},[МаксСумма])}

так, чтобы, если добавится новый человек,то не нужно было менять код?

Изменено: BapuK - 08.11.2018 17:41:12 (забыл вложение)
Ошибка Out of range при работе с динамическим массивом
 
БМВ, sokol92, спасибо большое  :oops:  буду разбираться и пробовать, если появятся вопросы - напишу  :)  
Ошибка Out of range при работе с динамическим массивом
 
Это удобно, т.к. 0-й элемент массива соответствует данным РЦ (а там не один массив, а несколько), а с 1-й по i-й соответствуют 1-му - i-му магазину. В некоторых местах вызывается номер магазина, чтобы не было путаницы при написании формул и писанины из разряда
Код
"Магазин № "& i - 1
Ошибка Out of range при работе с динамическим массивом
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Чтобы начинался с нуля - что за требование? Есть логическое объяснение, кроме "мне так хочется"?
Если кратко, то данные самой первой строки в таблице того же типа, что и ниже, но обрабатываться будут немного по-другому.
Если более длинно, то я занимаюсь сейчас моделированием товародвижения розничной сети, и в каждой строке именованной таблицы данные соответствуют некоторому магазину, а самая первая строка - данные РЦ, к примеру в первом столбце записаны остатки на магазинах+РЦ.

P.S.  в принципе все работало (в массивы забивал данные циклом), до того момента, как я решил начать работать с именованным диапазоном (уже местами жалею, но хочется добить)

Цитата
Дмитрий(The_Prist) Щербаков написал: Это можно сделать и так:
Спасибо, попробую разобраться.

Цитата
БМВ написал: и сейчас ТС козырем
К счастью пока не требуется :D
Ошибка Out of range при работе с динамическим массивом
 
Дмитрий(The_Prist) Щербаков, ок попробую еще раз: есть именованная таблица ("Таблица1"), в ней есть столбец ("Столбец1").
Мне нужно в массив "Test" записать все значения из именованного диапазона "Таблица1[Столбец1]".
По поводу массива Test - желательно, чтобы он был одномерный, желательно, чтобы нумерация ячеек начиналась с 0, а не с 1.
Так же желательно, чтобы пустого хвоста в данном массиве не было, т.е. если начиная с некоторой ячейки (i-ой по счету) в "Таблица1[Столбец1]" все ячейки пустые, то массив заканчивался на i-ой ячейке.


Почему используется именованный диапазон - потому что внешний вид данной таблицы будет меняться, возможно дополняться новыми столбцами и нужный столбец может съехать с фиксированного адреса, и чтобы не лопатить код заново - хочется работать именно с именованным диапазоном.
После запуска макроса все действия будут происходить на другом листе, на первом листе расположены как-бы "входные данные"
Изменено: BapuK - 19.07.2018 12:51:00
Ошибка Out of range при работе с динамическим массивом
 
Андрей VG, ну это понятно, но данная операция в данном случае будет происходить всегда в самом начале алгоритма. Зачем от начала и до конца работы тянуть ненужный кусок массива, если его можно отрубить в самом начале?
В принципе я понял, как можно работать со статическим массивом, но тогда открытым остается вопрос: как исправить данный кусок кода:


Код
Test = Range("Таблица1[Столбец1]").Value

чтобы он сработал для статического массива Test?
Изменено: BapuK - 19.07.2018 11:44:51
Ошибка Out of range при работе с динамическим массивом
 
Дмитрий(The_Prist) Щербаков, но если работать со статическим массивом, я не пойму как изменить нужно:
Код
Test = Range("Таблица1[Столбец1]").Value


чтобы, он заполнил массив из определенного столбца, т.к. такое работает только для динамического массива.


Сразу скажу, что от именованных списков отказываться не хочется, т.к. структура таблицы будет дополняться и изменяться, и потом не хочется перелопачивать код из-за того, что поменял структуру.
Изменено: BapuK - 19.07.2018 11:01:45
Ошибка Out of range при работе с динамическим массивом
 
Дмитрий(The_Prist) Щербаков, Каждый раз при нажатии данной кнопки заполненных строк будет разное количество, зачем выделять лишнюю память под это?
Ошибка Out of range при работе с динамическим массивом
 
Цитата
Казанский написал:
Почему именно в одномерный? Что мешает работать с двумерным массивом?
Ну насколько я понял работу ReDim - он может менять размерность только последнего измерения, а у меня варьироваться будет количество строк.
Ошибка Out of range при работе с динамическим массивом
 
БМВ,спасибо, буду знать.
Дмитрий(The_Prist) Щербаков, текст набирал с телефона - ошибся при переносе, в исходном коде так и было прописано. Матчасть проходил, просто было давно, некоторые вещи подзабыл, да и гугл не подсказал чет (:

Тогда такой вопрос: если я хочу загнать в динамический одномерный массив данные из столбца, то без цикла не обойтись?
Вообще у меня сейчас вот какая задача стоит: есть именованная таблица с некоторым числом столбцов (назовем ее для удобства "Таблица1").Мне нужно, что после нажатия на кнопку данные из определенного столбца (назовем его "Столбец1") записались в одномерный массив. Думал что прокатит что-то типа:

Код
Test = Range("Таблица1[Столбец1]").Value

Но видимо нужно думать все таки в  сторону циклов...

Изменено: BapuK - 19.07.2018 10:24:52
Ошибка Out of range при работе с динамическим массивом
 
БМВ, эээ как так?
Часть столбца всего лишь, почему он 2хмерный?
Ошибка Out of range при работе с динамическим массивом
 
Добрый день.

Разбираюсь с динамическими массивами. Связал кнопку с макросом, после нажатия на нее вылетает указанная ошибка.
Код:
Код
Sub Knopka_Click ()
 Dim test
 test = Range("E2:E22")
 ReDim Preserve test (21)
 Range ("B6").Value = test(4)
End Sub
Ошибка вылетает уже на 4 строке, не пойму что не так делаю, в ячейках E2:E22 записаны числа, ячейка B6 - пустая.
Вместо ReDim Preserve test (21) пробовал уже:
ReDim Preserve test (0 to 21)
ReDim Preserve test (1 to 21)
ReDim Preserve test (1 to 22)

Ошибка все та же.
Страницы: 1
Наверх