Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/41: Рейтинг темы: голосов - 41, средняя оценка - 4.54
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Соотношение ширины ячейки и количества символов, которые в нее поместятся в одну строку

29.08.2012, 01:09. Показов 7943. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я полагаю, зависимости такие:
1) Название Шрифта.
2) Размер шрифта
3) Жирный или нет, курсив или нет
4) Какие именно буквы введены (у разных букв алфавита обычно тоже разная ширина). Поэтому вопрос в теме слегка некорректен.
5) Собственно ширина ячейки.
6) Вид в котором мы смотрим на ячейку (обычный или предварительный просмотр - тоже есть разница; причем последний для меня в приоритете, так как он показывает как именно будет выглядеть лист при печати).

Как расcчитать?

P.S. Раньше мне это требовалось, чтобы не Excel за меня разрывал слова, а я сам расставлял программно vbCrLf там, где нужно, если узнаю, что тект в ячейку целиком не влезет. Но обошол проблему неразрывными пробелами (Alt+ц.255, Chr$(160)).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2012, 01:09
Ответы с готовыми решениями:

Как уместить текст в одну строку независимо от ширины символов в ней
Добрый день! Уважаемы форумчане, просьба помочь в решении следующей задачи. Я написал макрос, который вставляет строку в шаблон word....

Создать строку, состоящую из символов, которые входят как в одну, так и в другую строку (не string-ом)
Условие: Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку Здесь я...

Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку
Прошу помощи!

15
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
29.08.2012, 01:35
Цитата Сообщение от Dragokas Посмотреть сообщение
Я полагаю, зависимости такие:
1) Название Шрифта.
2) Размер шрифта
3) Жирный или нет, курсив или нет
4) Какие именно буквы введены (у разных букв алфавита обычно тоже разная ширина). Поэтому вопрос в теме слегка некорректен.
5) Собственно ширина ячейки.
6) Вид в котором мы смотрим на ячейку (обычный или предварительный просмотр - тоже есть разница; причем последний для меня в приоритете, так как он показывает как именно будет выглядеть лист при печати).

Как расcчитать?

P.S. Раньше мне это требовалось, чтобы не Excel за меня разрывал слова, а я сам расставлял программно vbCrLf там, где нужно, если узнаю, что тект в ячейку целиком не влезет. Но обошол проблему неразрывными пробелами (Alt+ц.255, Chr$(160)).
В MS Access, для этой цели есть функция TwipsFromFont объекта WizHook. Она позволяет рассчитать ширину поля, необходимую для принятия текста со всеми особенностями шрифта. К сожалению, я не знаю, как ее можно было бы использовать в екселе, поскольку она записана в модуле mde-файла, поставляемого вместе с аксом.
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
29.08.2012, 05:42
не оч. содержательный пост, но думаю, ничего чисто екселевско-вба-шного для такой задачи нет.
так что прямая дорога вам в страну WinAPI.
что там конкретно нужно - пока не могу сказать.

пс.
Цитата Сообщение от Dragokas Посмотреть сообщение
6) Вид в котором мы смотрим на ячейку (обычный или предварительный просмотр - тоже есть разница; причем последний для меня в приоритете, так как он показывает как именно будет выглядеть лист при печати).
если масштаб листа сделать точно такой же, как масштаб при просмотре - то должно быть одинаково. правда, 100%-ной гарантии не дам.
0
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
29.08.2012, 09:04
Dragokas, а зачем такое усложнение win api и ему подобные...... не проще колхозным методом 1.вычислить самую большую букву или цифру, и программно делать ширину ячейки кратную максимальной ширине буквы
2.вычислить соотношение режим просмотра к разным размерам екрана или т.п. и применять как поправочный коефициент к п.1
0
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
29.08.2012, 09:51
Цитата Сообщение от Dragokas Посмотреть сообщение
Как расcчитать?
AutoFit здесь не может помочь?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.08.2012, 12:53  [ТС]
Нет, ширину подганять нельзя (т.е. не нужно). Она должна оставаться статическая.
0
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
29.08.2012, 14:18
Цитата Сообщение от Dragokas Посмотреть сообщение
Поэтому вопрос в теме слегка некорректен.
Тогда как его правильно сформулировать?
Может быть так - вмещается ли содержимое ячейки в её границы?
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.08.2012, 14:40  [ТС]
Нет, не стоит изменять. В таком виде интуитивно более понятно.

Определить, помещается ли текст в одну строку ячейки при заданной ширине?
0
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
29.08.2012, 15:21
Цитата Сообщение от Dragokas Посмотреть сообщение
Нет, не стоит изменять.
А если на мгновение - никто и не заметит, если пару строк разремить.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'True, если текст ячейки поместится в одну строку при заданной ширине ячейки
Function IsFull(r As Range) As Boolean
Dim oldW As Single
'Dim oldWT As Boolean
'Application.ScreenUpdating = False
oldW = r.ColumnWidth
'oldWT = r.WrapText
'r.WrapText = False
r.Columns.AutoFit
 
