web-dev-qa-db-ja.com

VBA Excel-ワードラップ

特定の数式を使用してVBAコードの小さな断片を作成していますが、これには2つのifステートメントがあり、そのうちの1つは(vbNewLineを含む)2行の文字列を生成します。問題はテキストが見えません。

そのため、Wordでラップしたかったのですが、ActiveCell.WrapText = Trueを設定するたびに何も起こりません。

メッセージボックスで確認しました。 WrapTextをTrueに設定し、プロパティ値をMessageBoxで返して確認しましたが、それでもFalseです。

ActiveCell.Rows.AutoFitも使用するように言われましたが、AutoFitはテキストが折り返されていない場合は何もしません。

ここで私が間違っていると思われることはありますか?

11
Kuroh

試してください:

Sub WrapandFit()

    ActiveCell.WrapText = True
    ActiveCell.EntireRow.AutoFit

End Sub

それは私のために働いた。 screenupdatingもtrueに設定されていることを確認してください。

17
GrimR7529

私にとっては、以下のコードが機能しました。 (ヘッダー行を変更するためにのみ設定、(範囲を変更))

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

UDF(キーワードFunctionを使用するプロシージャ)は値のみを返します。セルの書式設定など、Excelオブジェクトモデルの他の部分を変更することはできません。これを実行できるのは、サブルーチン(キーワードSubを使用するプロシージャ)だけです。

UDFを入力する前に、セルを適切にフォーマットする必要があります。または、ワークシート変更イベントサブルーチンを使用して、事後にフォーマットすることもできます。

3
Dick Kusleika

VB以下に示すコードによって、シート全体のワードラップをオフ/オンにすることができます:最初の行がtrueに設定されている場合、特にオフにしない限り、Excelはシート全体のそのプロパティを継承します別のコードを使用します。

MyWorkSheet.Rows.WrapText = True

特定の行の折り返しプロパティをオフにするには:

MyWorkSheet.Rows(8).WrapText = False
1
rchacko

結合されたセルでテキストを折り返そうとしているのではないでしょうか。はいの場合、次のように呼び出すことはできません。

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
Hu Qiang

これは、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を1つの巨大な行ではなく、きちんとしたサーバーアプリケーションにコピーしたいと考えていました。

0
ashleedawg