Страницы: 1 2 3 След.
RSS
C API Excel for VBA, Используем в VBA - C API функционал Excel
 
Открою новый  блок: Функционал C API Excel для VBA.
Напрямую использовать не предусмотрено, поэтому буду делать функции-обертки.
Что это дает и зачем это нужно?
Дает кратный прирост скорости (в некоторых случаях).
Нужно для максимальной производительности кода в Excel, использую не самый быстрый VBA.
Минусы:
-Определенные ограничения самого C API Excel
-Нужна XLL (можно напилить самому или использовать стороннюю с таким функционалом)
-Нужно время спеца (который будет этим заниматься) для подготовки функций-оберток

Будет интерес и время - посмотрим, что из этого может получится.

В качестве тестового примера реализовал функцию поиска на листе нужных данных.
Функция: FindValuesXLL
Аргументы (см.ниже код):
1.Нужный диапазон - Range ( у меня выделенное - Selection, можно любой Range, в т.ч. и несколько Areas)
2.Искомое значение (может быть и числом и текстом)
3.Параметр сравнения (1 -меньше искомого значения, 2 - равно, 4 - больше, 8 - содержит (для строк))
параметры можно смешивать через OR (к примеру "1 or 2" ).
Можно будет добавить еще параметров сравнения, при взаимном интересе к теме.
Возвращаемый результат: Range (до 32767 Areas, см. ниже особенности)
Особенности:
>Сейчас реализован результат - как максимальный стек из 32767 Areas, т.е. будет найдено не более 32767 отдельно стоящих прямоугольников (в прямоугольнике может быть любое количество ячеек). Если будет нужно больше  - можно рассмотреть.
>Функция автоматически объединяет соседние по вертикали блоки в один (оптимизация по количеству Areas)
>Строки сравниваются с учетом регистра. Есть возможность сделать без учета, если будет интерес.
Код
Sub test()
Dim x
Set x = Run("FindValuesXLL", Selection, 1500, 1)
x.Select
End Sub


Результат поиска на примере одного из быстрейших вариантов на VBA
Всего ячеек - 170 000
Найдено отдельно стоящих ячеек -127 450

PRDX time total:         2,703 sec
FindValuesXLL:           0,020 sec

Итого разница боле чем в 100 раз.

Прошу тестировать: скачать xll, открыть или установить с помощью установщика или самому, написать нужный код в VBA.
Изменено: bedvit - 20.04.2021 13:00:08
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, обыграл так обыграл   :D
Это как на беговом марафоне, на электросамокате ехать  :D
Я бы потестил, но компании по-прежнему не нравится (скачивание файла)
в любом случае, поздравляю, молодец и так держать. Я слежу за тобой   8)
Изменено: Jack Famous - 20.04.2021 15:31:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Алексей, попробуй скачать по прямой ссылке, лично для тебя в потроха своего хоста даю ссыль, раз у тебя такой злой барин :) )
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо, но тоже не открывает)) через телефон опять придётся шаманить…
Она сама регистрируется или как?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да, все сама, даже установщик сделал. Только запустить установщик... и пойдет формат диска С и т.д... шутка...
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый вечер, коллеги.
Цитата
bedvit написал:
Всего ячеек - 170 000
Найдено отдельно стоящих ячеек -127 450
Виталий, пожалуйста, поясните - как можно в диапазоне из 170000 ячеек сделать не смежных 12740 каких-то ячеек, определяемых по значениям? У меня лучше чем половина не выходит :(
Опять же не совсем, видимо, понимаю суть задачи. Сделал пример для 8 столбцов и 21250 строк (170000 ячеек). На шахматке сбор диапазонов для раскрашивания на моём ноуте 0,09 секунды в коллекцию. Ну, пусть ваш компьютер в два раза медленнее. 0,18. То есть выигрыш всего около порядка, что является обычным отношением в скорости между С++ и VBA, а не двух порядков.
 
Андрей, привет! Извини, ввел в заблуждение,  127450 - это всего найдено ячеек,  отдельных Areas - 31868

В такой постановке вопроса (раскрашивание ячеек), да разница на порядок (тест прилагаю)
FindValuesXLL: 0,023 sec
FindValuesXLL+Color:        0,133 sec
Find.Count=127476
Areas.Count=31915
DefineRangeAddressCollection:0,2382813 = 1304
DefineRangeAddressCollection + Color:0,4414063
DefineRangeAddressCollection:             0,441 sec

Query для меня темный ящик - не использовал, видимо зря, красиво (единственно не до конца закрашивает, Андрей посмотри, пропустил кусочек :) )