IsFull = oldW >= r.ColumnWidth
 
'r.WrapText = oldWT
r.ColumnWidth = oldW
'Application.ScreenUpdating = True
End Function
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.08.2012, 16:45  [ТС]
Ну вот, опять извращения. Надо ж до такого додуматься - применять автофит, чтобы проверить подвинется ли граница.
Однако это должен быть рабочий вариант решения ), который мне подойдет.
0
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
29.08.2012, 23:34
Dragokas, а ее и не нужно проверять, есть определенная ширина ячейки, также есть максимальная ширина буквы (например "ш") ну и все просто нужно проверить сколько таких "ш" влезет в ячейку........... в чем такая проблема господа или я че то не понимаю суть проблемы?
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.08.2012, 00:10  [ТС]
Т.е. вы предлагаете Autofit-ом проверить ширину каждой буквы используемого шрифта определенного размера. Построить таблицу значений. А потом определить математическим методом сложения допустимую ширину, анализируя каждую букву алфавита. Я правильно Вас понимаю?
А там ведь еще и интервал между буквами.
Этот вариант мне больше нравится.
Цитата Сообщение от IvanOK Посмотреть сообщение
в чем такая проблема господа или я че то не понимаю суть проблемы?
Если у Вас такая таблица значений есть, то и нет никакой проблемы.
Хотя написать макрос ее построения, думаю, не составит труда.
1
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
30.08.2012, 01:35
Dragokas, таблицы пока нет, я еще проще предлагаю взять макс. большой символ и все
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.08.2012, 01:47  [ТС]
Взял, и что дальше?

Похоже, Вы не прочитали пост № 8 (... при заданной ширине ячейки).
Растягивать ничего не нужно. Мой дефолтный фрифт такой: Times New Roman, 11, не-жирный, не-курсив.
0
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
30.08.2012, 10:08
Ну так "ш" при таких даных имеет ширину 1.50(14 пикс.)
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
30.08.2012, 16:42
Вижу 2 варианта:
1. Трудный тернистый, наиболее правильный - отыскать на msdn способ узнать желаемое с помощью Win API и перевести это в код на VBA;
2. Простой и похожий на autofit способ - выясненить длину строки при помощи ActiveX control Label с .Autosize=True, WordWrap=False (сравнить с шириной ячейки - поинты перевести в пикселы).

Добавлено через 36 минут
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _
    ByVal hDc As Long, _
    ByVal lpsz As String, _
    ByVal cbString As Long, _
    lpSize As Size) As Long
 
Private Type Size
    cx As Long
    cy As Long
End Type
 
Sub test()
    Dim strt As String 'строка
    Dim tlen As Size 'структура для приема результата
    Dim hDc As Long 'контекст рисования (куда выводится)
    
    '...
    
    GetTextExtentPoint32 hDc, strt, Len(strt), tlen
End Sub
Остается грамотно докопаться до контекста устройства в месте отрисовки текста ячейки Excel. Это окно объекта Window или дочернее ему окно. Так как каждая отдельная видимая ячейка Excel может иметь отдельные форматы, нужно добить hDC именно в месте прорисовки текста. Наиболее простым видится сымитировать формат ячейки, скажем ручной настройкой контекста любого известного нам окна.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2012, 16:42
Помогаю со студенческими работами здесь

DBGrid Автоматическое изменение ширины ячейки в зависимости от количества текста в ней
Здравствуйте! Пишу программу на Visual Basic 6.0. Интересует как в компоненте DBGrid сделать автоматическое изменение ширины ячейки в...

Ограничение количества символов в TextBox относительно его ширины
Всем привет! Может кто нибудь подскажет? Мне нужно чтобы в текстбокс вмещалось столько символов, сколько может позволить его...

Дана строка символов. Преобразовать данную строку, удалив из нее каждую пару символов >> и вставив вместо них пару символов <<.
Дана строка символов. Преобразовать данную строку, удалив из нее каждую пару символов &gt;&gt; и вставив вместо них пару символов &lt;&lt;....

Написать программу, которая вводит с клавиатуры строку не более 100 символов, еще одну строку не более 50 символов и выводит на экран позиции вхождени
Задание: Написать программу, которая вводит с клавиатуры строку не более 100 символов, еще одну строку не более 50 символов и выводит на...

Поместить в строку s1 строку s2 с удалённым из неё фрагментом из n символов, начиная с i-го
Здравствуйте, помогите пожалуйста разобраться хотя бы с одной задачей(а дальше я бы сообразила). Заранее спасибо, большое!!! 1) В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru