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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 89 След.
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Jack Famous, понял, спасибо. Я бы еще дополнил, что фильтр различает строки и числа. И элементы "1" и 1 - это разные сущности. За счет чего, к примеру, можно отсеять текст от числа. В карте и словарях - это одно и то же и отделить текст и числа не получится.
Изменено: bedvit - 14.05.2024 11:03:08
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Jack Famous, привет! Правильно ли я понимаю, что это тест на поиск по точноиу совпадению уникальных строк? А если в массиве есть дубликаты, какой способ быстрее? Или кроме фильтра, другие не отработают?
«Бритва Оккама» или «Принцип Калашникова»?
"Статичный" фильтр. Как ускорить фильтрацию двумерного массива, Static Filter. How to SpeedUp Filter of 2D-Array
 
Цитата
Jack Famous написал:
инструмента для пересбора
Здесь понятно.
Цитата
Jack Famous написал:
Очень не хватает твоей реализации сцепки по условию
А здесь нет.
«Бритва Оккама» или «Принцип Калашникова»?
"Статичный" фильтр. Как ускорить фильтрацию двумерного массива, Static Filter. How to SpeedUp Filter of 2D-Array
 
Цитата
bedvit написал:
быстрый пересбор двумерного массива по заданному списку строк
это уже реализованно в фильтре в нашей библе - по строкам проходящих заданные условия.
Изменено: bedvit - 27.04.2024 21:32:27
«Бритва Оккама» или «Принцип Калашникова»?
"Статичный" фильтр. Как ускорить фильтрацию двумерного массива, Static Filter. How to SpeedUp Filter of 2D-Array
 
Цитата
Jack Famous написал:
Однако, на больших объёмах он вполне может уступить (надо протестировать).
Интересен результат, жду тестов.

Цитата
Jack Famous написал:
2. Если просто повторить
повторить не выйдет из-за разной концепции доступа к данным в памяти в VBA и С++ и соответственно разной реализации нужного функционала.
«Бритва Оккама» или «Принцип Калашникова»?
"Статичный" фильтр. Как ускорить фильтрацию двумерного массива, Static Filter. How to SpeedUp Filter of 2D-Array
 
Jack Famous, привет!
По твоей теме, можно кратко:
1.Почему не подходит фильтр из нашей библы?
2.Какой инструмент написанный на С++, ты думаешь будет широким в применении, кратко, концепцию?
Изменено: bedvit - 27.04.2024 18:47:52
«Бритва Оккама» или «Принцип Калашникова»?
Зачем сражаться за секунды выигрыша по скорости работы макроса?
 
Цитата
nilske написал:
такую  КРАСОТУ
От Автора-оптимизатора: "Небольшая статистика того что получилось:
18 модулей против 1 у Васи
~380 строк кода (из них можно смело вычесть примерно 20 строк, т.к. это атрибуты Rubberduck) против ~100 у Васи".
Изменено: bedvit - 27.04.2024 08:41:27
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
AndyF, спасибо за тесты. Интересно, работают ли другие XLL в этой конфигурации. Нужно найти еще какую либо и протестировать :)
Складывается впечатление, что это проблема на стороне Excel. 2007 этот первая версия с увеличенным количеством строк и новым типом данных в C API Excel - XLOPER12. Я использую этот тип. Возможно это как -то взаимосвязано.
Изменено: bedvit - 23.04.2024 17:52:27
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
AndyF, не пользовался этим сервисом. Да и не у всех организаций есть постоянный онлайн для сотрудников.
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
Цитата
AndyF написал:
Excel x32, как они будут работать на х64
если нет WinApi, то ничего не изменится.
Может есть возможность в другой версии Excel. 2007 не очень удачный с меню и с его настройкой, как по мне.
Опять же х64 может использовать оперативки больше чем 2 Гбайт. Я из-за этого и перешел на х64.
Изменено: bedvit - 20.04.2024 17:31:26
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
AndyF, обычно это ошибка означает разную разрядность Excel и XLL. Попробуйте х64 поставить.
Проблем ранее с Win7 не замечал.

Тестировал ранее:
Win7х64 и Excel 2016 x32 - норм
Win7х64 и Excel 2016 x64 - норм
Win10х64 и Excel 2010 x32 - норм.
Win10х64 и Excel 2013 x64 - норм.
Win10х64 и Excel 2019 x64, норм.

И выше Михаил тестировал с Win 7 без замечаний.

Если не удастся подключится, попробуем на пустой болванке. Откроется ли.
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
Андрей Гайдамака, добрый день. Какая ОС? Не поддерживается WinXP.
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
testuser написал:
в vba получить указатель разименовать, поработать с данными, и отпустить указатель,  как буд-то ни чего не был,  а менеджер памти Excel пусть делает что хочет. В общем на VBa все это не проблемма
Теперь все прояснилось, благодарю.
Цитата
testuser написал:
нельзя ли ее привести к какому-то такому виду?
Уверен, что после указателей, вам не составит труда справится и с этой проблемой!
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
testuser написал:
MS почему-то нет по ней информации

Скрытый текст


Цитата
testuser написал:
освобождение указателя на массив, но это не проблема.
уверен, что вы не до конца понимаете с чем столкнетесь. Зачем вам это? Как вы с этими данными будете работать?
Не будет там никакого safearrey, это СОМ, не путайте.

Советую к ознакомлению. Memory Management in Excel
Изменено: bedvit - 18.04.2024 13:43:59
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
testuser написал:
передавать/получать данные непосредственно по указателю массива типа XLOPER12??
передавать куда, и получать откуда? XLOPER12 это Си-шная структура, кто будет управлять памятью, когда я вам передам указатель на массив? Кто будет освобождать память занятую элементами массива? Каковы границы жизни указателя на массив и данных в нем (связан с первыми вопросами)?
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Что отфильтровать? При чем здесь умная таблица? Если ты про свое, то я говорю про обычную выгрузку и про копи-паст. Все они вставляют в скрытый диапазон. А про то, о чем ты говоришь - я без кода не понимаю.
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
Jack Famous написал:
ВЫГРУЗКЕ (практически ей и является), а у неё заполнение скрытых ячеек, как раз, не осуществляется.
Напиши код, когда ОБЫЧНАЯ выгрузка не заполняет скрытые ячейки.

У меня ОБЫЧНАЯ выгрузка все заполняет.
Код
  Range("a4:a8") = ArrV1
Изменено: bedvit - 18.04.2024 10:37:30
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
Jack Famous написал:
будет "=СУММ(A1:A:5)", то так строкой и вставится?
Да.
Цитата
Jack Famous написал:
Jack Famous : Про вставку в скрытые не упомянул
А может быть по другому? Работает так же, как и обычная вставка - вставляется в указанный диапазон, неважно скрыт он или нет. Штатная работает так же.
Изменено: bedvit - 18.04.2024 10:01:42
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
Jack Famous написал:
про xltypeNil непонятно.
Это Empty.

Добавил варианты использования в первое сообщение.
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Думаю, что в моем классе всё то же самое)
Цитата
testuser написал:
непосредственно на массивы данных в ячеек
- нет такого. Есть данные на "сейчас" пересчитанные или сырые. Хочешь в динамике? Получай ещё раз (см. xlcoerce).
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Цитата
Jack Famous написал:
у тебя 5 аргументов в Run. Скорректируй в соответствии
Спасибо за замечание, переписывал из справки Microsoft, у меня значит 4й в методе и 5 в Run.
Цитата
Jack Famous написал:
xltypeNil непонятно
это пустой XLOPER12, в VBA не смотрел какой это тип. Надо проверить, можете потестировать, возможно Empty.

testuser, да похож на Variant, только немного попроще.
Данный инструмент XLLcmdE12xlSet() по скорости обгоняет .Value2 на 15%
XLOPER12 используется в Excel C API, так же как Variant в VBA. Собственно это основной тип (структура) данных. Для VBA, Excel трансформирует  XLOPER12 в Variant и наоборот. В XLL я делаю это сам (ранее руками, теперь написал свой класс XloperX, даже в новостях от 7.04.24 отметил.)
Изменено: bedvit - 17.04.2024 18:47:49
«Бритва Оккама» или «Принцип Калашникова»?
Вставить данные на лист Excel без преобразования (xlSet)
 
Моё почтение, джентльмены!
Инструмент для вставки данных на лист Excel без преобразования.
т.е. "1" так и вставится как текст, а не как число.

Не нужен апостроф, не нужен формат ячейки.
Нужна надстройка BedvitXLL(бесплатная).

