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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 81 След.
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Цитата
ZVI написал:
С какой целью нужно
Вообщем-то только информационная, для пользователя. Но в таком виде боюсь будет бесполезна )

Тогда выходит такая функция:
Код
Sub versionExcel2()
Dim v, b, x
    b = Application.OperatingSystem
    x = InStr(1, b, "(")
    v = v + Mid(b, x, InStr(1, b, ")") - x + 1)
   Debug.Print Application.Version & "." & Application.Build&; v
End Sub


Осталось понять какую версию показывает CalculationVersion?
Изменено: bedvit - 05.10.2022 20:54:26
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Владимир, спасибо за информацию, с интересом прочитал.
Из замеченного: minor версия в Excel 2016 выше, чем в Excel 2019. См.пост 27. Итого угадываение 2016,2019,2021 превращается в увлекательный квест (ставршая версия минор, не означает старшую версию Excel)
Цитата
ZVI написал:
bedvit  написал: Как это показать кодом?Код же приведен в  #25 . Какой еще нужен?
Хотелось бы так и получить данные из заголовка: Excel 2019 MSO (16.0.10390.20024), 64-разрядная версия.
Но видимо, обектная модель Excel это не выдает, где-то в свойствах или методах.
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Цитата
ZVI написал:
minor = Application.BuildПо нему
. А что с номерами major? Мало пилят функционала для нового номера с 2016 по 2021?))
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Цитата
ZVI написал:
номерами major и majorup, там еще есть minor и minorup.
а где это можно посмотреть? Application.Version выдает для двух версий одинаковое значение.
Цитата
sokol92 написал:
Application.Version. Но, например, для офисов 2016 и 2019 это свойство равно "16.0". Выручает свойство Application.CalculationVersion - ориентируемся на 2 первые цифры
Цитата
ZVI написал:
Файл - Учетная запись (там еще, если щелкнуть, то вверху видна версия офиса)
там и смотрю. Как это показать кодом?
Цитата
БМВ написал:
Определить разрядность ОС
здесь проще, определяю в С/С++ версию win и разрядность так (использую, win api):
OSVERSIONINFOA structure (winnt.h)
SYSTEM_INFO structure (sysinfoapi.h)
Код
   OSVERSIONINFOW os;
   os.dwOSVersionInfoSize = sizeof(os);
   GetVersionEx(&os);
   std::wstring ver = std::to_wstring(os.dwMajorVersion) + L"." + std::to_wstring(os.dwMinorVersion);

   SYSTEM_INFO lpSystemInfo;
   GetNativeSystemInfo(&lpSystemInfo);//x64=PROCESSOR_ARCHITECTURE_AMD64
 std::wstring(lpSystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ? L" (64-bit)" : L" (32-bit)")
Изменено: bedvit - 04.10.2022 21:56:18
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Excel 2013 x64
===============
VBA: 7.1.11.26
Excel: 15.0.5485.1000
stdole: 10.0.19041.1
Office: 15.0.5485.1000
Application.Version=15.0

Excel 2016 x64  (данные от ZVI)
===============
VBA: 7.1.11.27
Excel: 16.0.15629.20156
stdole: 10.0.19041.1
Office: 16.0.15629.20152
Application.Version=16.0

Excel 2019 x64
===============
VBA: 7.1.11.27
Excel: 16.0.10390.20024
stdole: 10.0.19041.1
Office: 16.0.10390.20024
Application.Version=16.0

Код
Option Explicit

Sub test()
  Dim i As Long
  For i = 1 To 4
    Debug.Print GetVersion(i)
  Next
  Debug.Print "Application.Version= ", Application.Version
End Sub
 
Function GetVersion(i As Long)
  With ThisWorkbook.VBProject.References
    GetVersion = .Item(i).Name & ": " _
      & CreateObject("Scripting.FileSystemObject").GetFileVersion(.Item(i).FullPath)
  End With
