Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 13:47   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Высота строки в зависимости от длины текста

Добрый день, уважаемые форумчане!
Параметры строк и столбцов в таблице регламентированы ГОСТом. Высота строки может быть либо 8мм, либо 16 мм. Ширина столбца 90 мм, шрифт Arial Narrow 10й. Ячейки настроены на перенос по словам.
Как в макросе прописать условие, когда длина текста превышает столько-то символов, то высота строки устанавливается в 16 мм? Или может какое-то другое условие можно использовать? Что-то типа:

Код:
If Cells(i, 4).Text > "90 символов" Then Rows(i).RowHeight = 16
Таблица - Ведомость покупных изделий (ГОСТ 2.104-2006).
Заранее спасибо!
strannick вне форума Ответить с цитированием
Старый 18.01.2013, 14:21   #2
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

наверное так:
Код:
Dim i&
For i = 1 To 10
    If Len(Cells(i, 4)) > 90 Then
        Rows(i).RowHeight = 16
    Else
        Rows(i).RowHeight = 8
    End If
Next i
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 18.01.2013, 16:42   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Сообщение от staniiislav Посмотреть сообщение
наверное так:
примерно так.
В Excel высота строк измеряется точно не в миллиметрах.

strannick, вам надо будет только подобрать методом научного тыка эти 2 значения (вместо 8 и 16)
EducatedFool вне форума Ответить с цитированием
Старый 19.01.2013, 01:14   #4
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
примерно так.
В Excel высота строк измеряется точно не в миллиметрах.
она измеряется в пунктах (насколько помню). При желании можно перевести.

Цитата:
Сообщение от strannick Посмотреть сообщение
Как в макросе прописать условие, когда длина текста превышает столько-то символов, то высота строки устанавливается в 16 мм?
бесполезно, если шрифт не моноширинный. Ширина букв разная, кроме этого они СТРОЧНЫЕ и прописные

алгоритм:
1. подобрать высоту стандартным автоподбором
2. перевести в миллиметры
3. округлить до 8 или 16 мм

Могу реализовать, но не бесплатно.
Тишина – самый громкий звук

Последний раз редактировалось nerv; 19.01.2013 в 01:17.
nerv вне форума Ответить с цитированием
Старый 19.01.2013, 02:40   #5
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
strannick, вам надо будет только подобрать методом научного тыка эти 2 значения (вместо 8 и 16)
Это-то довольно легко. 8мм - это 22,5пт. Переводим в режим Разметки страницы, устанавливаем высоту строки в 0,8см (в этот режиме измерение идет в см.). Переходим в Обычный режим. Смотрим высоту этой строки = 22,5пт.
А вот насчет длины текста, то тут да, Придется опытным путем определять момент переноса. Благо дело используется только один шрифт.
staniiislav, спасибо за код. Попробую и отпишусь. Спасибо всем, тема пока не закрывается.
strannick вне форума Ответить с цитированием
Старый 19.01.2013, 09:18   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
nerv: она измеряется в пунктах (насколько помню)
Может я чего-то не понимаю, но эта информация есть во встроенной VBA-справке.
В VBA в верхнем правом углу есть поле. Туда нужно скопировать и вставить вот этот текст RowHeight и нажать клавишу "Enter".

Откроется список статей, выбираем Range.RowHeight Property.


Вот цитата из справки:

Range.RowHeight Property
Returns the height of all the rows in the range specified, measured in points (point: Unit of measure referring to the height of a printed character. A point equals 1/72 of an inch, or approximately 1/28 of a centimeter.).

Points - это пункты.

Последний раз редактировалось Скрипт; 19.01.2013 в 09:24.
Скрипт вне форума Ответить с цитированием
Старый 19.01.2013, 12:56   #7
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Может я чего-то не понимаю, но эта информация есть во встроенной VBA-справке.
все верно. Ну не лезть же перед каждым ответом в справку/редатор кода. Долго)

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Вот цитата из справки:

Range.RowHeight Property
Returns the height of all the rows in the range specified, measured in points (point: Unit of measure referring to the height of a printed character. A point equals 1/72 of an inch, or approximately 1/28 of a centimeter.).
Только ребята не договаривают, что эти константы могут меняться в зависимости от DPI системы.

http://social.msdn.microsoft.com/For...-9f4f2b58f697/
http://office.microsoft.com/en-us/ex...001151724.aspx
Тишина – самый громкий звук

Последний раз редактировалось nerv; 19.01.2013 в 12:59.
nerv вне форума Ответить с цитированием
Старый 19.01.2013, 14:16   #8
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

А вот насчет длины текста, то тут да, Придется опытным путем определять момент переноса.

