- ベストアンサー
エクセルの文章を分割して表示する
行き詰ってしまたため、質問させていただきます。よろしくお願いします。 エクセルにある文章をセル内の文字数を制限して、それを超える場合は順次下のセルへ表示させたいのです。 文字の割り付けでセルの幅を調節すればできないことはないのですが、大量の文章となると1つ1つセルを挿入しながらの作業になり大変な労力なので違う方法があると助かります。 例)B列にある文章をA列の文字数を20文字までとして順次表示させたい。 B列 1行目 本日はお忙しい中お集まり頂きましてありがとうございます。 2行目 今回は○○議題について検討していきます。 3行目 (空欄) 4行目 報告からお願いします。 5行目 ××支店では、前月比・前年比ともに大きく上回り、純益は○○○○○円で前月より30%増となりました。 これを↓のように A列 1行目 本日はお忙しい中お集まり頂きましてありが 2行目 とうございます。 3行目 今回は○○議題について検討していきます。 4行目 (改行) 5行目 報告からお願いします。 6行目 ××支店では、前月比・前年比ともに大きく 7行目 上回り、純益は○○○○○円で前月より30 8行目 %増となりました。 のように表示させたいのですが、どのような方法が適当でしょうか? いろいろとやってみて、マクロしかないのかな?と思っていますが、出来れば関数で、関数では難しいようでしたらマクロでの方法を教えていただければと思います。 どうぞ、よろしくお願いいたします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
普通なら、テキストエディタ(ワードでも可)で1行を20文字にセットしておいて、入力するのが一番妥当だと思うけど、何か理由があるのでしょうね。 <とりあえずのサンプルマクロ> Sub test() Dim tmp As String Dim r As Long, rw As Long rw = 1 For r = 1 To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row tmp = Cells(r, 2).Text Do While Len(tmp) > 20 Cells(rw, 1).Value = Left(tmp, 20) tmp = Right(tmp, Len(tmp) - 20) rw = rw + 1 Loop Cells(rw, 1).Value = tmp rw = rw + 1 Next r End Sub 単純に文字数で判別しているだけで、行末処理(禁則処理など)は面倒なのでやっていない。 「。」や「、」が行頭にくる可能性あり。 アクティブシートに対して処理を行います。
その他の回答 (8)
- koko88okok
- ベストアンサー率58% (3839/6543)
ANo.8です。 > このように上と下がくっついてしまい、質問のA列のようにならないのです。 > また、セルを1つ1つやっていくと、400行もありますと膨大な時間が必要となり、これも現実的ではないかな?と思っております。 確かに、「文字の割付」ではすべてのセルを選択して実行すると、そのようになります。 「ツール」→「ユーザー設定」→「コマンド」タブの「分類」から「編集」を選択し、「コマンド」の「文字の割付」コマンドをツールバーにD&Dして登録しておけば、目視で数行ごとに選択して、「文字の割付」コマンドをクリックするだけで自動的にセルに割付されますので、400行程度なら比較的短時間で完了すると思います。
- koko88okok
- ベストアンサー率58% (3839/6543)
Excelの「文字の割付」機能を使うとご希望のように文字列が列幅に合わせて分配されます。 1) 文字数を一定にするために、等幅フォントに変更し、表示したい文字数になるよう列幅を調整します。 2) 入力されているセル範囲を選択し、「編集」→「フィル」→「文字の割付」をクリックします。 3) 「選択範囲の下のセルに・・・」のメッセージに「OK」を押します。 「文字の割付」 http://akubizzz.hp.infoseek.co.jp/sub124.html
お礼
回答いただきありがとうございます。 文字の割付は試してみたのですが複数のセルを選択して実行すると、 1行目 本日はお忙しい中お集まり頂きましてありが 2行目 とうございます。今回は○○議題について検 3行目 討していきます。 4行目 5行目 報告からお願いします。××支店では、前月 6行目 比・前年比ともに大きく上回り、純益は○○ 7行目 ○○○円で前月より30%増となりました。 このように上と下がくっついてしまい、質問のA列のようにならないのです。 また、セルを1つ1つやっていくと、400行もありますと膨大な時間が必要となり、これも現実的ではないかな?と思っております。 使用しているのがExcel2003なのですが、それよりも上位バージョンでは複数セルを選択しても出来るものなのでしょうか。
- mt2008
- ベストアンサー率52% (885/1701)
No.6です。 MID関数、無駄なことやっていましたね。 No.5の方のマクロを参考にシンプルにして見ました。 Sub Sample() K = 1 For i = 1 To Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row If Len(Cells(i, 2).Value) > 0 Then For j = 0 To Int((Len(Cells(i, 2).Value) - 1) / 20) Cells(K, 1).Value = Mid(Cells(i, 2).Value, j * 20 + 1, 20) K = K + 1 Next j Else K = K + 1 End If Next i End Sub
お礼
回答いただきありがとうございます。 いろいろと勉強になります、ありがとうございます。 活用させていただきます。
- mt2008
- ベストアンサー率52% (885/1701)
No.2です。 せっかくなのでマクロ作って見ました。 B列の文字数が20文字ちょうどでも変な改行は入りません。 20文字で分割した時に最後の文字列が20文字以下の場合の処理を手抜きする為、お尻に空白を20文字分くっつけてA列に入れる時にTRIMをかけて空白を取っています。 そのため、20文字で分割した時、頭が空白の場合、A列にはその空白抜きで入ります。 Sub Sample() Dim nARow, nBRow, nMoji, nLast, nBloop As Long Dim sOne As String nARow = 1 'A列の行 nMoji = 20 'A列一行の文字数 nLast = Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row 'B列の最終行 For nBRow = 1 To Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row 'B列を1行目から最終行まで処理 sOne = Cells(nBRow, 2).Value 'B列の1行分の文字列 If Len(sOne) = 0 Then nARow = nARow + 1 '文字列無しの場合はA列を1行進めてお終い Else nBloop = Int((Len(sOne) - 1) / nMoji) '何分割するか sOne = sOne & String(nMoji, " ") '後ろに空白をくっつける For nLoop = 0 To nBloop '20文字取り出して余分な空白削除したものをA列に Cells(nARow, 1).Value = Trim(Mid(sOne, 1 + nLoop * nMoji, nMoji)) nARow = nARow + 1 'A列を一行進める Next nLoop End If Next nBRow End Sub
- hallo-2007
- ベストアンサー率41% (888/2115)
マクロご存知であれば、以下参考にしてください。 Sub Macro1() K = 1 For i = 1 To Range("B65536").End(xlUp).Row For j = 0 To Int(Len(Cells(i, 2).Value) / 20) Cells(K, 1).Value = Mid(Cells(i, 2).Value, j * 20 + 1, 20) K = K + 1 Next j Next i End Sub
お礼
回答いただきありがとうございます。 マクロ使用させていただきました。思ったとおりにできました。ありがとうございます。
- BrueBreeze
- ベストアンサー率52% (83/159)
文面から察すると、株主総会等の会議のコンテのようですね。 おそらく、テンプレかなんかになっていて今回だけではなく今後も使用されるのではと推測しています。 どのような理由でExcelを使用されているのかはわかりませんが、こういった場合には苦労してExcelを使うのではなく、Wordを使用されたほうが良いのではないかと思います。 他に同時に印刷したい表などがあるかもしれませんが、その場合でもExcelで作成した表をWordに張り付ける等したほうがやりやすい場面もあります。 ExcelにはExcel、WordにはWordの得意分野がありますので、良いとこ取りをしたほうが結局は楽になると思います。 どうしてもExcelでなければいけないのであれば、 1.A1:A8を結合し、セルの書式設定で「折り返して全体を表示する」にし、列幅は20文字表示されるように、行の高さやフォント等は適宜調整してください。 その後、B1~B5の内容をコピーします。(コピーの仕方には少し工夫が必要になります) とするか、 2、テキストボックスを使用する という方法が良いのではないでしょうか 2.
お礼
回答いただきありがとうございます。 自分もエクセルではなく、ワードで作れたらいいのですが… 今エクセルで作成しているのと近いのでワードのテンプレートの「会議議事録3」というのがあるのですが、これを使う場合は文章を打ち込む時にある文字数(今回の質問ですと20文字)になったら自動的に次のセル(表)へ移動してくれればいいのですが、何か方法があるのでしょうか?ただやみくもに打ち込むだけではそのセル内で2行や3行になってしまって、罫線の意味をなさなくなってしまうのです。 ですので、今回はエクセルでの方法をおたずねしました。 ワードでの方法などあれば教えていただけるとありがたく思います。
- mt2008
- ベストアンサー率52% (885/1701)
見た目上改行されていれば良いのなら、列全体を選択し、セルの書式-配置で「折り返して全体を表示する」にする。 あとは幅を調整。文字数も合わせる場合は、フォントを等幅フォントに。
お礼
回答いただきありがとうございます。 会社で用意されたエクセルのテンプレートがありまして、その中に表示させたいので折り返して表示ですとテンプレがずれてしまうため使えないのです。 質問にテンプレートの事を書き忘れてましたね。失礼しました。
- n-jun
- ベストアンサー率33% (959/2873)
B列を一度テキストファイルにコピペして、テキストファイルで編集作業を行ない、 その結果をA列に貼り付ける。 と言うのは無理なのでしょうか? (B列以外にデータがあり、改行による行挿入が必要なら無理かも知れませんが。)
お礼
回答いただきありがとうございます。 B列は例のは短いですが、実際は400行くらいあり、文字数も合計で1万文字以上あるため、テキストファイルでの編集となると20文字づつ数えていかなければならないため、途方もなく時間がかかってしまいます。
お礼
回答いただきありがとうございます。 おっしゃるように、ワード等で出来れば一番いいのですが、テンプレートがありまして、それにはめ込む感じになるものですから… マクロありがとうございます。思ったとおりになりました。