Страницы: 1
RSS
Узнать Количество Символов в Шрифте
 
Здравствуйте.
Как узнать количество символов в конкретном шрифте?
Например в Arial Black?
Скажу, что шрифт ячейки задан так:

Код
1
[a1].Font.Name="Arial Black"
;)
 
Цитата
Как узнать количество символов в конкретном шрифте?
??? - Выбрать шрифт и... внести все знаки - лучше - в Юникод (шестн.), измерить...  ;)
Изменено: Z - 15.11.2013 18:20:31
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Идею понял, Вот мой код, он выдает ошибку при больших числах, если бы можно было бы при ошибке перейти к следующему элементу(предотвратив появление ошибки:если ошибка, то просто перейти к следующему элементу).


Код
1
2
3
4
5
6
7
8
9
10
Public Sub Subi02()
Dim e As Range
For Each e In Selection
'e.Interior.ColorIndex = e.Value
e.Font.Name = "Arial Black"
e.Font.Size = 23
e.Value = Chr(e.Value)
On Error Resume Next
Next e
End Sub



Можете помочь, нужно проигнорировать ошибку и перейти к следующему элементу???  ;)
Изменено: usersuperpupsik - 15.11.2013 18:23:10
 
:?:  перед циклом
Код
1
On Error Resume Next
Изменено: Sanja - 15.11.2013 18:57:28
Согласие есть продукт при полном непротивлении сторон
 
Sanja, я переместил строку On Error Resume Next и вышло то, что нужно!!!  :D  
Вот код который я доработаю, а пока проблем нет!

Код
1
2
3
4
5
6
7
8
9
Public Sub Subi02()
Dim e As Range
For Each e In Selection
On Error Resume Next
e.Font.Name = "Arial Black"
e.Font.Size = 23
e.Value = Chr(e.Value)
Next e
End Sub


Спасибо, Z!
Спасибо, Sanja!
 
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Sub Subi03()
 
Dim ko As Integer
ka = 0
[a1] = 0
[a1].Font.Name = "MS Mincho"
 
While (True)
On Error GoTo string1
[a1] = Chr(ka)
ka = ka + 1
Wend
 
string1: [a1] = ka
End Sub

Вот дела, мой код говорит, что В Шрифте  MS Mincho 256 символов,
А (таблица символов) на Windows 7 говорит что их больше 300,
Почему так?Может быть в vba Шрифтах неполные шрифты(мало вероятно)!?!
 
[a1] = ChrW(ka)
'Только предусмотрите как будете прерывать программу...
 
Спасибо, Skif-F, теперь получилось то что нужно!!!   :D  
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Sub Subi03()
 
Dim ko As Integer
ka = 0
[a1] = 0
[d1] = 0
[c1] = -32768
'[a1].Font.Name = "MS Mincho"
 
While (True)
DoEvents
If [e1] = 0 Then GoTo string1
On Error GoTo string1
 
[a1] = ChrW(ka)
'[a1] = Chr(ka)
ka = ka + 1
[d1] = [d1] + 1
[c1] = [c1] + 1
Wend
 
string1: [d1] = ka
End Sub

Теперь программа дала результат > 65536 символов. Сколько же на самом деле символов  в Шрифте MS Mincho?
А в других шрифтах сколько символов?
 
Вариант через WinAPI.
 
Афигеть сколько работы и как сложно!
И что, в этих результатах есть какая-то практическая польза?
Хотя я себе как пример сохранил, может когда нибудь будет практическая польза от фрагментов этого кода :)
Спасибо anvg :)
 
Игорь
Работы не так уж и много константы и определения API взяты через copy/paste, основная идея отсюда , кое-что дописал. А пригодится, по моему мнению, может для определения есть ли требуемый диапазон юникода (языка) в данном шрифте (определяется в массиве GlyphRanges). Зачем же нужно само по себе количество символов и для меня загадка, может ТС сообщит?
 
Т.е. практически можно например сказать юзеру, что вот в этой ячейке выставленный фонт не совместим с кодом, т.к. не сможет корректно отобразить результат работы? Возможно... Но проще выставить молча кодом нужный фонт и не париться  :)
Ну или чтоб юзер совсем не отупел - пусть сам подумает, почему вместо кириллицы например звездочки и самолётики с шрифтом wingdings :)
 
Anvg, я скачал Ваш примерчик, у меня в коде красные фрагменты, vba ругается:
Цитата
The code in this project must be updated for use on 64 bit systems.Please review and update Declare statements and then mark them with the PtrSafe attribute.
Скажу, что на компьюторе:
Windows 7,
64 bit,
MS Office 2007
Изменено: usersuperpupsik - 17.11.2013 22:14:06
 
Hugo
Цитата
Ну или чтоб юзер совсем не отупел - пусть сам подумает
Согласен. Только чем более профессионален пользователь в своей области, тем проще с ним работать - ему важен смысл и учёт нюансов, а не визуальный жёсткий каркас. Он то сможет подобрать шрифт, а вот ..., для таких как раз и приходится программно подбирать, чтобы не дёргал, а почему у меня самолётики  :D  . Такой от жёсткой схемы отойти не сможет. Шаг влево вправо - всё смысл потерян.  :evil:  
Кстати, судя по этой статье результат всё же не число символов в шрифте. Похоже, чтобы однозначно сказать - нужно читать описание файлов TrueType и OpenType и анализировать файл шрифта напрямую.
usersuperpupsik
Мне кажется или это на самом деле, вы меня обманываете с версией Excel? В Excel 2007 нет PtrSafe. Скорее всего у вас 64бит версия или 2010 или 2013. Для GetFontUnicodeRanges объявление будет

Код
1
Private Declare PtrSafe Function GetFontUnicudeRanges Lib "gdi32" (ByVal hDC As LongPtr, ByRef pGlyphSet As Any) As Long
Для остальных скачайте и используйте. И не забудьте тип переменных hDC, hFont объявить как LongPtr и использовать CLngPtr(Application.Hwnd) как аргумент для GetDC.
P. S. Вы так и не удовлетворили наше любопытство зачем вам нужно знать
Цитата
Как узнать количество символов в конкретном шрифте?
Изменено: anvg - 18.11.2013 08:31:35
 
Цитата
P. S. Вы так и не удовлетворили наше любопытство зачем вам нужно знать
Просто хочу узнать какой Font содержит больше всего, а какой меньше всего символов.  ;)  
Цитата
Скорее всего у вас 64бит версия или 2010 или 2013
Вы правы, у меня MS Office 2010.При включении программы каждый раз показывает версию, как я не учел это!!!   :D  
Я немного изменил Ваш код, anvg, и теперь всё работает.(Проверил на Windows 7 , 64 bit, MS Office 2010)
Спасибо Вам Огромное,  anvg, буду проверять шрифты...

Вот 2 файла оригинал и изменёный.
 
Что ж, тогда успехов! Только не забудьте, что результат не физическое количество символов в шрифте, а количество символов юникода. То есть латинский алфавит, например, является базой для алфавитов многих языков, поэтому физические буквы a-z учитываются в каждом языковом диапазоне юникода. То есть, допустим 26 букв латиницы физически в шрифте, а шрифт поддерживает 10 языковых диапазонов юникода, тогда результат будет 260 символов.
Страницы: 1
Читают тему
Loading...