Но суть немного в другом, FindValuesXLL выдает не адреса, а Range.
Т.е. можно выделить все ячейки так x.Select, а как это сделать в решении Андрея?
«Бритва Оккама» или «Принцип Калашникова»?
 
Пошла жара  :D
Андрей VG, здравствуйте и вам  ;)
У вас заливка не до конца идёт - 21 179 строк по 4 ячейки = 84 716 ячеек вместо 85 000 (см. скрины)
Модуль «Generator»
Модуль «AndrewVG»
Модуль «PRDX»
Сравнение в сек
Скрины
Со своей стороны просто использовал готовую функцию укрупнения диапазонов. При росте объёмов заливки должна выигрывать всё более заметно
Полагаю, что для тестов закрашивания (тем более на VBA) больше подходит моя тема, а эта немного о другом

UPD:
Цитата
bedvit: суть немного в другом, FindValuesXLL выдает не адреса, а Range
вот именно. Учитываю огромную тормознутость Union'а даже при самом оптимальном его применении, твоя XLL с ростом объёмов выделения будет уделывать ЛЮБОЕ решение на VBA всё сильнее

А потом я напишу функцию укрупнения диапазонов за счёт объединения соседних ячеек и снова сравним  :D

Цитата
bedvit: Query для меня темный ящик - не использовал, видимо зря, красиво
в решении Андрея нет ничего стороннего, кроме VBA (он просто 2 пользовательских типа ввёл) - грубо говоря, то же накопление адреса/стэка до 255 символов и после этого, перекладывание в коллекцию — как было у тебя (глобально), только по-другому (в подходе и деталях)
Я же продолжаю настаивать что резать длинную строку на блоки по ~255 символов и быстрее и универсальнее (не нужно контролировать стэк при сборе адресов)
Изменено: Jack Famous - 21.04.2021 10:15:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Query для меня темный ящик - не использовал, видимо зря, красиво (единственно не до конца закрашивает, Андрей посмотри, пропустил кусочек  )
Это да, поправил - теперь красит все. Можно и отказаться от пользовательского типа - перейти на приватные переменные уровня модуля, заодно и скорость формирования адресов где-то в полтора раза поднять - за счёт отсутствия передачи аргументов.
Было 0,09375 = 2184
Стало 0,0625 = 2184
А вот отказ от коллекции в пользу массива к увеличению производительности не ведёт. Видимо, основное время тратиться в DefineMerge - там же и нужно оптимизацию делать - переходить на массив адресов вместо сцепки в prevAddress с отслеживанием числа символов и только в самом конце проводить сцепку - меньше перезаписей по памяти по идее должно быть.
Скрытый текст

Цитата
Jack Famous написал:
Если же применить не универсальный сбор по значению, а сделать отбор специально для теста, примерно как у Андрея, то сбор займёт всего 0,02 сек
А можно тест такой провести?

Updated
В Module3 реализовал подход через массив, получилось в два раза быстрее чем в подходе Module2 (там исправил непрокрас последних строк)
Изменено: Андрей VG - 21.04.2021 19:11:08
 
Андрей VG, если собирать адреса, как у вас (не обращаясь к адресу ячейки диапазона, а склеивая запомненную букву очередного столбца с очередной строкой — ввёл флаг fFast в оба модуля), то всё равно мой подход чуть-чуть (в пределах погрешности, но стабильно) быстрее (см. скрины), а преимуществ по-прежнему намного больше:
    • Удобно
Не нужно считать стек и вообще что-либо ещё делать при сборе адресов
    • Универсально и просто
Собрали адреса в массив по любым необходимым критериям и запустили заливку в цикле по укрупнённым диапазонам (результат функции)
    • Меньше кода
Функция является самостоятельной и лежит в модуле типа "хранилище функций", то есть объём кода, написанного для неё можно не учитывать
    • Никаких публичных переменных и "лишнего" кода в основных процедурах
Не является минусом, если переменные "лежат" в модуле с функцией и никого не трогают. Если же, мне нужно при каждом сборе адресов вводить эти переменные для работы, то это довольно неудобно, хоть и некритично
Ну а, если при каждом сборе ещё нужно немало кода скопипастить для подсчёта стэка, то это совсем грустно…
Скрины
Модуль «AVG» (Модуль 3 с топовой скоростью)
Модуль «PRDX»
сравнение скорости сбора и Join'а коллекции против массива проведу позже - не думаю, что выигрыш будет за коллекцией…

UPD:
Сбор адресов у массива заметно быстрее, но не в разы (2,3 сек против 3,5 для 10 млн "An" [A1, A2 … A10 000 000])
Как махом сцепить все элементы или ключи коллекции, я не нашёл, так что сравнение даже не имеет смысла для моего подхода
Массив сцепляет 10 млн адресов в строку за 1,5 сек
Код
Изменено: Jack Famous - 22.04.2021 11:36:44
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit: Прошу тестировать
установщик кучу ошибок выдал (доллар в Environ не понравился, потом функцию UnloadF подсветил, а потом я его закрыл нахрен  :) )
А если ручками положить надстройку в AddIns и подключить, нажав галочку, то вот такое получается
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А ты точно той разрядности устанавливаешь, как и разрядность самого Excel? (такая ошибка возникает, если выбрана разная разрядность библиотеки и самого Excel).
Цитата
Jack Famous написал:
установщик кучу ошибок выдал (доллар в Environ не понравился, потом функцию UnloadF
Это функционал самого VBA, а не моей библиотеки, поэтому думаю это какие-то библы подключенные с твоей стороны генерят эту ошибку. Вышли скриншот ошибки (и скриншот библиотек подключенных в References). Не подключена ли References ->microsoft scripting runtime (по умолчанию она выключена на обычных ПК)?
Изменено: bedvit - 22.04.2021 12:15:50
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: разрядности, как Excel
ёпстудэй, друг, так надо большими красными буквами писать, что речь про Excel, ведь по-дефолту это про винду  :D  :D  :D
Подключил ручками, всё работает. Подбор суммы вылетел с ошибкой при выводе максимально приближённого, но остальное потыкал - норм (кнопки + функции + BedvitCOM.VBA)
У меня теперь снова есть мегашустрый сортер))) Спасибо!  8)
Вторая ссылка - битая, обрати внимание
Изменено: Jack Famous - 22.04.2021 12:32:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
что речь про Excel,
везде про это пишу.
Цитата
Jack Famous написал:
Подбор суммы вылетел с ошибкой
здесь с Михаилом пилили алгоритм. Возможно, ты вводишь не те параметры или мы что-то не учли. Можешь там отписать - исправим.
Цитата
Jack Famous написал:
У меня теперь снова есть мегашустрый сортер))) Спасибо!
И не только, там теперь много всего нового. Пользуйся!
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: везде про это пишу
достаточно написать в названии файла - BedvitXLL(Excelx86).xll вместо BedvitXLL(x86).xll
Вот тогда трудно будет не увидеть — это я тебе как "dev to dev" говорю. Так юзвери намного лучше воспринимают  ;)

Цитата
bedvit: Можешь там отписать
отписал
Изменено: Jack Famous - 22.04.2021 13:40:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
вместо BedvitXLL(x86)
ты бы лучше поставил полноценный Excel x64, а не половинку х32. И проблем было бы значительно меньше (не только с подключение библы), это я тебе как "dev to dev" говорю.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: ты бы лучше поставил полноценный Excel x64
мне тут вагон бумаги перевести на согласования надо для этого + есть вероятность, что у сотрудника будет "половинка" стоять и то, что у меня ошибок не вызывает, у него вызовет (например, взять в массив/память большой кусок с листа)
А так, у меня запорожец и у него москвич - плюс-минус то на то и выходит. Вот такая вот "совместимость"  :D
Изменено: Jack Famous - 22.04.2021 17:48:15
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Вышли скриншот ошибки (и скриншот библиотек подключенных в References). Не подключена ли References ->microsoft scripting runtime (по умолчанию она выключена на обычных ПК)?
?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Вышли скриншот ошибки
нетушки - у меня только всё работать стало  :D
Цитата
bedvit: Не подключена ли References ->microsoft scripting runtime
подключена конечно и ещё куча всего - надо всё учесть по-хорошему, но мне руками легко подключить было
«Куча всего»
Изменено: Jack Famous - 23.04.2021 14:15:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Поэтому у тебя и ошибка вылетает, у меня везде позднее связывание в установщике, а у тебя ранее, я так понял они не дружат.
Зачем тебе столько, это же не переносимо? или ты не пилишь под пользователя конечные разработки?
У меня вот сколько (стандарт при установке Офиса)

и все работает, причем везде (кроме твоего :) )
Изменено: bedvit - 23.04.2021 14:30:53
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, в надстройке у меня всё подключено, потому что раннее быстрее и удобнее. Надо обходить
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
19/05/2021 Новый функционал: Быстрое изменение размерности массива.
Сейчас поддерживается из одномерного в двухмерный с 1м столбцом, и наоборот.
Код
Sub ReDimArray()
Dim r As BedvitCOM.VBA: Set r = New BedvitCOM.VBA 'раннее связывание
Dim t, arr, i
arr = [a1:a1000000]
t = Timer
For i = 1 To 1000000
    r.ReDimArray arr 'в одномерный (нижняя граница = 0 - по умолчанию)
    r.ReDimArray arr, 2, , 1, , 1 'в двухмерный с 1м столбцом, нижние границы измерений = 1
Next
Debug.Print "bVBA.ReDimArray: " & Timer - t & " sec."
End Sub


Преобразование массива 1 млн. элементов в одномерный и далее в двухмерный (2 преобразования за цикл) - 1 млн. раз = 1,45 сек.

ReDimArray (параметры)
1. Массив (одно или двухмерный) для преобразования (обязательный параметр, остальные нет)
2. Количество нужных измерений (сейчас 1-2, по умолчанию = 1)
3. Количество элементов в 1м измерении (по умолчанию = все элементы)
4. Нижняя граница в 1м измерении (по умолчанию = 0)
5. Количество элементов в 2м измерении (по умолчанию = все элементы)
6. Нижняя граница в 2м измерении (по умолчанию = 0)

Была идея реализации быстрого аналога ReDim Preserve, с возможностью изменений любого из 5 измерений ( а не только последнего), пока остановился на 2х за отсутствием понимание нужно ли это.

реализованный функционал позволяет быстро передавать одномерные массивы на лист Excel и получать обратно (одномерные).

Библу залил на сайт.
Изменено: bedvit - 19.05.2021 13:14:03
«Бритва Оккама» или «Принцип Калашникова»?
 
Отчёт. Стабильно быстрее в 3,4 раза
Вывод:
разница хорошая, стабильная, можно спокойно использовать вместо штатного преобразования, но дело в том, что я не могу припомнить, чтобы мне нужно было в цикле делать подобные преобразования

Параметры:
нужен всего один - массив. Если передан одномерный (0 To N-1), то перегнать в двумерный (1 To N, 1 To 1) и наоборот
Название тоже лучше не такое, а что-то вроде Array1x2xTransform()

Однозначно полезно, спасибо!  :idea:
Изменено: Jack Famous - 21.05.2021 12:47:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Привет!
У тебя неправильный тест (ты добавляешь присваивание массива в цикле к общему времени, это лишнее)
Результаты:
bVBA.ReDimArray: 3,9 ms.
VBA: 182 066,4 ms.

Разница боюсь даже писать 46 тыс. раз! (это так и есть, потому как у меня нет выделения памяти под новый массив, и элементы не копируются), только меняются указатели.
Тест прикладываю.
На всякий случай код:
Код
Option Explicit
Option Private Module

Sub TestBedvit()
Dim r As BedvitCOM.VBA: Set r = New BedvitCOM.VBA
Dim t, arr, i

[a1:a1000000] = 1
arr = [a1:a1000000]
t = Timer

For i = 1 To 1000
    r.ReDimArray arr
    r.ReDimArray arr, 2, , 1, , 1
Next
Debug.Print "bVBA.ReDimArray: " & (Timer - t) * 1000 & " ms."

For i = 1 To 1000
    Arr2xTo1x arr
    Arr1xTo2x arr
Next
Debug.Print "VBA: " & (Timer - t) * 1000 & " ms."


End Sub

'====================================================================================================
Sub Tester()
Dim BedVit As New BedvitCOM.VBA
Dim x, tmp(), arr1x(), arr2x()
Dim t!, nEl&, nCyc&, n&, fText As Boolean

fText = False: nEl = 10: nCyc = 1000000
Debug.Print "TextData = " & fText, "Elements: " & Format$(nEl, "#,##0"), "Cycles: " & Format$(nCyc, "#,##0")

t = Timer
ReDim arr1x(nEl - 1)
    For n = 1 To nEl
        If fText Then
            arr1x(n - 1) = "_" & Format$(n, "0000000")
        Else
            arr1x(n - 1) = n
        End If
    Next n
n = 1000 * (Timer - t): Debug.Print "FillArray", n, LBound(arr1x), UBound(arr1x) & vbLf

t = Timer
    For n = 1 To nCyc
        arr2x = arr1x
        Arr1xTo2x arr2x
    Next n
n = 1000 * (Timer - t): Debug.Print "VBA 1xTo2x", n, LBound(arr2x, 1), UBound(arr2x, 1), LBound(arr2x, 2), UBound(arr2x, 2)

t = Timer
    For n = 1 To nCyc
        x = arr1x
        BedVit.ReDimArray x, 2, , 1, , 1
    Next n
n = 1000 * (Timer - t): Debug.Print "BedVit 1xTo2x", n, LBound(x, 1), UBound(x, 1), LBound(x, 2), UBound(x, 2) & vbLf

arr2x = x

t = Timer
    For n = 1 To nCyc
        arr1x = arr2x
        Arr2xTo1x arr1x
    Next n
n = 1000 * (Timer - t): Debug.Print "VBA 2xTo1x", n, LBound(arr1x), UBound(arr1x)

t = Timer
    For n = 1 To nCyc
        x = arr2x
        BedVit.ReDimArray x
    Next n
n = 1000 * (Timer - t): Debug.Print "BedVit 1xTo2x", n, LBound(x), UBound(x)

End Sub
'====================================================================================================
Private Sub Arr1xTo2x(arr1x)
Dim arr2x(), r&

ReDim arr2x(1 To UBound(arr1x) + 1, 1 To 1)
    For r = 1 To UBound(arr2x, 1)
        arr2x(r, 1) = arr1x(r - 1)
    Next r
arr1x = arr2x
End Sub
'====================================================================================================
Private Sub Arr2xTo1x(arr2x)
Dim arr1x(), i&

