- ベストアンサー
文章の整形について
VBA justifyメソッドの関連質問です。 参考質問として以下がありますが、 http://oshiete1.goo.ne.jp/qa2267501.html 適当な列幅の一つのセルにある長い文章を、 連続する下方の複数のセルに適切に分割したいのですが、 Application.DisplayAlerts = False Selection.Justify Application.DisplayAlerts = True 残念ながらこの処理では、 分割前のセルにある[Alt]&[Enter]による改行が無視されます。 これをなんとか解決して、 改行を生かしながら複数セルに分割整形したいのです。 お知恵を拝借できれば幸いです。 ぜひ、よろしくお願いいたします。 (XP/Excel2003)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#01です。 選択セルの文字列をChr$(10)を生かしてJustifyするマクロを作ってみました。お試し下さい Sub Macro1() Dim str() As String Dim idx, col As Integer If TypeName(Selection) = "Range" Then col = Selection.Column str = Split(Selection.Value, Chr(10)) On Error GoTo end0 Application.DisplayAlerts = False For idx = 0 To UBound(str) Selection.Value = str(idx) Selection.Justify Cells(65536, col).End(xlUp).Offset(1, 0).Select Next idx End If end0: Application.DisplayAlerts = True End Sub
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
質問の意味を捉えてないかもしれないが 例データ B列 内容は文例 (内容でたらめの文章ですみません。P付きFontは使わないとして) 多さにかけては他店に負けません。こんばんわ月夜ですね aaaaaaaaaaaaa 近くの近藤さん早く早く今すぐ早く事務所に帰ってください。 木村さんの名前は何でしたかね。xxでしたか。早く書いてください。もう終ります。 (一部半角文字混じらせている) ーーーー コード Sub test01() Cells(1, "E").ColumnWidth = 26 '半角文字数分で幅設定 d = Range("B65536").End(xlUp).Row k = 1 For i = 1 To d s = Cells(i, "B") s = StrConv(s, vbWide) st = 1 '-- While Len(s) - st + 1 > 13 Cells(k, "E") = Mid(s, st, 13) k = k + 1 st = st + 13 Wend Cells(k, "E") = Mid(s, st, Len(s) - st + 1) k = k + 1 Next i End Sub 結果 全角する 13文字で次セルに折り返す(実体は13字ずつ切り刻んでセット) で E列 多さにかけては他店に負けま せん。こんばんわ月夜ですね aaaaaaaaaaaaa 近くの近藤さん早く早く今す ぐ早く事務所に帰ってくださ い。 木村さんの名前は何でしたか ね。xxでしたか。早く書い てください。もう終ります。
お礼
一般人さんありがとうございました。 この場合は、フォントの種類やサイズが固定されます。 使うにはちょっと難しいかと考えます。 表示領域が4行しかありませんので、 長文の場合はフォントサイズを小さくしたり、 プロポーショナルにしたり、自由に取り扱えるよう 仕上げたいと考えています。 いずれにして大変ありがとうございました。
補足
言葉足らずでご迷惑をおかけしてます。 長い文章を入力するとき、複数セル(実は印刷用なんですが)に直接 行うと、文章訂正などが発生した場合、どうしても、セルを跨いで 詰めたり送ったりしなければなりません。 だから、一つの同一列幅のセルに入力するのが、 訂正などを考えると比較的楽ではないかと考えました。 Justify が使えるといいのですが、 [Alt]&[Enter]が入ると期待した分割ができません。 で、悩んでいます。
- zap35
- ベストアンサー率44% (1383/3079)
Justifyメソッドを実行しても「セル内改行」はそのまま残りますよ 上書きされたセルの書式を「折り返して全体を表示する」にしたら、ちゃんとセル内改行されませんか?
補足
説明不足でした。申し訳ありません。 分割前のテキスト内の改行コード(LF)は 分割後も残りますが、 次セルへの分割契機にはなっていません。 次セルへの分割契機は、 あくまでセル幅の文字数になります。 つまり、改行コード(LF)は無視されます。 改行コードがあれば無条件に次セルに移動してほしいのです。 (A1)バレー部キャプテンとして、(LF) 市大会準優勝。(LF) リーダーとしての統率力、責任感があるため、(LF) 同級生や下級生から慕われている。 これを Justify すると (A1)バレー部キャプテンとして、(LF) 市大会準優勝。(LF) リー (A2)ダーとしての統率力、責任感があるため、(LF) 同級生 (A3)や下級生から慕われている。 となります。 期待する結果は、 (A1)バレー部キャプテンとして、 (A2)市大会準優勝。 (A3)リーダーとしての統率力、責任感があるため、 (A4)同級生や下級生から慕われている。 となって欲しいのです。 InStrでちまちまやるしかないでしょうか?
お礼
zap35さん、爽やかなコードありがとうございます。 InStrを使って、Chr(10)の前後を分割し、 前をJustify、後ろをさらに分割し同処理を繰り返す。 Chr(10)が存在しなかった時点で終了というアルゴリズムを 書いたのですが、 Splitで配列に格納した方が早かったですね。 空セル探しは下からの上方サーチじゃなく、 上から順に行くのが現実的かと思いますので、 参考にさせていただきながら、 作り込みたいと思います。 大変ありがとうございました。 勉強になりました。