Помогите разобраться с такой проблемой. Под адрес, например, отведены две объединенные ячейки разной ширины. Из Word вставляю длинное для первой ячейки название. Как узнать не зрительно, на каком символе в первой ячейке обрежется строка, чтобы в дальнейшем после небольших манипуляций со строкой второй ее частью заполнить вторую ячейку. Шрифт не должен изменяться.
Заранее Спасибо.
Всем добрый день.
Помогите разобраться с такой проблемой. Под адрес, например, отведены две объединенные ячейки разной ширины. Из Word вставляю длинное для первой ячейки название. Как узнать не зрительно, на каком символе в первой ячейке обрежется строка, чтобы в дальнейшем после небольших манипуляций со строкой второй ее частью заполнить вторую ячейку. Шрифт не должен изменяться.
Разбить предложение на слова и проверять длину слова, входит ли в первую ячейку, присоединить следующее слово и опять проверить, входит ли в ячейку, и т.д. Но только при моноширинном шрифте так можно сравнивать
Цитата
а как тут может помочь Split?
Разбить предложение на слова и проверять длину слова, входит ли в первую ячейку, присоединить следующее слово и опять проверить, входит ли в ячейку, и т.д. Но только при моноширинном шрифте так можно сравниватьKuzmich
Разбить предложение на слова и проверять длину слова, входит ли в первую ячейку, присоединить следующее слово и опять проверить, входит ли в ячейку, и т.д. Но только при моноширинном шрифте так можно сравнивать
Разбить предложение на слова и проверять длину слова, входит ли в первую ячейку, присоединить следующее слово и опять проверить, входит ли в ячейку, и т.д. Но только при моноширинном шрифте так можно сравнивать
Моноширинный шрифт - Courier New Посмотрите, сколько символов этого шрифта умещается в вашу первую ячейку. С этим числом и сравнивайте первое слово (Len), затем первое + пробел + второе слово, и т.д.
Моноширинный шрифт - Courier New Посмотрите, сколько символов этого шрифта умещается в вашу первую ячейку. С этим числом и сравнивайте первое слово (Len), затем первое + пробел + второе слово, и т.д.Kuzmich
Моноширинный шрифт - Courier New Посмотрите, сколько символов этого шрифта умещается в вашу первую ячейку. С этим числом и сравнивайте первое слово (Len), затем первое + пробел + второе слово, и т.д.
Моноширинный шрифт - Courier New Посмотрите, сколько символов этого шрифта умещается в вашу первую ячейку. С этим числом и сравнивайте первое слово (Len), затем первое + пробел + второе слово, и т.д.
У каждого шрифта разная ширина символов. Если для Courier New в определенную ячейку входит 35 символов ш, то для Arial Cyr только 25 символов. И как тут считать, сколько знаков войдет в ячейку? Вам ведь , наверное, нужно чтобы в ячейку вмещались слова целиком? Тогда выберите какое-либо усредненное значение количества знаков в ячейке для используемого шрифта и с ним сравнивайте.
У каждого шрифта разная ширина символов. Если для Courier New в определенную ячейку входит 35 символов ш, то для Arial Cyr только 25 символов. И как тут считать, сколько знаков войдет в ячейку? Вам ведь , наверное, нужно чтобы в ячейку вмещались слова целиком? Тогда выберите какое-либо усредненное значение количества знаков в ячейке для используемого шрифта и с ним сравнивайте.Kuzmich
Предлагаю решение, основанное на автоматическом подгоне ширины колонки под текстовое содержимое при помощи Range.AutoFit. "Испытания" строки проводятся в новой невидимой рабочей книге, создаваемой по случаю в текущем экземпляре Excel.Application.
В целом получается вполне сносно. Правда, на мелких шрифтах хочется добавить к полученной строке еще один символ (а то и два). Но если после этого вручную выполнить AutoFit, то заданная ширина колонки увеличится. Вероятно, AutoFit резервирует некоторое пространство, например, под возможный значок автофильтра. В качестве метода нехитрой борьбы с подобным явлением можно предложить выравнивать ячейку с результатом по правому краю, либо добавлять символ-два на свой страх и риск.
Поиграться можно в прилагаемом файле.
[vba]
Код
Function getVisibleTextInCell(rngSource As Range, strSource As String) As String
Static wbkTest As Workbook Static rngTest As Range
Dim varTest As Variant Dim posOld As Integer Dim posNew As Integer Dim iter As Integer Const iterMax As Integer = 20
If rngTest Is Nothing Then 'создаем невидимую книгу с тестовым диапазоном (сохраняются между вызовами поскольку Static) With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With Set wbkTest = Application.Workbooks.Add wbkTest.Windows(1).Visible = False Set rngTest = wbkTest.Worksheets(1).Range("A1") With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With End If
If strSource = "" Then 'пустая строка уничтожает статические книгу и диапазон (в конце работы) Set rngTest = Nothing wbkTest.Close False Set wbkTest = Nothing Exit Function End If
'"грубая настройка" 'подгоняем длину строки posNew = Len(strSource) Do iter = iter + 1 posOld = posNew rngTest.Value = Left(strSource, posNew) rngTest.EntireColumn.AutoFit posNew = rngSource.Width / rngTest.Width * posOld Loop Until posNew = posOld Or iter = iterMax
If rngTest.Width > rngSource.Width Then '"тонкая настройка" 'переходим на посимвольное отщипывание с конца (если надо) iter = 0 Do iter = iter + 1 posNew = posNew - 1 rngTest.Value = Left(strSource, posNew) rngTest.EntireColumn.AutoFit Loop Until rngTest.Width <= rngSource.Width Or iter = iterMax End If
wbkTest.Saved = True 'чтобы невидимая книга не просила о сохранении getVisibleTextInCell = Left(strSource, posNew) 'для мелкого шрифта вполне можно добавить символ, т.е. posNew + 1
End Function
[/vba]
На рабочем листе данная функция, к сожалению, использоваться не может, так как содержит операторы, изменяющие данные на рабочем листе, пусть и в другой рабочей книге.
Предлагаю решение, основанное на автоматическом подгоне ширины колонки под текстовое содержимое при помощи Range.AutoFit. "Испытания" строки проводятся в новой невидимой рабочей книге, создаваемой по случаю в текущем экземпляре Excel.Application.
В целом получается вполне сносно. Правда, на мелких шрифтах хочется добавить к полученной строке еще один символ (а то и два). Но если после этого вручную выполнить AutoFit, то заданная ширина колонки увеличится. Вероятно, AutoFit резервирует некоторое пространство, например, под возможный значок автофильтра. В качестве метода нехитрой борьбы с подобным явлением можно предложить выравнивать ячейку с результатом по правому краю, либо добавлять символ-два на свой страх и риск.
Поиграться можно в прилагаемом файле.
[vba]
Код
Function getVisibleTextInCell(rngSource As Range, strSource As String) As String
Static wbkTest As Workbook Static rngTest As Range
Dim varTest As Variant Dim posOld As Integer Dim posNew As Integer Dim iter As Integer Const iterMax As Integer = 20
If rngTest Is Nothing Then 'создаем невидимую книгу с тестовым диапазоном (сохраняются между вызовами поскольку Static) With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With Set wbkTest = Application.Workbooks.Add wbkTest.Windows(1).Visible = False Set rngTest = wbkTest.Worksheets(1).Range("A1") With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With End If
If strSource = "" Then 'пустая строка уничтожает статические книгу и диапазон (в конце работы) Set rngTest = Nothing wbkTest.Close False Set wbkTest = Nothing Exit Function End If
'"грубая настройка" 'подгоняем длину строки posNew = Len(strSource) Do iter = iter + 1 posOld = posNew rngTest.Value = Left(strSource, posNew) rngTest.EntireColumn.AutoFit posNew = rngSource.Width / rngTest.Width * posOld Loop Until posNew = posOld Or iter = iterMax
If rngTest.Width > rngSource.Width Then '"тонкая настройка" 'переходим на посимвольное отщипывание с конца (если надо) iter = 0 Do iter = iter + 1 posNew = posNew - 1 rngTest.Value = Left(strSource, posNew) rngTest.EntireColumn.AutoFit Loop Until rngTest.Width <= rngSource.Width Or iter = iterMax End If
wbkTest.Saved = True 'чтобы невидимая книга не просила о сохранении getVisibleTextInCell = Left(strSource, posNew) 'для мелкого шрифта вполне можно добавить символ, т.е. posNew + 1
End Function
[/vba]
На рабочем листе данная функция, к сожалению, использоваться не может, так как содержит операторы, изменяющие данные на рабочем листе, пусть и в другой рабочей книге.Gustav
Уважаемый Gustav и все остальные. Но прошу вас, не предлагать всякие и среднестатистические подгонки. Прошу вас прочитать внимательно мой пост - чего я хочу добиться.
Хочу точного решения. :deal:
Задача нетривиальная, согласитесь со мной. Вообще-то я уже за два дня разрешил свою проблему - готов уже примерный файл, выложу дня через два, - но , к моему сожалению, это уже не VBA, а сплошной С. [moder]Не надо цитировать пост целиком. Это нарушение Правил форума[/moder]
Цитата удалена
Уважаемый Gustav и все остальные. Но прошу вас, не предлагать всякие и среднестатистические подгонки. Прошу вас прочитать внимательно мой пост - чего я хочу добиться.
Хочу точного решения. :deal:
Задача нетривиальная, согласитесь со мной. Вообще-то я уже за два дня разрешил свою проблему - готов уже примерный файл, выложу дня через два, - но , к моему сожалению, это уже не VBA, а сплошной С. [moder]Не надо цитировать пост целиком. Это нарушение Правил форума[/moder]Shu
Сообщение отредактировал Pelena - Четверг, 17.12.2015, 21:28
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса.
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса. Wasilich
п.5j - излишнее цитирование (цитирование поста целиком, например);
Вы сами себе противоречите - излишнее цитирование (цитирование поста целиком, например). А если я процитировал пост целиком - что тут преступного или противозаконного? Что тут, Gb не хватает или амбиции модератора?
Вы что там чиновники?, может по моей теме что-нибудь ответите или дадите какие-нибудь рекомендации?
п.5j - излишнее цитирование (цитирование поста целиком, например);
Вы сами себе противоречите - излишнее цитирование (цитирование поста целиком, например). А если я процитировал пост целиком - что тут преступного или противозаконного? Что тут, Gb не хватает или амбиции модератора?
Вы что там чиновники?, может по моей теме что-нибудь ответите или дадите какие-нибудь рекомендации?Shu
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса.
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса.
Уважаемый Wasilic. Я уже согласен, что я - Марсианен, ну почитай мой пост, что Вам для исходных данных не хватает? [moder]А марсиане все такие чуткие и отзывчивые?
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса.
Shu, Если не трудно, выложите файлик с этими объединенными ячейками, длинным предложением, его шрифтом, как есть, и как вы хотите чтобы было. Хочу поупражняться. Не может быть, чтоб это не решалось в ВБА. Чисто ради интереса.
Уважаемый Wasilic. Я уже согласен, что я - Марсианен, ну почитай мой пост, что Вам для исходных данных не хватает? [moder]А марсиане все такие чуткие и отзывчивые?Shu
Сообщение отредактировал _Boroda_ - Четверг, 17.12.2015, 22:52