0

問題: VBA を使用して、MS Excel 2000 セルにテキストを入力しています。列の幅は固定されており (レイアウトのために変更しないでください)、wordwrap プロパティが true に設定されているため、テキストは列よりも幅が広い場合に複数行にわたって折り返されます。残念ながら、行の高さは必ずしもそれに応じて更新されるとは限りません。高さを「手動で」調整できるように、テキストが複数の行にまたがるかどうかを予測する方法が必要です。

私はこのようなことをしたい:

range("A1").value = longText  
range("A1").EntireRow.RowHeight = 14 * GetNrOfLines(range("A1"))  

関数 GetNrOfLines はどのように記述すればよいですか?

フォントはモノスペースではないため、文字数に頼ることはできません。書き込み先のセルが他のセルと結合されているため、自動調整が機能しないことがあります。私は Excel 2000 で作業していることを思い出してください。

4

4 に答える 4

0

Range.Rows.AutoFitこの方法を使用するのはどうですか?

于 2009-11-12T03:59:11.267 に答える
0

ワークシートに図形を挿入し、テキストを追加し、図形の高さを取得してから図形を削除することで、これを解決しました。

Office 2007+ の場合は次のようになります。

Set tShape = Sheet1.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, someWidth, 0)
tShape.TextFrame.AutoSize = True
tShape.TextFrame2.AutoSize = msoAutoSizeShapeToFitText
tShape.TextFrame.Characters.Text = myLongTextString

rowHeight = tShape.TextFrame2.TextRange.BoundHeight
tShape.Delete

office 2003 の場合、次のように動作するようです。

Set tShape = Sheet1.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, someWidth, 0)
tShape.TextFrame.AutoSize = True
tShape.TextFrame.Characters.Text = myLongTextString

rowHeight = tShape.Height
tShape.Delete
于 2013-03-12T19:25:54.087 に答える
0

残念ながら、良い解決策は見つかりませんでした。この問題は Excel 2000 のバグが原因です。それ以降のバージョンにも当てはまるかどうかはわかりません。

この問題は、セルを水平方向にマージするときに現れます。セルを結合すると、行の高さが自動調整されません。

次のコード例は、問題を示しています

Dim r As Range
Set r = Sheet1.Range("B2")
Range(r, r(1, 2)).Merge
r.Value = ""
r.Value = "asdg lakj dsgl dfgjdfgj dgj dfgj dfgjdgjdfgjdfgjd"
r.WrapText = True
r.EntireRow.AutoFit

この場合、r.EntireRow.AutoFit は、テキストが複数の行にまたがることを考慮せず、1 行のテキストであるかのように高さを調整します。
セルとワードラップが結合された行に手動で自動調整 (シートの行高さ調整をダブルクリック) を行うと、同じ問題が発生します。

解決策 (Gary McGill が提案) は、無関係なシートを使用することです。結合されたセル全体に一致するように列幅を設定します。同じ書式でテキストをコピーします。セルを自動調整して、そのセルの値を使用します。

簡単な例を次に示します。

Public Sub test()

    Dim widthInPoints As Double
    Dim mergedCells As Range
    Set mergedCells = Sheet1.Range("B2:C2")
    widthInPoints = mergedCells.width

    Dim testCell As Range
    Set testCell = Sheet2.Range("A1")
    testCell.EntireColumn.columnWidth = ConvertPointsToColumnWidth(widthInPoints, Sheet2.Range("A1"))
    testCell.WrapText = True
    testCell.Value = mergedCells.Value
    'Text formating should be applied as well, if any'

    testCell.EntireRow.AutoFit

    mergedCells.EntireRow.rowHeight = testCell.rowHeight
End Sub

Private Function ConvertPointsToColumnWidth(widthInPoints As Double, standardCell As Range) As Variant

    ConvertPointsToColumnWidth = (widthInPoints / standardCell.width) * standardCell.columnWidth

End Function
于 2009-11-21T14:53:08.083 に答える
0

あなたは、セルが時々結合されるため、AutoFit が機能しないと言います (セルが上または下にあると思います)。

ただし、一時的なワークシートを作成し、そこにセルの内容と書式設定 (列幅、フォント、サイズなど) をコピーしてから、AutoFit を使用して理想的な行の高さを取得できますか? その後、一時ワークシートを再度削除します。(一度に多数のセルを実行している場合は、毎回再作成せずにすべての一時ワークシートを使用できることは明らかです)。

于 2009-11-12T09:22:26.327 に答える