End Function
Изменено: bedvit - 04.10.2022 21:33:34
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Цитата
ZVI написал:
А что должно выдавать?
разные значения должны быть.
Логично же, что для Excel 2016 должно отличатся от Excel 2019. Или у Майкрософт другая логика?
Владимир, я не использую VBA. Весь код написан на С/С++. Используется только объектная модель Excel.
Цитата
ZVI написал:
versionExcel выдает 18.1029(64-bit)
у меня выдавала 19. Возможно это тоже неверный подход.
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Добрый день, Владимир!
Цитата
ZVI написал:
Версия Excel = Val(Application.Version)
К сожалению это не работает. В Excel 2019 выводится 16.
А команды препроцессора я не могу использовать, я использую объектную модель Excel (у себя в библиотеке).
Второй способ тоже не смогу использовать, т.к. это особенность типов данных библиотеки VB.
Изменено: bedvit - 04.10.2022 14:59:32
«Бритва Оккама» или «Принцип Калашникова»?
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Правильно ли я понимаю, что версия и разрядность Excel определяются встроенными инструментами самого Excel, так?
Код
Sub versionExcel()
Dim v, b, x
    Calculate
    v = Application.CalculationVersion
    v = Left(v, Len(v) - 4) & "." & Right(v, 4)
    b = Application.OperatingSystem
    x = InStr(1, b, "(")
    v = v + Mid(b, x, InStr(1, b, ")") - x + 1)
    MsgBox (v)
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
testuser, матчасть по волатильным (пересчитываемым или летучим) функциям в excel
Убираем эти функции (сохраняем в значениях), оп-па Debug.Print "SUMIFS2" показывает 1 итерацию, как и должно быть. Никаких лишних пересчетов.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Что за эффект лишних итераций, лишних пересчетов? О каких 7 лишних пересчетах вы пишите? Не про это ли?
Если да, то это проблема мастера функций, а не функций. Никаких лишних пересчетов нет.
Вывод: не пользуйтесь Мастером функций для отладки пользовательской функции. При обычной вставке функции в ячейку все работает нормально.
Изменено: bedvit - 02.10.2022 14:54:17
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Цитата
testuser написал:
функцию, подобную СУММЕСЛИМН в привычном виде.
выше это и сделал, в силу специфики задачи, тестируйте.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Цитата
testuser написал:
В udf библиотека отказывается работать,
всё работает, см. выше.
Цитата
testuser написал:
функция отрабатывает 7 раз прежде чем выдать значение в
значит что-то неправильно делаете. Это вообще не относится к моей библиотеке. Отрабатывает 1 раз как и положенно, см. выше.
Изменено: bedvit - 30.09.2022 12:22:54
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
По теме: мой фильтр хорошо справляется с большими массивами и небольшим количеством вызовов, желательно сразу все в 1м вызове (затраты на вызов функции из COM, проверка входящих параметров и т.д.).
В качестве составляющей UDF, когда вызовов UDF много - думаю, эффективность будет не высокой.
Но все же UDF написал, тестируйте (см. вложение)
Код
Option Explicit
Dim bCOMvba  As New BedvitCOM.VBA 'раннее связывание

