
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
なぜか、私の#2のコードで、一部文字が落ちているようです。
全体を見なおしてみました。
'//
Sub CountLineInCell()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim w As Double, c As Variant
Dim tmpCell As Range
Dim msg As Variant
Dim ar As Variant
Dim cnt As Long, fntNam As String, fntSize As Double, iFnt As Integer
Set sh1 = ActiveSheet
With sh1.Range("A1").MergeArea 'Range("A1")は、ActiveCell でも可能
If .Cells(1, 1).Value = "" Then Set sh1 = Nothing: Exit Sub
fntNam = .Cells(1, 1).Font.Name
fntSize = .Cells(1, 1).Font.Size
For Each c In .Cells
w = w + c.ColumnWidth
'空白行のために必要ですが、今回は無視します。
'cnt = cnt + Len(c.Value) - Len(Replace(c.Value, vbLf, ""))
Next
ar = Split(.Cells(1, 1), vbLf)
Set sh2 = Worksheets.Add(After:=Worksheets(Sheets.Count))
End With
With sh2
If fntSize < 11 Then
iFnt = 3
ElseIf fntSize >= 11 Then
iFnt = 0
End If
.Cells(1, 1).ColumnWidth = Int(w * 10 + 2 + iFnt) / 10 '係数
Application.DisplayAlerts = False
For i = 0 To UBound(ar)
If i = 0 Then
With .Cells(1, 1)
.Resize(100).Font.Name = fntNam
.Resize(100).Font.Size = fntSize
.Value = ar(i)
.WrapText = True
.EntireRow.AutoFit
.Justify
End With
Else
With .Cells(Rows.Count, 1).End(xlUp).Offset(1)
If ar(i) <> "" Then
.Value = ar(i)
.WrapText = True
.EntireRow.AutoFit
.Justify
End If
End With
End If
Next
msg = .Cells(Rows.Count, 1).End(xlUp).Row
End With
sh2.Delete
Application.DisplayAlerts = True
sh1.Activate
MsgBox msg
Set sh1 = Nothing: Set tmpCell = Nothing: Set sh2 = Nothing
End Sub
ところで、こちらの#2の文字のズレについては気が付きませんでしたが、この方法の延長で間違いないと思っています。この件は、かなり昔に一度、同じような問題で手を付けています。その時は、結論が出ていませんでした。
これは、実際のテストを行って、実測に合わせて係数で解決するように考えています。つまり、うまく行かなかったら係数で個人が処理してもらうしかありません。
Excel側で何かの丸めが介在してしまうようです。しかし、セルの高さを標準セルの高さで割る方法は、いくらAutoFit しても、フォントの違いよって、予想の付かないマージンが入ることは、Excel2000時代から知っていましたので、そういう方法を取りませんでした。
フォントは、11 point,[MS Pゴシック]/[MSゴシック]8point から16point まで、までで、20行以内について検査しています。
No.3
- 回答日時:
#1です。
Wendy02様、日頃ご回答を参考にさせていただいておりますが、今回は勘違いされていると存じます。
AutoFitするのは、作業用の単独セルのみで、mergeしたセルは操作いたしません。
試しに試験用のコードを書いてみました。一旦丸ごとコピーする事で、書式設定をそのまま引き継ごうという魂胆です。手動で試してみましたが、行数が多くなると、実際とズレが大きくなってきて、「文字の割付」の方が実際の値に近い様ですが、そちらも改行位置は若干ずれます。折り返し行数を取得して、結合セルの高さを変更する際は、余裕をみて設定する必要がありそうです。なお、当方xl2000で試しています。
Sub test()
Debug.Print funcTest
End Sub
Function funcTest() As Long
Dim tmpSh As Worksheet
Dim myRange As Range, tempRange As Range
Dim mergeWidth As Double, mergeHeight As Double
Dim i As Long
Dim fittedHeight As Double, singleHeight As Double
Set tmpSh = Sheets(2)
tmpSh.cells.clear
Set myRange = ActiveCell
Set tempRange = tmpSh.Cells(1)
For i = 1 To myRange.MergeArea.Columns.Count
mergeWidth = mergeWidth + myRange.MergeArea.Columns(i).ColumnWidth
Next i
For i = 1 To myRange.MergeArea.Rows.Count
mergeHeight = mergeHeight + myRange.MergeArea.Rows(i).RowHeight
Next i
myRange.Copy tempRange
tempRange.MergeCells = False
With tempRange
.EntireColumn.ColumnWidth = mergeWidth
.EntireRow.AutoFit
fittedHeight = .EntireRow.RowHeight
.WrapText = False
.EntireRow.AutoFit
singleHeight = .EntireRow.RowHeight
End With
funcTest = Int(fittedHeight / singleHeight) + 1
End Function
No.2
- 回答日時:
#1の方の引用先の内容は、せっかくで申し訳ないけれども、解決はしていないと思います。
結合セルにAutoFit を使えば、折り返しが崩れてしまいます。Justifyを用いればよいのではないかと思います。
手動で説明すると、
例えば、A1 にあるとしたら、どこかの新しいシートのひとつの結合していないセルの幅を、元のA1セルの幅に合わせ、文字列のみをコピーして、編集--フィル--文字の割り付け
で行を数えればよいということです。
あまり実用的ではないと思いますが、それをマクロにすると以下のようになるように思いました。ただ、基本的には、結合セルは、VBAでは、ネックになります。挙動がまったく変わってしまうことがあるからです。
'//
Sub CountLineInCell()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim w As Double, c As Variant
Dim tmpCell As Range
Dim msg As Variant
Set sh1 = ActiveSheet
With sh1.Range("A1").MergeArea 'Range("A1")は、ActiveCell でも可能
If .Cells(1, 1).Value = "" Then Set sh1 = Nothing: Exit Sub
For Each c In .Cells
w = w + .ColumnWidth
Next
Set sh2 = Worksheets.Add(After:=Worksheets(Sheets.Count))
sh2.Cells(1, 1).Value = .Value
End With
Application.DisplayAlerts = False
With sh2.Cells(1, 1)
.ColumnWidth = w
.WrapText = True
.EntireRow.AutoFit
.Justify
msg = .Cells(Rows.Count, 1).End(xlUp).Row
End With
sh2.Delete
Application.DisplayAlerts = True
sh1.Activate
MsgBox msg
Set sh1 = Nothing: Set tmpCell = Nothing: Set sh2 = Nothing
End Sub
No.1
- 回答日時:
の#2がご参考になると存じます。
フォント等の環境を合致させた作業用の単独セルに文字列をコピーし、AutoFitを実行して、結果の行の高さを求める方法です。
なるほど、発想がすばらしですね。折り返し回数にだけにこだわってましたが、確かにそういう手段が考えられますね。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) エクセル セル内の文字数を超えたら自動的に折り返して表示 2 2023/07/24 05:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/01/06 08:39
- Excel(エクセル) エクセルで、特定のセルの内容を更新すると、別の特定セルに 更新日付が自動的に表示させる方法はあります 1 2022/11/14 21:03
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) Activesheet.Pasteで困っています 1 2023/01/22 07:41
- Excel(エクセル) エクセル VBA セルの結合 2 2022/09/07 11:48
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA インデックスの境...
-
Excelマクロで空白セルを詰めて...
-
Excel で行を指定回数だけコピ...
-
エクセル2007で、マクロで、結...
-
VBA:同じ文字列データの比...
-
エクセル:VBAで月変わりで、自...
-
Excelでデータの抽出&別シート...
-
セルの一部を任意の条件で貼り...
-
エクセルVBA 別シートの複数の...
-
Excel・VBAで同じものだけを表...
-
Excel VBAでシート内全体に非表...
-
VBA 最終行取得からの繰り返し貼付
-
エクセルVBAで 2種のリストを...
-
vbaでコントロールブレイク
-
機種変更時にデータは見られる?
-
スマホ機種変更で旧機種のGoogl...
-
携帯修理出して戻ってきたら、L...
-
故障?ウィルス?
-
中古携帯電話について
-
ソフトバンクアクオス携帯で動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel で行を指定回数だけコピ...
-
Excel VBA インデックスの境...
-
VBA:同じ文字列データの比...
-
エクセル:VBAで月変わりで、自...
-
Excelマクロで空白セルを詰めて...
-
excelの差込印刷で可視セルだけ...
-
VBA別シートの最終行の下行へ貼...
-
エクセルVBAで 2種のリストを...
-
VBAで条件が一致する行のデータ...
-
Excelマクロ データが上書きさ...
-
WorkbooksとWorksheetsを簡単に...
-
VBA 貼付先範囲(行)がいっぱ...
-
ExcelVBAで改ページを追加したい
-
【WORD差し込み印刷】複数レコ...
-
エクセルVBAで SendKeys "{TAB}"
-
Excel VBAでシート内全体に非表...
-
Excel VBA :2回目以降実行で貼...
-
Excel VBA 複数条件にマッチし...
-
エクセル2007で、マクロで、結...
-
Excel VBA元データから別シー...
おすすめ情報