Так же быстро заполняет диапазон одним значением.

Использована функция xlSet из Excel C API.

Функция/Метод XLLcmdE12xlSet(XCHAR * param, LPXLOPER12 param2, LPXLOPER12 pxReference, LPXLOPER12 pxValue)
param - командная строка XLL API - см. "XLL API":
   1й параметр - Режим диалога для комманд меню XLL - см. "Диалог"
param2 – зарезервирован

pxReference - Прямоугольная ссылка (адрес), описывающая целевую ячейку или ячейки. Адрес должен описывать смежные ячейки.

pxValue - Значение или значения, помещаемые в ячейку или ячейки.

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

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

Если целевой диапазон меньше исходного массива, значения копируются до пределов целевого диапазона, а лишние данные из массива игнорируются.

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

Ограничения
Невозможно отменить xlSet . Кроме того, он удаляет все сведения об отмене, которые могли быть доступны ранее.
XlSet может помещать в ячейки только константы, а не формулы. Максимальная длина помещаемой строки 8190 символов.


Возвращает код ошибки: 0 - команда выполнена успешно и Error 2036, #NUM!, #ЧИСЛО! - если ошибка.


Пример использования:
Код
Option Explicit

Sub TestXLLcmdE12xlSet()
    Dim i, testSize As Long: testSize = 2
    Dim arrOrValue: ReDim arrOrValue(1 To testSize, 1 To 1)
    
    For i = 1 To testSize
        arrOrValue(i, 1) = Str(i) 'MAX количество символов для ячейки: 8190
    Next
    
    'Варианты использования:
    '1.Выводим массив или значение по указанному диапазону на лист Excel
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("a1:a2").Address, arrOrValue)
    
    '2. Помещаем в диапазон значение "1"
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("b1:b2").Address, "1")
    
    '3. Выводим массив по указанному диапазону на лист Excel, первый элемент = Empty
    arrOrValue(1, 1) = Empty 'первый элемент Empty
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("c1:c2").Address, arrOrValue)
    
    '4 Очищаем заданный диапазон от данных
    [d1:d5] = 2 'заполняем данными (2) диапазон для теста
    Debug.Print Application.RUN("XLLcmdE12xlSet", "", 0, Range("d1:d2").Address) ' очищаем в заданном диапазоне

End Sub
Изменено: bedvit - 18.04.2024 11:31:00
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Поправил, спасибо.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Цитата
Jack Famous написал:
Я через ENum сделал
Можно и так (все в одном месте), кому как удобно.
Цитата
Jack Famous написал:
У тебя 28 вместо 128, кстати
Где?
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
XLL это обычная надстройка, ее не нужно запускать все время. Ее нужно поместить в папку для надстроек и подключить (поставить галку в надстройках). Если файл открывать из любого другого места, без размещения в надстройках, он будет открыватся как обычный файл, и при закрытии Excel, нужно будет открывать ещё раз.
Еще есть файл установки, он делает все сам (размещает в парке надстроек - надстройку) и подключает её (ставиь галку в надстройках). Выполняется один раз.

Когда перестала работать формула, появлялась ли какая ошибка?
Изменено: bedvit - 05.04.2024 07:45:13
«Бритва Оккама» или «Принцип Калашникова»?
Генерация QR кодов в эксель
 
При каких действиях слетела надстройка? Можно поставить заново и начисто (удалив, в папке надстроек файлыBedvitXLL.dll и BedvitCOM.dll и BedvitXLL.bin). Но хотелось бы понять причину, по которой перестало работать.
«Бритва Оккама» или «Принцип Калашникова»?
Как ускорить эксель?, задействовать всю производительность компьютера для работы Эксель
 
Так бывает когда это выгрузка из 1С и листы скрыты и есть объединенные ячейки.
«Бритва Оккама» или «Принцип Калашникова»?
Экспорт данных из модели Power Pivot в cvs или файлы Excel
 
Цитата
PooHkrd написал:
Смотрите  здесь . Экспериментируйте на копии!
Цитата
Gerzzog написал:
Сработало на модели где немного строк, а вот на большой модели макрос выбивает ошибку "An error occurred - Method Open of object _Recordset failed"
Была задача автоматизировать процесс в одну кнопку.
DAX Studio не справился, потому как я не умею его готовить.