Function SUMIFS2(rngIn As Range, columnSum As Long, column1 As Long, filtr1 As Variant, Optional column2 As Long, Optional filtr2 As Variant, Optional column3 As Long, Optional filtr3 As Variant, Optional column4 As Long, Optional filtr4 As Variant, Optional column5 As Long, Optional filtr5 As Variant, Optional column6 As Long, Optional filtr6 As Variant, Optional column7 As Long, Optional filtr7 As Variant) As Double
    Dim p, arrRes, arrIn, x As Long, c As Long, res As Double ' i As Long, x As Long,
    
    If column1 > 0 Then c = c + 1: If column2 > 0 Then c = c + 1: If column3 > 0 Then c = c + 1: If column4 > 0 Then c = c + 1: If column5 > 0 Then c = c + 1: If column6 > 0 Then c = c + 1: If column7 > 0 Then c = c + 1
    ReDim p(c - 1, 5)
    If column1 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column1: p(x, 3) = 2: p(x, 4) = filtr1: p(x, 5) = 0: x = x + 1
    If column2 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column2: p(x, 3) = 2: p(x, 4) = filtr2: p(x, 5) = 0: x = x + 1
    If column3 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column3: p(x, 3) = 2: p(x, 4) = filtr3: p(x, 5) = 0: x = x + 1
    If column4 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column4: p(x, 3) = 2: p(x, 4) = filtr4: p(x, 5) = 0: x = x + 1
    If column5 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column5: p(x, 3) = 2: p(x, 4) = filtr5: p(x, 5) = 0: x = x + 1
    If column6 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column6: p(x, 3) = 2: p(x, 4) = filtr6: p(x, 5) = 0: x = x + 1
    If column7 > 0 Then p(x, 0) = 1: p(x, 1) = 0: p(x, 2) = column7: p(x, 3) = 2: p(x, 4) = filtr7: p(x, 5) = 0: x = x + 1
    
    arrIn = rngIn
    bCOMvba.ArrayFilterV arrIn, p, 1, arrRes 'применяем фильтр
    
    For x = 1 To UBound(arrRes)
       SUMIFS2 = SUMIFS2 + arrIn(arrRes(x), columnSum)
    Next
End Function
Изменено: bedvit - 30.09.2022 12:16:00
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
testuser, да ссылку можно приложить, даже нужно. Возможно кто-то тоже заинтересуется таким инструментом. Жду результаты.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Т.е. таким образом можно легко отфильтровать данные, которые отличаются регистром от задаваемых или отделить числа от текста (чисел записанные как текст) и т.д., как в одном столбце, так и в нескольких.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Доделал функционал по регистру. Теперь каждое условия является полностью независимым. Т.е. можно по одному и тому же столбцу (или разным столбцам) задать условия LIKE без учета регистра и поиск подстроки с учетом регистра и поиск числа больше 5 и т.д. т.е. любая комбинация условий поддерживается.
Тестовая версия.
Выложил на сайт релиз.
Изменено: bedvit - 23.09.2022 09:12:00
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Выше ответил, что функционал по маске стандартен.
Возможным исключением может являтся поиск по числовым типам данным. У меня только строка. Если нужно, можно числовой массив преобразовать в строковой, и все ОК.
Изменено: bedvit - 21.09.2022 10:11:21
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Да, стандартно все. Ищет и просто "*" (любой текст), и без звездочки (равенство). Применяется для строки.
Изменено: bedvit - 21.09.2022 09:48:10
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами COM (VBA) - преобразование данных: регистра, строк, чисел
 
Цитата
Jack Famous написал:
ArrayCharLowerV, ArrayCharUpperV - как преобразуют числа? В текст или без изменений? Как преобразуют Empty?
у чисел нет регистра. Никак, остаются как были.
Цитата
Jack Famous написал:
ArrayNumToCharV: Как преобразует Empty?
не тестировал. Как придумали спецы Microsoft, использую их функцию.
Цитата
Jack Famous написал:
ArrayCharToNumV: Как преобразует Empty? Как преобразует текст?
про Empty выше. Про строки: если строка похожа на число - в число, если нет, останется строка (алгоритм не мой, используется функция от Microsoft, ссылку выше разместил, можно погуглить тонкости или потестировать).
Если будут тесты от тебя, я с интересом почитаю.
Изменено: bedvit - 21.09.2022 09:42:51
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами в VBA (COM), Фильтр для массива
 
Добавил Like (пока с символом подстановки "*"). Скорость Like оптимизировал до сравнимой с поиском подстроки (содержит подстроку). Быстро.
Прошу тестировать.
Надстройка на сайте
Примеры использования здесь.
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Цитата
bedvit написал:
Нужно ли это, или пользователь сам преобразует, если ему надо перед загрузкой в фильтр?
Сделал инструменты, что бы быстро решить такого вида вопросы.
«Бритва Оккама» или «Принцип Калашникова»?
Инструменты для работы с массивами COM (VBA) - преобразование данных: регистра, строк, чисел
 
Мое почтение, джентльмены!
Новые инструменты для массива.
Для массивов любого количества размерностей, типа - VARIANT.
VERSION_COM L"BedvitCOM.dll_v2.0.2.0"
VERSION_XLL L"BedvitXLL.dll_v3.2.2.0"

Преобразование происходит "на месте" (штатным инструментом VariantChangeType)
Для всех элементов массива, для которых возможны преобразования:
1.ArrayCharLowerV - преобразовать все символы строки в нижний регистр
2.ArrayCharUpperV - преобразовать все символы строки в ВЕРХНИЙ регистр
3.ArrayNumToCharV - преобразовать все данные в тип: Strung
4.ArrayCharToNumV - преобразовать все данные в тип: Double

Пример:
Код
Sub testArrayCharNumV()
 Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA")
 Dim p: p = Array("2", "нижний регистр", 1, "ВЕРХНИЙ РЕГИСТР", 1, 56)

bVBA.ArrayCharLowerV p
bVBA.ArrayCharUpperV p
bVBA.ArrayNumToCharV p
bVBA.ArrayCharToNumV p
 
End Sub


Скачать можно здесь.
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Добавил Like. Библиотеку залил на сайт.

P S. Результаты замеров по времени выполнения задачи по теме.
На 4 логических ядрах. Поиск подстроки 4.5 сек, like *...* - 5.25 секунды. Итого Like вполне неплохо справляется (ручная оптимизация кода)
Изменено: bedvit - 21.09.2022 09:23:24
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Фильтр работает с типом данных VARIANT. Можно добавить новый функционал, сделать еще универсальнее: преобразование всех данных к какому либо типу, тексту или, если возможно к числу (если тект похож на число).
Преобразование типа данных: VariantChangeType

Нужно ли это, или пользователь сам преобразует, если ему надо перед загрузкой в фильтр?
Изменено: bedvit - 19.09.2022 17:23:17
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Владимир, добрый день! Спасибо за интерес к теме и интересные вопросы. Видно, что глубоко погружались в тему и вопросы соответствующие.
Отвечаю:
Озвученное выше время - только время на фильтрацию.
4.5 сек
Общее время на загрузку данных с листа (как у Павла), расчет, создание нового листа и выгрузку 5 сек.

Если были числовые данные, они обрабатывались как числовые, в текст не переводились (т.е. в расчет не входили).
Но при выгрузке из VBA на лист, Excel сам преобразовывает текст похожий на числа в числа.

Сделал файл-пример, где задаются условия для фильтра в библиотеке (для тех, кому хочется попробовать, но непонятно, что нужно сделать).
Нужно открыть этот файл или любой другой с кодом, и открыть или установить как надстройку XLL. Нажать кнопку. Всё. Ничего сложного.

В файле-примере не полностью заполнен массив для фильтрации (не пролезал файл), заполнить самостоятельно. Массив условий заполнен полностью под задачу.

Сейчас версия библы тестовая, вечером еще внесу корректировки, внесу возможность использовать Like ...*...*.*.*...
Выложу на свой сайт, отпишусь здесь.
Изменено: bedvit - 20.09.2022 08:31:48
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Мое почтение, джентльмены!
Плотно поработав в выходные над логикой в парральльных потоках, убрал часть накладных расходов. Оптимизировал компаратор.
Результаты по теме:
1.Не содержит с игнорированием регистра (решение по теме) 4.5 сек.
2.Не содержит и учитываем регистр - 4.5 сек.
3.Не равно и игнорируем регистр - 3.77 сек
4.Не равно с учетом регистра -3.5 сек
5.Равно без учета регистра -3.5 сек
6.Равно с учетом регистра -3.45 сек


