VBA Excel - 自动换行

问题描述 投票:8回答:6

我正在创建一小段具有特定公式的VBA代码,但它有几个if语句,其中一个语句来自双线字符串(使用vbNewLine)问题是我看不到文本。

所以我想把它包装好,但每次我设置ActiveCell.WrapText = True时都没有任何反应。

我查了一个消息框。我将WrapText设置为True,我使用MessageBox返回属性值进行确认,并且它仍然是False。

我被告知也使用ActiveCell.Rows.AutoFit,但如果文本没有被包裹,AutoFit什么都不做。

知道我在这里做错了什么吗?

excel vba word-wrap
6个回答
16
投票

尝试:

Sub WrapandFit()

    ActiveCell.WrapText = True
    ActiveCell.EntireRow.AutoFit

End Sub

它对我有用。确保您的screenupdating也设置为true。


4
投票

对我来说,下面的代码工作。 (仅设置为更改标题行,(更改范围))

ActiveSheet.Range("A1:R1").Select
With Selection
    .WrapText = True
End With

2
投票

UDF(使用关键字Function的过程)仅返回值。它们无法更改Excel对象模型的其他部分,例如单元格格式。只有子程序(使用关键字Sub的程序)可以做到这一点。

在进入UDF之前,需要正确格式化单元格。或者您可以使用工作表更改事件子在事后进行格式化。


1
投票

关闭/打开整个表格行的自动换行可以通过下面显示的VB代码完成:如果第一行设置为true,excel将继承该整个工作表的属性,除非您使用其他代码专门关闭它。

MyWorkSheet.Rows.WrapText = True

要关闭特定行的包装属性:

MyWorkSheet.Rows(8).WrapText = False

1
投票

我怀疑你试图在合并的单元格中包装文本。如果是,您不能简单地致电:

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
投票

这可能不是OP的想法,但我想我会分享我的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),但它们可以根据需要进行调整。

作为应用程序的一个例子,我在Excel中构建复杂的SQL查询,并希望将SQL复制到服务器应用程序整洁而不是一条巨线。

© www.soinside.com 2019 - 2024. All rights reserved.