Посему пришлось использовать решение выложенное выше с апгрейдом:
1.Выгружаются данные любого размера (у меня 2,5 млн строк, 60 столбцов, в основном текст)
2.Спец.символы экранируются, в данном случае кавычки
3.Числа сохраняются без кавычек, что правильно распознается SQL-сервером
4.Дата сохраняется в формате, который понимает SQL: "yyyy-mm-dd hh:mm:ss"
5.Отключен Timeout, который вызывал отключение запроса на больших временных отрезках (больших данных): cmd.CommandTimeout = 0 '
6.Поменял фильтр CSV-файлов для нового Excel, кто хочет может допилить до "правильного" кода не привязанного к фильтру, а привязанного к CSV: OFD.FilterIndex = 21
7.Оставил всеми любимый GoTo - на функционал не влияет, кто хочет подпилить - прошу.
8.Файл выгружается в кодировке Windows-1251, не знаю, может ли VBA выгружать в другой, мне было не нужно, можно тоже подпилить при желании.


Да, забыл...
По скорости выгрузки +- паритет с DAX Studio (у меня в тестах быстрее, чем DAX Studio),
Плюс NULL-значения не выгружает (;;), что в SQL и распознается как NULL. DAX Studio выгружает как пустую строку(;"";), что, я считаю, некорректно, т.к. в SQL попадает как пустая строка.
Плюс DAX Studio дату оформляет в виде строки с кавычками так, что SQL не распознает как дату.
Плюс DAX Studio проставляет в число системный разделитель дробной части, т.е. "," (запятая). В инструменте всегда "." (точка), что корректно загружается в SQL.

Из особенностей инструмента: числовые значения если число дробное и меньше нуля, ведущий нуль до разделителя дробной части не проставляется, пример: число 0,002365 отображается как .002365, так отрабатывает Str(), такие числа нормально распознаются, проблем не было. Иногда число отображается в Экспоненциальном виде 2.12344E+21, по той же причине. В моем проекте с этим тоже проблем не было.


Код
'Экспорт в CSV из модели данных PowerQuery
'06.02.2024

'Для работы нужно активировать библиотеки (Tools -> Preferences...):
'-Microsoft Scripting Runtime
'-Microsoft ActiveX Data Objects 6.1 Library
'-Microsoft ActiveX Data Objects Recordset 6.0 Library

Option Explicit

Public FSO     As New FileSystemObject

Sub main()

    Dim ModelList As String
    Dim OFD    As FileDialog
    Dim i      As Integer
    Dim ModelNum As Integer
    Dim tmp    As String
    Dim t

    ModelList = "Доступные в данной книге модели:" + Chr(10) + Chr(13) + Chr(13)
    If ThisWorkbook.Model.ModelTables.Count <> 0 Then
        For i = 1 To ThisWorkbook.Model.ModelTables.Count
            ModelList = ModelList & i & ". " & ThisWorkbook.Model.ModelTables.Item(i).Name & Chr(10) & Chr(13)
        Next i
    Else
        ModelList = ModelList & " Нет доступных моделей"
    End If


ModelNameInput:

    ModelNum = 0
    tmp = InputBox(ModelList, "Введите номер модели")

    If IsNumeric(tmp) Then
        If CInt(tmp) > ThisWorkbook.Model.ModelTables.Count Or CInt(tmp) <= 0 Then
            MsgBox "Incorrect Model num", vbOKOnly
            GoTo ModelNameInput
        Else
            ModelNum = CInt(tmp)
        End If
    Else
        If tmp <> "" Then
            MsgBox "Incorrect Model num", vbOKOnly
            GoTo ModelNameInput
        Else
            Exit Sub
        End If
    End If

    Set OFD = Application.FileDialog(msoFileDialogSaveAs)

    OFD.Title = "Выберите путь и имя файла"
    OFD.ButtonName = "Сохранить"
    OFD.FilterIndex = 21
    OFD.InitialFileName = "export.csv"
    OFD.InitialView = msoFileDialogViewLargeIcons

    t = Timer
    If OFD.Show <> 0 Then
        Call ExportToCsv(ThisWorkbook.Model.ModelTables.Item(ModelNum).Name, OFD.SelectedItems.Item(1), True)
    Else
    End If
    
    Set OFD = Nothing
    MsgBox "Готово! Время, сек.: " & (Timer - t), vbInformation