Прошу тестировать. Библу закинул на сайт.

Реализовал функционал LIKЕ, пока с символом "*". Тест планирую вечером, бета версию с LIKE. Тоже вечером.
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Распарралеливание алгоритма дает пока всего 30% прироста. Задача хорошо парралелится, но к  сожалению узкое горлышко не процессорное время, а работа с памятью. А она одна, в отличии от процессоров. Есть ли толк дальше оптимизировать парралельный алгоритм пока под вопросом.
Далее, отличные результаты Владимира на VBA меня порадовали, я вчера думал, почему у меня медленее отрабатывает и прешел к выводу, что нужно платить за универсальность ( т.к. это универсальный фильтр массива, а не узкоспециализировнное решение данной задачи) и на самом деле операции делаю в разы больше из-за этого. У мяня проверяются входящие параметры от пользователя на корректность заполнения, это 6 переменных для одного параметра * 2000 = уже проверка 12 тыс записей, еще даже не начиная основной алгоритм. Потом проверка приоритетов AND, перед OR. Проставляем, если пользователь сам скобками не отметил. Потом создание стеков, под каждые открывающие скобки отдельный стек (если есть скобки, в этой задаче нет скобок в условии, все в базовом стеке считается). Это все в однопоточном режиме. При закрытие скобок, стек закрывается, результат обрабатывается на уровне ниже, и так пока внутри всех скобок не будет рассчитаны итоги. Последний уровень нулевой (без скобок). Этот блок расчетов распарралелен.
Далее по итоговому стеку/массиву индексов или перекладываем массив на вывод индексов либо формируем по ним итоговый массив (2 режима вывода результата). Это тоже в 1 потоке.
Итого это 15 сек (10 если парралель.).
Еще проблемы с регистром (буду думать над быстрым вариантом преобразования)
И возможно VBA здесь сможет удержать лидерство.
Изменено: bedvit - 16.09.2022 08:53:53
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
nilske, попробуйте оптимизировать алгоритм, применить прралельные расчеты, к примеру разделите список на 4/8/16 (по количеству логических процессоров) и обрабатывайте части в каждом потоке отдельно. Потом результат склеить и вывести.
ZVI, Владимир, да проблемы с угадыванием кодовой страницы есть, и преобразование в нижний или верхний регистр посимвольно. Для целой строки не нашел штатного инструмента. Вообщем, еще та задача. А как угадывает кодовую страницу LCase в VBA?
Изменено: bedvit - 15.09.2022 12:15:15
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
Доброе утро! Владимир, рад, что вы присоединились к обсуждению по теме. Решение хорошо оптимизированно под задачу и выдает отличные результаты. У меня отработало так (ПК рабочий, вполне неплохой) main - 7.99 сек., ALL - 8.59
«Бритва Оккама» или «Принцип Калашникова»?
Фильтрация по 2000 условий
 
По данным из 24 поста. Без заголовков. Итоговая таблица по параметрам: не содержит подстроку, с учетом регистра - 242343 итоговых строки. Без учета регистра - 229892 (совпадает с Михаилом)
Время расчета: с учетом регистра - 17сек
без учета регистра-600 сек=10 мин.
Здесь не оптимален алгоритм, строки преобразуются в один регистр при сравнении. Когда условие 1 , все ок. Когда условий 2000 - каждый раз при новом условии, при поиске подстроки происходит преобразование в один регистр. Итого исходная таблица преобразуется 2000 раз в один регистр. Нужно выносить разрвое преобразование таблиц в один регистр, и уже сравнивать данные в одном регистре. Ускорения в 2000 раз не будет, но выйдем на секунды, а не минуты.
Есть соображение распарралелить алгоритм в фильтре.
Будет время, выложу здесь результаты и релиз.
Изменено: bedvit - 15.09.2022 09:46:57
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 81 След.
Наверх