Страницы: 1 2 3 След.
RSS
C API Excel - Получить строку с нужными символами Unicode
 
Всем привет!
Написал простую функцию, позволяющую получить из строки любые нужные символы.
Пример прилагаю (в примере выбираются только цифры).
Работает вполне шустро (в 4 раза отстает от самой быстрой специализированной функции) - плата за универсальность. Возможно можно ускорить, код я выложил. .
Синтаксис простой, все символы перечисленные в шаблоне участвуют в формировании новой строки, знак "Дефис-минус" ("-"), задает последовательность, с -по (включительно).
Все последовательности рассчитываются по стандартной таблице символов Unicode.
Предлагаю обсудить удобно ли это?
Может ли быть ответом на часто задаваемые вопросы, про как оставить какие либо символы, удалив другие?
Удобно ли, то что она в оnдельном файле xll (плата за скорость), а не на VBA?
Так же если тема заинтересует, предлагаю этот проект развивать сообща, все исходники открою.

Прямо пишите какие недостатки, что нужно добавить, и нужно ли это вообще.
Тему и создал для получения оценки от участников форума.

Сама функция "FilterUnicodeChar":
Код
void ParseUnicodeChar(wchar_t *  StringIn, wchar_t *  EnableChar)
{
   int y = 0;
   for (int i = 1; i <= StringIn[0]; ++i)
   {
      wchar_t uChar = StringIn[i];
      long eCharSize = EnableChar[0];
      for (int j = 1; j <= eCharSize; ++j)
      {
         if (EnableChar[j+1] == L'-' && j < eCharSize-1)
         {
            if (uChar >= EnableChar[j] && uChar <= EnableChar[j + 2])
            {
               StringIn[++y] = uChar;
               j = j + 2;
               break;
            }
            j = j + 2;
         }
         else if (uChar == EnableChar[j])
         {
            StringIn[++y] = uChar;
            break;
         }
      }
   }
   StringIn[0] = y;
}

extern "C" __declspec(dllexport) wchar_t *  WINAPI FilterUnicodeChar(wchar_t *  StringIn, wchar_t *  EnableChar)
{
   ParseUnicodeChar(StringIn, EnableChar);
   return StringIn;
}


Пример прилагаю. Как использовать: открыть нужной разрядности xll, открыть файл Excel - работать)
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, приветствую!
Ещё одна очень крутая идея от вас, но всё, что лично меня пока останавливает, это непонимание, каким образом "зашить" ваш ".xll" в свою классическую ".xlm" - надстройку или, например, в другие книги. Да так, чтобы не думать о расположении файла ".xll"…
Изменено: Jack Famous - 26.07.2019 15:47:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
С паттерном "А-яЁё"
Код
=FilterUnicodeChar(A1;"А-яЁё")
выбирает только кириллицу, работает пока в два раза медленнее специализированной, в счет универсальности, см. пример.
Изменено: bedvit - 26.07.2019 16:42:40
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил в справке (в функции "FilterUnicodeChar") ссылку на таблицу Unicode.
Jack Famous, можно зашить с помощью Хранение файлов и файловый менеджер в файле(листе) Excel
Или использовать как отдельную надстройку, установить всего раз, как обычную.
Плюс второго способа в том, что если проект будет развиваться, будут добавляться новые быстрые функции и обновление будет заключаться в том, xто бы, просто, обновить файл xll. В первом способе нужно будет загрузить новый xll в свою надстройку.

Поэтому, если проект стартует, можно вместе будет выбирать имена функций (с точки зрения их функциональности), и далее уже не менять, что бы они были одинаковыми во всех версиях.
Изменено: bedvit - 26.07.2019 16:33:35
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, я так и знал, что вы про менеджер скажете)) буду разбираться…

