Страницы: 1
RSS
Количество знаков в ячейке с условием
 
Как подсчитать количество знаков в текстовой строке при условии что кириллица идет за 2, а все остальное за 1
Пример:
12345 ABC=9
12345 АБВ=12
 
И вам тоже здравствуйте  ;)  
UDF
Код
Public Function CharCount(ByVal this As String) As Long
    Dim rusCount As Long
    With CreateObject("VBScript.RegExp")
        .Global = True: .IgnoreCase = True: .Pattern = "[ёа-я]"
        rusCount = .Execute(this).Count
    End With
    CharCount = Len(this) + rusCount
End Function

Успехов.
Изменено: Андрей VG - 14.12.2015 06:16:26
 
Цитата
SHARP написал: Как подсчитать количество знаков
Каких именно знаков? Если нужно исключить пробелы (или какие-либо другие символы), то макрос отв Андрей VG не подойдёт.
There is no knowledge that is not power
 
Цитата
SuperCat написал: Если нужно исключить пробелы
Если посмотреть пример
Цитата
SHARP написал: 12345 ABC=9
, то пробел входит  ;)  . Тут если к чему и придираться, в рамках постановки задачи, то к тому, что шаблон [ёа-я] не включает все знаки кириллицы :)
 
SuperCat, ни чего исключать не надо. Андрей VG правильно понял мой вопрос  и решил задачу, за что большое СПАСИБО.
Андрей VG подскажите пожалуйста какие знаки кириллицы не входят в шаблон [ёа-я].
 
Доброе время суток
Цитата
SHARP написал:
подскажите пожалуйста какие знаки кириллицы не входят в шаблон [ёа-я]
Вопрос скорее филосовский, что считать кириллицей? По статье в Википедия исходную Кирилла и Мефодия, современные славянские азбуки? Азбуку народов бывшего СССР, созданную на базе кириллицы?
В моём примере кириллица только русского алфавита. Если нужно будет добавить недостающие буквы, например, славянских языков. То, наверное, стоит добавлять и строчные и прописные в шаблон как символы unicode, удалив IgnoreCase. Пример, если русский алфавит задавать в шаблоне через unicode (можно посмотреть в стандартной программе Windows Таблица символов).
Код
Public Function CharCount(ByVal this As String) As Long
    With CreateObject("VBScript.RegExp")
        .Global = True: .Pattern = "[\u0401\u0451\u0410-\u044F]"
        CharCount = Len(this) + .Execute(this).Count
    End With
End Function
 
Еще рас СПАСИБО Андрей VG
 
Вот так еще можно, не требует списка/маски символов:
Код
Function ChCount(Txt As String) As Long
  Dim a() As Byte, i As Long
  a() = Txt
  For i = 1 To UBound(a) Step 2
    If a(i) = 0 Then ChCount = ChCount + 1 Else ChCount = ChCount + 2
  Next
End Function
Изменено: ZVI - 21.12.2015 05:35:11
 
Доброе время суток
Владимир, код конечно же будет быстрее. Но! А если в тексте будут символы, например, греческого алфавита? Тогда уж
Код
Public Function CharCount(ByVal this As String) As Long
    Dim m() As Byte, i As Long, vCount As Long
    m = this: vCount = 0
    For i = LBound(m) To UBound(m) Step 2
        If ((m(i + 1) = 4) And ((m(i) = 1) Or (m(i) = 81) Or ((m(i) > 15) And (m(i) < 80)))) Then vCount = vCount + 1
        vCount = vCount + 1
    Next
    CharCount = vCount
End Function
 
Добрый день, Андрей.
С греческим будет всё корректно, специально проверил на греческом тексте.
Используется тот факт, что в символах Unicode (в представлении MS) второй байт всегда нулевой только для английского, цифр, пробелов, знаков препинания и прочих знаков англ. набора.
Изменено: ZVI - 21.12.2015 13:44:28
 
Владимир, что-то у меня не сходится. Скопировал часть текста в ячейку.  В Locals по нечётным позициям 3, а не 0. Где ошибаюсь?
 
Андрей, там есть нули и не нули (тройки).
Нули в данной случае у пробелов и запятых, их вес в итоговой сумме равен единице, как и для англ. символов.
А вес остальных (греческих) символов (с тройкой) равен двойке, как и для русских символов (с четверкой).
Функция ChCount разделяет английские, включая пробелы и проч. (англ.) знаки, и не английские (русские, болгарские, греческие и т.п.).
Если было бы нужно различать из национальных только руcские, то условие в цикле будет таким:
Код
If a(i) = 4 Then ChCount = ChCount + 2 Else ChCount = ChCount + 1
 
Доброе время суток Владимир
Цитата
ZVI написал:
Функция ChCount разделяет английские, включая пробелы и проч. (англ.) знаки, и не английские (русские, болгарские, греческие и т.п.).
Спасибо. Понятно. У вас просто менее строгое относительно вопроса решение.
Цитата
Как подсчитать количество знаков в текстовой строке при условии что кириллица идет за 2, а все остальное за 1
 
Доброе время суток
И вам спасибо ZVI именно для подсчета байт все это мне и нужно :)
подскажите пожалуйста как учитывая эту особенность с объемом сократить количество символов до заданного
Пример
12345 АБВ = 12
длинна не должна превышать 9
12345 А
Изменено: SHARP - 22.12.2015 16:47:50
 
SHARP, добавьте в самое начало, после объявления переменной строку (код от ZVI):
Код
Txt = Left(Txt,9)
, хотя у вас в примере не 9 знаков, а 7... или я не так понял?
Изменено: bedvit - 22.12.2015 18:07:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Спасибо bedvit, это не совсем то, что мне нужно. Наверно я не до конца пояснил свою задачу. Лучше начну новую тему.
Страницы: 1
Наверх