VBA Excel - перенос слов - PullRequest
       38

VBA Excel - перенос слов

10 голосов
/ 03 мая 2011

Я создаю небольшой фрагмент кода VBA с определенной формулой, однако в нем есть пара операторов if, один из которых содержит строку из двух строк (с vbNewLine) Проблема в том, что я не вижу текст.

Так что я хотел обернуть слова, но каждый раз, когда я устанавливал ActiveCell.WrapText = True, ничего не происходило.

Я проверил с окном сообщения. Я установил WrapText в True, я возвращаю значение свойства с помощью MessageBox для подтверждения, и оно все еще False.

Мне также сказали использовать ActiveCell.Rows.AutoFit, но AutoFit ничего не делает, если текст не переносится.

Есть идеи, что я тут не так делаю?

Ответы [ 6 ]

16 голосов
/ 03 мая 2011

попробовать:

Sub WrapandFit()

    ActiveCell.WrapText = True
    ActiveCell.EntireRow.AutoFit

End Sub

Это сработало для меня. Убедитесь, что ваше обновление экрана также установлено в true.

4 голосов
/ 27 марта 2017

Для меня код ниже работал. (устанавливается только для изменения строки заголовка, (изменение диапазона))

ActiveSheet.Range("A1:R1").Select
With Selection
    .WrapText = True
End With
2 голосов
/ 03 мая 2011

UDF (процедуры, использующие ключевое слово Function) только возвращают значения. Они не могут изменять другие части объектной модели Excel, такие как форматирование ячеек. Это могут делать только подпрограммы (процедуры, использующие ключевое слово Sub).

Вам необходимо правильно отформатировать ячейки перед вводом UDF. Или вы можете использовать подпрограмму события изменения рабочего листа, чтобы отформатировать их после факта.

1 голос
/ 10 июня 2014

Я подозреваю, что вы пытаетесь обернуть текст в объединенные ячейки.Если да, вы не можете просто позвонить:

MyWorkSheet.Rows.WrapText = True

Вместо этого вам нужно смоделировать операции упаковки.Я нашел код от http://blog.contextures.com/archives/2012/06/07/autofit-merged-cell-row-height/ помог мне в прошлом году.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MergeWidth As Single
Dim cM As Range
Dim AutoFitRng As Range
Dim CWidth As Double
Dim NewRowHt As Double
Dim str01 As String
str01 = "OrderNote"

  If Not Intersect(Target, Range(str01)) Is Nothing Then
    Application.ScreenUpdating = False
    On Error Resume Next
    Set AutoFitRng = Range(Range(str01).MergeArea.Address)

    With AutoFitRng
      .MergeCells = False
      CWidth = .Cells(1).ColumnWidth
      MergeWidth = 0
      For Each cM In AutoFitRng
          cM.WrapText = True
          MergeWidth = cM.ColumnWidth + MergeWidth
      Next
      'small adjustment to temporary width
      MergeWidth = MergeWidth + AutoFitRng.Cells.Count * 0.66
      .Cells(1).ColumnWidth = MergeWidth
      .EntireRow.AutoFit
      NewRowHt = .RowHeight
      .Cells(1).ColumnWidth = CWidth
      .MergeCells = True
      .RowHeight = NewRowHt
    End With
    Application.ScreenUpdating = True
  End If

End Sub
1 голос
/ 10 июня 2014

Отключение / включение переноса слов для всей строки листа можно выполнить с помощью кода VB, показанного ниже: Если для первой строки задано значение true, то Excel наследует это свойство для всего листа, если вы специально не отключили его с помощью другого кода.

MyWorkSheet.Rows.WrapText = True

Чтобы отключить свойство переноса определенной строки:

MyWorkSheet.Rows(8).WrapText = False
0 голосов
/ 11 июля 2018

Возможно, это не совсем то, что имел в виду ОП, но я решил, что поделюсь своей функцией VBA Word Wrap , так как я не мог найти в Интернете ничего, что можно было бы сделать что я хотел.

Эта функция вставляет CR + LF в строку, чтобы обернуть ее, поэтому перенос слов сохраняется, если текст копируется в другое приложение, текстовое или иным образом.

Function wrapText(strIn As String, Optional maxLen As Long = 110) As String
    Dim p As Long: wrapText = strIn
    Do
        p = InStrRev(wrapText, " ", p + maxLen) - 1
        wrapText = Left(wrapText,p) & vbCrLf & Right(wrapText, Len(wrapText)-p-1)
        Debug.Print Mid(Replace(wrapText, vbCrLf, "||"), p - 20)
        'Stop
    Loop While p + maxLen < Len(wrapText)
End Function

По умолчанию максимальная ширина составляет 115 символов, но при желании его можно изменить на что угодно. Он разбивается только на пробелы (последний, который появляется в / перед позицией # 115) и вставляет только CR + LF (с константой vbCrLf ), но они могут быть адаптированы по мере необходимости.

В качестве примера приложения я строил сложные запросы SQL в Excel и хотел аккуратно и аккуратно скопировать SQL в серверное приложение вместо одной гигантской строки.

...