Сохраните в переменной высоту пустой строки (1 раз). После вставки текста сравните высоту строки с сохраненной. Если не изменилась - нет переноса, ставьте 8 мм. Если изменилась - есть перенос, ставьте 16 мм.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 19.01.2013, 19:31   #9
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Сохраните в переменной высоту пустой строки (1 раз). После вставки текста сравните высоту строки с сохраненной. Если не изменилась - нет переноса, ставьте 8 мм. Если изменилась - есть перенос, ставьте 16 мм.
Код:
Row.AutoFit
Row.RowHeight = IIf(Row.RowHeight <= 8, 8, 16)
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 21.01.2013, 21:34   #10
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Еще раз Добрый вечер всем!
Спасибо всем откликнувшимся и предложившим варианты решения. На дружественном форуме нашел решение следующего характера (взято отсюда http://www.excelworld.ru/forum/2-890-1, спасибо Serge_007 и RAN):

Код:
Option Explicit
Dim myLong  As Integer

Sub Text_to_Rows()

    Dim myCell As Range
    Dim li As Integer, le As Integer
    Dim strText, myText As String
    Dim Str As String, myStr As String, endStr As String
    Dim textLong As Integer, msg As Long, myType As Boolean
    Dim myTextCel As String, myTextCelEnd As String

    On Error GoTo END_
    'отключил ручную установку длины строки
    'If myLong <> 0 Then
    '    myLong = InputBox("Длинна строки установлена " & Chr(13) & Chr(13) _
                        & myLong & " знаков", , myLong)
    'Else
    '    myLong = InputBox("Длинна строки не задана" & Chr(13) & Chr(13) _
                        & "предлагается 116 знаков", , 116)
    'End If
    myLong = 55 'установил опытным путем длину строки
    Application.ScreenUpdating = False
    Set myCell = ActiveCell
    myText = ActiveCell.Value
    myText = Application.Trim(myText)
    textLong = Len(myText)
    strText = Split(myText, " ")
line1:
    For le = LBound(strText) To UBound(strText)
        If strText(le) <> "" Then
            myStr = Trim(strText(le)) + " "
            If textLong > myLong Then
                endStr = Str + myStr
                If Len(endStr) > myLong Then
                    li = li + 1
                    Rows(myCell.Row + li).Insert
                    Rows(ActiveSheet.UsedRange.Rows.Count + 10).Copy
                    Rows(myCell.Row + li).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                                                       SkipBlanks:=False, Transpose:=False
                    ' подкраска строки
                    'myCell.Offset(li, 0).Interior.Color = 16777164 'отключил заливку

                    myCell.Offset(li, 0) = Left(Str, (Len(Str) - 1))
                    myText = Right(myText, Len(myText) - (Len(Str)))
                    strText = Split(myText, " ")
                    Str = ""
                    textLong = Len(myText)
                    GoTo line1
                Else
                    Str = endStr
                End If
            Else
                li = li + 1
                Rows(myCell.Row + li).Insert
                Rows(ActiveSheet.UsedRange.Rows.Count + 10).Copy
                Rows(myCell.Row + li).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                                                   SkipBlanks:=False, Transpose:=False
                'myCell.Offset(li, 0).Interior.Color = 16777164 'отключил заливку
                myCell.Offset(li, 0) = myText
                GoTo Exit_
            End If
        End If
    Next le
Exit_:
    Application.CutCopyMode = False
    ' удалить исходную ячейку
    myCell.Delete 'вставка разделенного текста идет с исходной строки
    ' выделить исходную ячейку
    myCell.Select
    Application.ScreenUpdating = True
END_:
End Sub
Вариант более приемлемый, потому как не будет расширять лист вниз и можно сделать строки сразу высотой 8мм и не менять. Данный код разбивает текст в активной ячейке по строкам вниз начиная с активной.
Вопрос в том, как при наличии в одном столбце нескольких ячеек с длинным текстом (как во вложении). провести разбиение текста по строкам во всех ячейках? Понимаю, что надо привязать цикл, но как это сделать не въезжаю. Ведь разбивки текста диапазон будет расширяться вниз.
Прошу совета.
Вложения
Тип файла: rar текст по строкам.rar (12.7 Кб, 43 просмотров)
strannick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авто изменение размера полей, подчиненной формы в зависимости от длины текста VanDerGraat Microsoft Office Access 1 09.01.2013 01:21
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Высота ЛистБокс, в зависимости от его содержимого Stilet Общие вопросы .NET 4 27.10.2010 16:48
Высота текста Che Guevara HTML и CSS 2 12.08.2010 00:38
Высота текста k1r1ch Общие вопросы Delphi 4 10.06.2010 21:54