Мои готовые решения работают по-принципу "all-in-one", то есть всё уже должно быть подключено, а значит только "зашивать" через ваш менеджер.
Для использование же вместе со своей надстройкой выберу "подключаемый" вариант  ;) кстати, подключил как обычную, но ничего не видно - как "активировать"?)))
Изменено: Jack Famous - 26.07.2019 16:42:46
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
ничего не видно - как "активировать"?)))
Ничего активировать не нужно, смотрите у вас должны появится новые категории функций, там все есть :)
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, это-то работает, а вызов внутри кода?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
Код
Sub Run_FilterUnicodeChar()
Dim s As String
s = "4df4sdfs4d65"
Debug.Print Application.Run("FilterUnicodeChar", s, "0-9")
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо. То есть подсказонек не будет?(((
Изменено: Jack Famous - 26.07.2019 18:08:15
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, каких
Цитата
Jack Famous написал:
подсказонек
?
Запускается функция в коде VBA через Application.Run
Или я не так понял вопрос?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, подсказки при вводе функции (список доступных и аргументы)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В списке доступных присутствует.
Аргементы в мастере есть, значения тоже. см. рис.
Или имеется ввиду всплывающие подсказки?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, блин, да В КОДЕ  :D в коде ничего нет
Типа ввожу в модуле "FilterUni", а он не подсказывает, что что-то есть, да и вы сами говорите, что вызов через App.Run, что означает, что не видно их. Иначе через Call можно было вызвать или вообще напрямую - так быстрее процентов на 30%
Изменено: Jack Famous - 26.07.2019 19:57:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А что должно быть? Это же функция рабочего листа, а не COM или объект Excel. И она эффективна именно в этом качестве.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
А что должно быть?
Привет, Виталий.
Может Алексей хочет на рабочем листе иметь подсказку к функции?
 
Господа, ну вы чего в самом деле)))
Дело в том, что я хочу использовать всю мощь функций в своих ПРОЦЕДУРАХ (кнопочных, например). Никак?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Никак?
А вот вы о чём. Может проще было был написать - подсказки для классов, интерфейсов, событий, методов, свойств и функций в VBA? Было бы сразу понятно. Можно. В VS.NET для функции интерфейса, например, нужно прописать атрибут System.ComponentModel.Description.
Подозреваю, что и в C++ нужно сделать нечто подобное
 
Да можно. Даже делал. В СОМ.DLL
Но надо различать СОМ.DLL, и C API Excel. Это совсем разные технологии, разные библиотеки, разные методы обмена информацией с внешним миром.
Для C API Excel я незнаю, можно ли их вообще сделать. Да и зачем, вы же когда пользуетесь поздним связыванием, тоже не видите подсказок. Для этого есть API. У меня исходный код открыт, можно посмотреть какие аргументы у каждой функции. Они видны и в мастере функций. Для СОМ библиотеки я сделал все функции с подсказками при раннем связывании.
Изменено: bedvit - 27.07.2019 13:05:53
«Бритва Оккама» или «Принцип Калашникова»?
 
Андрей, а не получилось реализовать 4й вариант на Excel-DNA? Интересно быстрее он, чем эта универсальная функция?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
а не получилось реализовать 4й вариант на Excel-DNA?
Привет, Виталий.
Если быть, честным, то тот вариант и не пробовал, приношу свои извинения. Получается, что как бы напрасно подбил на исследования. Этот вариант интереснее, большое спасибо! Меня просто интересовал момент с работы с регулярками в Net и VBA, поэтому и пробовал. На практике же это, увы, мне скорее всего не пригодится.
Вечером сидел разбирался с написанием com-классов, а то перед Алексеем похвалился картинкой. Решил изучить, как события добавлять в класс. Ну, и упёрся сейчас в то, что как-то криво проходит. Не получается создать объект - VBA вопит не найден файл, хотя в Object Browser всё есть. Года три назад, когда ковырял это дело, проблем не было. Буду пока копать в этом направлении.
 
Привет Андрей! СОМ - это здорово! На C# пишешь? Я сегодня тоже открыл свои старые наработки, завтра тоже попилю СОМ. Правда на С++
Изменено: bedvit - 28.07.2019 01:54:15
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
СОМ - это здорово! На C# пишешь?
Да, на C#, а вот насчёт - здорово. Всё же не очень. Скорее увиливаю от изучения BPMN и UML - по работе насущная потребность, но не интересно, COM интересно, но где его на работе применять? Коллизия интересов.
 
Цитата
Андрей VG написал:
от изучения BPMN и UML
с моделированием и описанием бизнес-процессов близко не встречался. Даже не знаю насколько это интересно?)
СОМ - для общего образования, совсем неплохо поизучать, особенно если интересно. Я так же изучаю :) Пригодится может в самых разных, СОМ поддерживающих продуктах. Да же если таких нет на работе, все равно знания как это работает - сильно помогает в дальнейшем.
«Бритва Оккама» или «Принцип Калашникова»?
 
Андрей VG, bedvit, доброго времени суток!
Если для подсказок нужно так глобально влезать в код, то оно того точно не стоит, как по мне)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Да можно. Даже  делал . В СОМ.DLLНо надо различать СОМ.DLL, и C API Excel. Это совсем разные технологии, разные библиотеки, разные методы обмена информацией с внешним миром.
к #18 - спасибо за линк оттуда  8) и все комменты по линку !! хороший ликбез по COM
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
bedvit, приветствую! Наконец-то решил плотно заняться вашей xll-надстройкой  :)

1. Скопировал коды из Loader_05 в код листа своей xlam-настройки. Лист-хранилище назвал также "ByteSheet(Storage)" кодовое и видимое имя.
2. С помощью файлового менеджера добавил bedvitXLL(x64).xll в свою надстройку (загрузил файлом). Loader говорит, что он там есть.

Никак не могу использовать функцию. В отличие от загрузки Xll, как настройки - не видно функций даже в списке функций пользователя
Код
Sub sort()
Dim bedvitXLL As Object, arr(254), str$, i&

' создаём строку из всех символов
    For i = 1 To 255
        arr(i - 1) = Chr(i)
    Next i
str = Join(arr, "")

Set bedvitXLL = CreateObject("BedvitCOM.VBA")
Application.Run "FilterUnicodeChar", str, "0-9"
'bedvitXLL.FilterUnicodeChar(str, "0-9")

MsgBox str
End Sub
Даже при подключении, как надстройки, когда на листе всё работает, непонятно, как использовать в коде — всё равно ошибка на Set bedvitXLL = CreateObject("BedvitCOM.VBA")

UPD: увидел что-то похожее в соседней ветке
Изменено: Jack Famous - 31.07.2019 12:27:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, приветствую. Если подключаем функции из xll, то
Код
Application.Run.

Если СОМ надстройку, то через
Код
Dim bedvitXLL As Object, 
Set bedvitXLL = CreateObject("BedvitCOM.VBA")

В данном примере
Код
Dim bedvitXLL As Object, 
Set bedvitXLL = CreateObject("BedvitCOM.VBA")
- не нужны.
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил новый функционал в функцию. Теперь можно выбрать какие символы удаляем. Эти символы задаются в третьем параметре функции.
Пример:
строка
Цитата
"<p><!--АБВабвгдеёжзийклмнопрстуфхцчшщъыьэюяperties>"
функция:
Цитата
=FilterUnicodeChar(F1;"А-бе-яЁё";"я")
результат:
Цитата
АБВабеёжзийклмнопрстуфхцчшщъыьэю

Две библиотеки разной разрядности в одном архиве.
Библы не влезли по причине ограничения в 300КБ.
Доступны по ССЫЛКЕ
Файл Excel прилагаю.
Изменено: bedvit - 03.08.2019 13:27:34
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо вам ОГРОМЕДНОЕ!  :idea:
Суперуниверсальная, мегабыстрая и наикрутейшая плюшка!  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код функции, может кто-то оптимизирует и сделает еще быстрее (ничего сложного, && - это логическое "И") :
Код
extern "C" __declspec(dllexport) wchar_t *  WINAPI FilterUnicodeChar(wchar_t *  StringIn, wchar_t *  EnableChar, wchar_t *  DisableChar)
{
   long eCharSize = EnableChar[0];
   long dCharSize = DisableChar[0];
   long sSize = StringIn[0];
   if (eCharSize > 0)
   {
      sSize = 0;
      for (int i = 1; i <= StringIn[0]; ++i)
      {
         wchar_t uChar = StringIn[i];
         for (int j = 1; j <= eCharSize; ++j)
         {
            if (j < eCharSize - 1 && EnableChar[j + 1] == L'-')
            {
               if (uChar >= EnableChar[j] && uChar <= EnableChar[j + 2])
               {
                  StringIn[++sSize] = uChar;
                  break;
               }
               j = j + 2;
            }
            else if (uChar == EnableChar[j])
            {
               StringIn[++sSize] = uChar;
               break;
            }
         }
      }
   }
   if (dCharSize > 0)
   {
      long iEnd = sSize;
      sSize = 0;
      for (int i = 1; i <= iEnd; ++i)
      {
         wchar_t uChar = StringIn[i];
         bool uCharCopy = true;
         for (int j = 1; j <= dCharSize; ++j)
         {
            if (j < dCharSize - 1 && DisableChar[j + 1] == L'-')
            {
               if (uChar >= DisableChar[j] && uChar <= DisableChar[j + 2])
               {
                  uCharCopy = false;
                  break;
               }
               j = j + 2;
            }
            else if (uChar == DisableChar[j])
            {
               uCharCopy = false;
               break;
            }
         }
         if (uCharCopy) {StringIn[++sSize] = uChar;}
      }
   }
   StringIn[0] = sSize;
   return StringIn;
}
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 След.
Наверх