ReDim arr1x(UBound(arr2x, 1) - 1)
    For i = 0 To UBound(arr1x)
        arr1x(i) = arr2x(i + 1, 1)
    Next i
arr2x = arr1x
End Sub
'====================================================================================================
Изменено: bedvit - 21.05.2021 12:28:27
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: неправильный тест
забыл исключить этот фактор - твоя правда  :)
Цитата
bedvit: Разница боюсь даже писать 46 тыс. раз!
ну у меня скромнее, но всё-равно от 500 до нескольких тысяч раза (не 3 раза, конечно)  :D
Пару раз твоё время даже не измерилось (где 1 стоит), так что может там разница и выше 3 тысяч раз
Новый отчёт
Изменено: Jack Famous - 21.05.2021 12:39:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Чем больше элементов и длиннее строка, тем у меня будет быстрее работать, за счет того, что не копируются данные (другими словами - больше данных, больше разрыв во времени).
в 3 тыс. раз тоже неплохо :)
Нижняя граница очень легко меняется, просто проставить = 1.
«Бритва Оккама» или «Принцип Калашникова»?
 
04/08/2021 новый FindValuesXLL - теперь поиск любого количества ячеек (начиная с версии XLL: 2.0.1.9)
т.к. Excel С API не позволяет передать стек более 32767 Areas, создаем массив стеков и смотрим поэлементно.
Для этого добавил режим (mode):
'mode=-1 (ищем ячейки, создаем массив и выводим количество найденных ячеек), mode=0 (выводим количество стеков с результатом), mode>0 (выводим результат под порядковым номером стека, начиная с 1)
Заполняем массив mode=-1, остальные режимы - только вывод информации из статистического массива стеков

Код
Код
Sub testFindValuesXLL()
Dim result, resultCount, stekCount, stek, t
'Поиск результата mode=-1, остальные режимы - только вывод информации из статистического массива стеков
t = Timer
resultCount = Run("FindValuesXLL", ActiveSheet.UsedRange, 1, 2, -1)  'mode=-1(количество найденных ячеек), mode=0(количество стеков с результатом), mode>0 (порядковый номер стека, начало с 1)
stekCount = Run("FindValuesXLL", ActiveSheet.UsedRange, 1, 2, 0)
For stek = 1 To stekCount
    Set result = Run("FindValuesXLL", ActiveSheet.UsedRange, 1, 2, stek)
    'result.Interior.Color = 65535 ' закрасим найденные
    'Debug.Print result.Count 'количество ячеек в текущем стеке
    'result.Select 'выделим все ячейки в стеке
Next
Debug.Print resultCount, stekCount
Debug.Print "Time: " & Timer - t
End Sub


результат: поиск 1,25 млн.ячеек из 2,5 млн. = 0,28 сек.
Изменено: bedvit - 04.08.2021 17:48:55
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, приветствую и спасибо за обновку!  8)

Времени для тестов пока что совсем нет, так что накидаю просто свои мысли
Цитата
bedvit: C API Excel for VBA
давно пора для каждого инструмента свою тему-ветку сделать, а то прямо свалка какая-то
Цитата
bedvit: Для этого добавил режим (mode):
говорил раньше, повторю - по названию переменной должно быть интуитивно понятно, что она делает, а эти "моды" — просто кошмар для любого, кто не ты  :D
Подумай над своим аналогом функции округления. Непаханное поле
Изменено: Jack Famous - 04.08.2021 17:18:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
для каждого инструмента свою тему-ветку
Возможно. Вопрос в интересе к инструменту. Есть интерес-новая ветка.
Цитата
Jack Famous написал:
"моды" — просто кошмар
mode - означает режим, способ/метод работы (функции). Предложи свой вариант, более понятный пользователю
Цитата
Jack Famous написал:
своим аналогом функции округления.
зачем? в VBA нет округления?
Изменено: bedvit - 04.08.2021 17:56:37
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: в VBA нет округления?
только Round и та - банковская
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 3 След.
Наверх