End Sub


Public Sub ExportToCsv(QueryName As String, exportPath As String, ShowColumnNames As Boolean)
    Dim wbTarget As Workbook
'    Dim ws As Worksheet
    Dim rs As Object
    Dim cmd As New ADODB.Command
    Dim fileCSV As TextStream
    Dim i As Long, x, max_iter, iter, sn, row, col, strCSV As String
    Dim batch_size: batch_size = 1000 ' Размер одного блока '1000
    
    Application.StatusBar = "(" & Now() & ") Экспорт данных в CSV..."
    DoEvents
    
    Set wbTarget = ThisWorkbook

    ' Загрузка модели
    wbTarget.Model.Initialize

    'Send query to the model
    Set cmd.ActiveConnection = wbTarget.Model.DataModelConnection.ModelConnection.ADOConnection
    cmd.CommandTimeout = 0 ' Отключение прерывания подключения после определенного времени
    cmd.CommandText = "EVALUATE '" & QueryName & "'"   '

    Set rs = CreateObject("ADODB.Recordset")
    rs.Open cmd

    Set fileCSV = FSO.CreateTextFile(exportPath, True)

    If ShowColumnNames Then
        For i = 0 To rs.Fields.Count - 1
            strCSV = strCSV & IIf(i > 0, ";", "") & VarToCSV(Mid(rs.Fields(i).Name, InStr(1, rs.Fields(i).Name, "[") + 1, Len(rs.Fields(i).Name) - InStr(1, rs.Fields(i).Name, "[") - 1))
        Next i

        fileCSV.Write strCSV & vbNewLine
    End If
    
    max_iter = rs.RecordCount \ batch_size + IIf(rs.RecordCount Mod batch_size, 1, 0)
    For iter = 1 To max_iter
        sn = rs.GetRows(batch_size)

        ReDim c(0 To UBound(sn))
        ReDim b(0 To UBound(sn, 2))

        For row = 0 To UBound(sn, 2)
            For col = 0 To UBound(sn)
                c(col) = VarToCSV(sn(col, row))
            Next
            b(row) = Join(c, ";") 'строка
        Next
        strCSV = Join(b, vbNewLine) & vbNewLine 'строки
        fileCSV.Write strCSV
    Next iter

    fileCSV.Close
    rs.Close
    Set fileCSV = Nothing
    Set rs = Nothing
    Set cmd = Nothing
    
    Application.StatusBar = False

End Sub

Function VarToCSV(ByVal v) As String

    If VarType(v) = vbDate Then
        If v = Int(v) Then
            VarToCSV = FORMAT(v, "yyyy-mm-dd")
        Else
            VarToCSV = FORMAT(v, "yyyy-mm-dd hh:mm:ss")
        End If
            VarToCSV = """" & VarToCSV & """"
            
    ElseIf VarType(v) = vbString Then
        VarToCSV = """" & Replace(v, """", """""") & """"
        
    ElseIf VarType(v) = vbEmpty Then
        VarToCSV = "" '"NULL"
        
    ElseIf VarType(v) = vbNull Then
        VarToCSV = "" '"NULL"
        
    Else
        VarToCSV = Trim(Str(v))
        
    End If
    
End Function

Изменено: bedvit - 06.02.2024 18:43:23
«Бритва Оккама» или «Принцип Калашникова»?
Шифрование данных на листе Excel и в VBA
 
04.02.2024 BedvitXLL.dll_v5.1

+XLLcmdRangeStore() - добавлена возможность использования разных локализаций и разной разрядности Excel при шифровании, дешифровки и сохранении формул/значений (см. видеосправку ниже).
+Добавлена обработка ошибок на листе Excel при шифровании, дешифровки и сохранении формул/значений.

Как сохраняются текстовые форматы в функциях форматирования в разных локализациях Win + Excel, как сам Excel с этим справляется пока вопрос открытый.
Изменено: bedvit - 05.02.2024 10:05:30
«Бритва Оккама» или «Принцип Калашникова»?
Экспорт данных из модели Power Pivot в cvs или файлы Excel
 
Андрей VG, Андрей привет! Подскажи, а существует ли в DAX Studio.возможность автоматизировать процесс выгрузки данных в CSV. К примеру жмакнув где-то кнопку?
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 89 След.
Наверх