Excelマクロ・行の高さを自動調整する方法

このQ&Aのポイント
  • Excelの人材情報リストから特定の行の高さを自動調整する方法についてご質問です。
  • VLOOKUP関数を使用しているため行の自動調整ができない問題があります。
  • VBAを使用してマクロを作成することで高さの調整が可能です。
回答を見る
  • ベストアンサー

Excelマクロ・行の高さを自動調整したい

データベースから抽出したExcelの人材情報リストから、VLOOKUP関数で情報を射影して、指定した人材を数人分連続で印刷するマクロを設定して、定型のプロフィールシートを作成しました。  改良したい点として、人によって情報量が異なる項目があるので、特定の行(例えば5行目)の高さのみを自動調整するようにしたいのですが、どのようにすればよいでしょうか。  VLOOKUP関数を使用しているからか、書式から行の自動調整を設定してみても1行の高さになってしまいます。  マクロで一度に印刷できるようにしたので、一枚一枚レイアウトを修正しなくてもいいようにしたいです。  VBA初心者ですので、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#1,2,4です。#4補足コメント拝見しました。 > なんだかとても難しそうですね…。 中の上ぐらい?と思います。 > 記述頂いたものをコピペして要指定◆の三か所を、 > (1)Const S = "プロフィールシート" > (2)Set rWork = Columns("V").Resize(.Rows(.Rows.Count).Row) > (3)For Each c In Range("J13:T13") ' ※試しに結合しているセル範囲J13:T13を入力してみました※ > と変えて実行してみました... ご苦労様です。ご確認ありがとうございます。 > ...が、「エラー:1004アプリケーション定義またはオブジェクト定義のエラーです」というメッセージが出ました。 エラーの原因は既に特定され、対策も済みました。 原因は、指定した範囲には、[結合セル]の左上に当たる先頭セルがひとつもなかった為、 本題の処理以外の所でカウンタの数値が不適切になっていたことです。 こちらの想定漏れです。 > ちなみに、行の高さを自動調整したい結合セルは、F9:T9、F13:T13、F21:T21、F22:T22、F23:T23の5か所です。 一気に前が開けて見えて来ました。   Range("F9:T9,F13:T13,F21:T21,F22:T22,F23:T23") のような書き方で、一括りに、そしてピンポイントに、セル範囲を指定することが 出来ました。  ●シートイメージが掴めたので、必要以上の処理が不要になったこと、  ●ご指摘のエラーへの対処  ●一部設計について、より簡単で堅実な方法を見つけたので改良(基本設計は同じ) 以上の理由から、#4のマクロを書き換えましたので、丸々差し替えて 動作を試してください。 動作確認が済んだ所で、ご提示のマクロについて。 こちらでは動作の確認はしていませんが、 今回課題の[結合セル]の行高[自動調整]処理をするタイミングは、   Sheets("プロフィールシート").Range("A1").Value = 番号   ' ■ココ!!■   Sheets("プロフィールシート").PrintOut の間(PrintOutする直前)の行になります。 以下のマクロの名前を適当なものに変えて、 ご提示のマクロから、こちらの(課題の)マクロを呼び出すようにして下さい。 気になるとすれば、改ページが行高の変化の影響を受けないか、 ということぐらいで、今の処、問題なさそうと見込んでいます。 マクロの開発はエラーを重ねて進めることも多いので、 こちらが想定出来ていないことがあれば、またエラーが発生するかもしれません。 もし次にエラーに遭遇したら、   On Error GoTo ErrH_ ' エラートラップ の先頭に一時的に ' を付けて(コメントブロックして) 再度実行してみて下さい。 その際、エラーメッセージへの応答で[デバッグ]を選択し、 マクロの記述のどの部分(エラー行が黄色になる)で どんなエラーが発生しているかを確認してみてください。 楽観的にみてはいるのですが、何かあれば、遠慮なく、、、。 ' ' ====================================== Sub Re8919629_r() Const S_SHT_NAME = "プロフィールシート" ' 要指定◆シート名は正確に◆ Dim rWork As Range ' 作業セル範囲 Dim rArea As Range ' ループ用 各[結合セル]範囲全体 Dim sngColWid1st As Single ' 処理実行前の作業セル の列幅 Dim sngColWid As Single ' 各[結合セル]範囲 の実効幅 Dim cnCol As Long ' 処理件数 カウンタ   If ActiveSheet.Name <> S_SHT_NAME Then Sheets(S_SHT_NAME).Select ' 処理対象シート を選択状態に   With ActiveSheet.UsedRange ' 処理対象シートの内 使用中の範囲 を捉える     ' ' 要指定◆一時的な作業列としてそれより右すべてが使用可能な列を指定(例ではV列)◆     ' ' ◆但し、作業列は必ず印刷範囲の外であること◆     ' ' 作業セル範囲を 必要な行数 変数に格納     Set rWork = Columns("V").Resize(.Rows(.Rows.Count).Row) '   End With   sngColWid1st = rWork.ColumnWidth ' 処理実行前の作業セルの列幅 を確保   Application.ScreenUpdating = False ' 処理が遅くならないように 描画 停止   On Error GoTo ErrH_ ' エラートラップ   With Range("F9:T9,F13:T13,F21:T21,F22:T22,F23:T23") ' 要指定◆処理対象[結合セル]範囲 をRange型で指定◆     .WrapText = True ' [折り返して全体を表示する]設定 の徹底     cnCol = 0 ' カウンタ 初期化     For Each rArea In .Areas ' 処理対象セル範囲の各[結合セル]範囲 を総当たりでループ       cnCol = cnCol + 1 ' 処理する数をカウント       sngColWid = (rArea.Width * 4 / 3 - 5) / 8 ' 各[結合セル]範囲の実効幅 を計算で求める       rArea.UnMerge ' 各[結合セル]範囲の[セルの結合] を一時解除       With rWork.Cells(rArea.Row, cnCol) ' 各[結合セル]範囲と同じ行 未使用の作業列にあるセルを作業セルとして         rArea(1).Copy Destination:=.Cells ' 各[結合セル]範囲の先頭セル をコピーして作業セルに貼付け         .Value = rArea(1).Value ' 各[結合セル]範囲の値 を作業セルの値としてトレース         .ColumnWidth = sngColWid ' 作業セルの実効幅 を各[結合セル]範囲の実効幅 に合わせる       End With       rArea.Merge ' 各[結合セル]範囲の[セルの結合] を再設定       rArea.EntireRow.AutoFit ' 各[結合セル]範囲行高 を[自動調整]       rArea.RowHeight = rArea.RowHeight ' 作業セルを基準に[自動調整]された行高 を各[結合セル]範囲で確定する     Next   End With   If cnCol > 0 Then     With rWork.Resize(, cnCol)       .Clear ' 作業セル をクリア       .ColumnWidth = sngColWid1st ' 列幅 を元に戻す。     End With     ActiveSheet.UsedRange ' 印刷範囲を変えない為にUsedRange を元に戻す。   End If ErrH_:   If Err Then MsgBox "エラー:" & Err.Number & vbLf & Err.Description ' エラー時 のメッセージ   Application.ScreenUpdating = True ' 描画 再開 End Sub ' ' ======================================

sakimi12
質問者

お礼

ご丁寧なご回答、本当にありがとうございます。 ご教授いただいたマクロで無事に行の高さが自動調節されました!感動です。 教えていただいたマクロの内容について、自分でしっかりと理解できるようにもっと勉強したいと思います。 非常に助かりました。心より御礼申し上げます。

その他の回答 (4)

回答No.4

#1-2です。#1補足コメント拝見しました。 > うまくいきませんでした。 行高の[自動調整]が出来なかった、ということで宜しいですか? 補足の内容をみて原因となり得る特異点は、ただ一つ、 [結合セル]の行高を[自動調整]しようとしていることです。 Excel本来の仕様として[結合セル]に対しては [自動調整]は機能しません。 なので、Excelの機能に期待せず、自力実装することになります。 簡単ではないですね。 行の高さを計算で求めるのは、パラメータが多過ぎて困難ですから、 作業列を使って、 作業セル(単セル)の実効幅を結合セルの実行幅(計算で求める)に合わせ、 フォントの各設定を合わせ、値をトレースし、 [折り返して全体を表示する]行高[自動調整]を 作業セルでシミュレートした高さを該当行の高さとして確定します。 何が難しいって、[結合セル]が難しいので、 下に書いたマクロは専ら[結合セル]に対して行の高さをすべて Excelの[自動調整]仕様に合わせる、というものです。 [結合セル]以外に対しては全く処理しません(#1-2を参考にして下さい)。 もし、高さを変えたくない[結合セル]があれば、 処理対象セル範囲の指定方法を工夫して除外するようにしてください。 本当は、、、 行高の[自動調整]をしたい[結合セル]が、 何処と何処、、、にあるとかの情報があれば、 もうちょっぴり簡単に書けたかも知れません。 ここに挙げるマクロをお使いのマクロのどのタイミングで実行するか、 ですが、 Sheet1の印刷に関する設定変更等を、ループ中に、 シート毎に処理している場合は、その直前。 '人材番号をA1セルに入力し'た後、 その他、セルやシートの各種設定を、 ループ中に、シート毎に処理している場合は、その後、になります。 以下、こちらの環境では問題なく動いてますが、 もし、何か不足があれば、具体的に書いてくだみてくださいね。 ◆でマークしている3か所は、それぞれ引数をそちらで適宜指定(または確認)してください。 ' ' ====================================== Sub Re8919629() Const S = "Sheet1" ' 要指定◆シート名は正確に◆ Dim rWork As Range ' 作業セル範囲 Dim c As Range ' ループ用の[各セル] Dim cnCol As Long ' 処理件数   If ActiveSheet.Name <> S Then Sheets(S).Select ' 処理対象シートを確実に選択しておく   With ActiveSheet.UsedRange ' 処理対象シートの内、使用中の範囲を捉える     ' ' 要指定◆一時的な作業列としてそれより右すべてが使用可能な列を指定(例ではJ列)◆     ' ' ◆但し、作業列は必ず印刷範囲の外であること◆     ' ' 作業セルを必要な行数に限定した範囲として変数に格納     Set rWork = Columns("J").Resize(.Rows(.Rows.Count).Row)   End With   Application.ScreenUpdating = False ' 処理が遅くならないように描画停止   On Error GoTo ErrH_ ' エラートラップ   ' ' 処理対象セル範囲の[各セル]を総当たりでループ   cnCol = 0 ' 初期化   For Each c In Range("E1:E50") ' 要指定◆処理対象セル範囲をRange型で指定◆余裕をもって大きめに指定してもOK     If c.MergeCells Then ' [各セル]が結合だったら       If c.Address = c.MergeArea(1).Address Then ' [各セル]が結合セル範囲の左上だったら         If Not c.WrapText Then c.WrapText = True ' [各セル][折り返して全体を表示する]設定の徹底         cnCol = cnCol + 1 ' 処理する数をカウント         With rWork.Cells(c.Row, cnCol) ' [各セル]と同じ行 未使用の作業列にあるセルを作業セルとして           .ColumnWidth = (c.MergeArea.Width * 4 / 3 - 5) / 8 ' 作業セルの有効幅を[各セル]に合わせる           .Font.Name = c.Font.Name ' 作業セルのフォント設定各種を[各セル]に合わせる           .Font.Size = c.Font.Size           .Font.Bold = c.Font.Bold           .Value = c.Value ' 作業セルの値を[各セル]の値を定数化したものに設定           .WrapText = True ' 作業セルを[折り返して全体を表示する]設定           .EntireRow.AutoFit ' 作業セルの行高を[自動調整]         End With         c.RowHeight = c.RowHeight ' 作業セルが規定する行高を確定する       End If     End If   Next   rWork.Resize(, cnCol).Clear ' 作業セルをクリア '  rWork.Resize(, cnCol).Delete Shift:=xlShiftToLeft ' 作業セルを削除   ActiveSheet.UsedRange ' 印刷範囲を変えないようにUsedRange を元に戻す。 ErrH_:   If Err Then MsgBox "エラー:" & Err.Number & vbLf & Err.Description ' エラー時のメッセージ   Application.ScreenUpdating = True ' 描画再開 End Sub

sakimi12
質問者

補足

ご丁寧なご回答ありがとうございます。なんだかとても難しそうですね…。 横(列)には結合していますが、縦(行)は結合していないので、問題がないと思っていました。 記述頂いたものをコピペして要指定◆の三か所を、 (1)Const S = "プロフィールシート" (2)Set rWork = Columns("V").Resize(.Rows(.Rows.Count).Row) (3)For Each c In Range("J13:T13") ' ※試しに結合しているセル範囲J13:T13を入力してみました※ と変えて実行してみましたが、「エラー:1004アプリケーション定義またはオブジェクト定義のエラーです」というメッセージが出ました。 ちなみに、行の高さを自動調整したい結合セルは、F9:T9、F13:T13、F21:T21、F22:T22、F23:T23の5か所です。 印刷ボタンに登録したマクロも念のために記します。 もしよろしければ、またご教授ください。 ************************************** Private Sub 印刷開始_Click() Dim 番号 As Integer a = TextBox1.Value n = TextBox2.Value 'プリンタの選択後、印刷またはキャンセル Dim BlnRtn As Boolean BlnRtn = Application.Dialogs(xlDialogPrinterSetup).Show Select Case BlnRtn Case True For 番号 = a To n Sheets("プロフィールシート").Range("A1").Value = 番号 Sheets("プロフィールシート").PrintOut Next 番号 Case False MsgBox "印刷はキャンセルされました。" End Select Unload Me End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

余分なものをそぎ落として、モデル的にテストをやってみた。参考に。 G列に文字データ(被参照データ)入っている。G列各行セルに長短いろいろの文を用意。 それをC列で参照。 すなわちC1に=G1と入れて下方向に式を複写。(VLOOKUPでなく1セル参照に簡略化した)。 ーー 先だって シートモジュールに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 3 Or 7 Then Columns("3,7").AutoFit Columns("3,7").WrapText = True End If End Sub を入れた。 いったん入れたG列の文章について、短いセルの文章を長くしたり、短いセルの文章を長くしたりするとC列が反応した。 C列やG列は人間が当初望ましいと思う幅を設定するとする。 この幅は上記VBAでは触らない。

回答No.2

#1です。 こちらで書き漏れていたことがあるので追記します。 既に [折り返して全体を表示する]が適用されている場合は、   Rows(5).AutoFit ' 5行め の場合 とか、   Rows("5:8").AutoFit ' 5:8行め の場合 とか、   Range("5:5,7:9").EntireRow.AutoFit ' 5行めと7:9行め の場合 のような行オブジェクトに対する処理も可能ですし、薦める人も多いと思います。。   Rows(5).WrapText = True 等の#1の記述は、 .WrapText = True が設定してあるかどうかを問わずに(再設定かどうかに関係なく) [折り返して全体を表示する]を設定し行高を調整してくれる記述、ということです。 因みに、これらの記述は、例えば列の幅を狭めた後、にも有効です。 追加補足、以上です。

回答No.1

こんにちは。 > ...関数を使用しているからか、書式から行の自動調整を設定してみても1行の高さになってしまいます。 [折り返して全体を表示する]ボタンを 数式確定後に再設定すれば 行高の自動調整が適用されます。 (既に設定済の場合は[折り返して全体を表示する]ボタンを2度押す。) 必要なセル範囲、または列等を選択してから [折り返して全体を表示する]ボタンを押すだけですから、 マクロにするべきかは微妙ですね。 ただ、これは[マクロの記録]機能でも、 必要な記述を得られますので、 まず、[マクロの記録]から始めてみてはいかがでしょう。 部分的な記述だけでしたら、   Rows(5).Select ' 5行め の場合   Selection.WrapText = True とか、   Range("5:5,7:9").WrapText = True ' 5行めと7:9行め の場合 のような記述になります。 数式確定後=つまり、数式の戻り値(つまり参照元の値)が変わる度に、 その都度、実行してあげる必要があります。 とりあえず、以上です。 まず、ここまでの説明で、出来ることをそちらでやってみてください。 それでも解決しない場合は、具体的にこちらがイメージできるような詳細を 補足欄にでも書いて貰えればお応えします。

sakimi12
質問者

補足

ご回答ありがとうございます。 両方試してみましたが、うまくいきませんでした。 詳細を記します。 人材管理データベースからBIツールで名前・性別・資格・自己PRなどの必要な情報項目を抽出して、ExcelのSheet2に人材情報リストとして出力します。(A列が人材番号になっています。) 同じブックのSheet1が作成した定型のプロフィールシートになっており、人材番号をA1セルに入力し、その人材番号をキーにしてSheet2から各情報項目をVLOOKUPで射影しています。プロフィールシートは、列幅は全て同じにしてセルを結合することでレイアウトを整えています。 最後にボタンをプロフィールシートの下部に配置し、印刷用のマクロを登録しました。このマクロはユーザーフォームでFor~NextやPrintoutを使用しただけの簡単なものです。人材番号を入力することで指定の人材範囲のプロフィールシートが連続で印刷出来るようにしてあります。 マクロはあまり関係なさそうですが、宜しくお願いします。

関連するQ&A

  • EXCELの「行の高さ」の自動調整について

     EXCEL2013を使っています。  EXCELでセルの配置を横位置:標準、縦位置:下詰め、「折り返して全体を表示する」と設定してあります。  添付図のような場合で行の高さを自動調整したとき、行の高さは、 第1行: 全セルで字数が各列の幅以下なので高さは1行分 第2行: B,C列で字数が列幅を超えているので高さは2行分 となっていますが、 第3行: C列では字数が列幅ギリギリですが改行は入っていません。  それなのに行の高さの自動調整を行うと高さは2行分となってしまいます。改行がないのにあたかも改行が入っているかのように行を余分にとってしまっているわけです。  このような場合1行だけになるように自動調整する方法はないものでしょうか、お伺いします。手操作で調整すればよいのですがデータ量が大変大きくて作業が大変です。  なお、これまでの経験では、ワークシートの上では1行でも、印刷すると2行になっていることがありましたが、今回の場合、印刷メニューで印刷画面を見ると改行は入っていませんし、行の高さは2行となっています。(実際の印刷は実行していません。)

  • EXCEL の行を自動調整にしているのに・・・

    EXCEL で表を作っています。各項目で文の長さがバラバラで、行を「自動調整」にしています。それが、あるときから、なぜか最後の行だけ半分ほど隠れてしまい、表示および、印刷がされなくなってしまう行がでてきました。なぜでしょう??

  • 列の高さを自動調整できるマクロ?

    ■顧客情報一覧のシートと、 顧客情報→個人の顧客を閲覧するシートがあります。 マクロを起動すると、 「一覧」に入力をしてある顧客の行動経歴が、 「閲覧」のシートのセルに反映するようになっています。 ■入力してある行動履歴は、顧客によって、その長さが違います。 ある顧客は、30数行にも渡る長さですが、 べつの顧客は1行しか行動履歴がありません。 その「情報量」に応じて、「行の高さ」が全て表示されるように自動調整してくれるマクロをくみたいと思っています。 どのようにしたらよいのか‥ アドバイスをよろしくお願いいたします。

  • Excel97で自動的に行挿入させるマクロのつくりかた。

    こんにちは。 マクロ超超初心者です。 WN98SE、Excel97です。 やりたいことは、たとえば、 B1に1001 B2に1001 B3に1002 B4に1003    ・    ・    ・ と入っていたとします。 ここで、1001から1002に変わる(又、1002から1003に変わる)とき、その間の行に3行空行を自動的に挿入させたいのですが、どういうマクロの記述をすればできるのでしょうか・・・。 それを新規ブックでもボタンひとつで実行させるにはどのような設定をしたらよいでしょうか。 どなたか教えてください。 よろしくおねがいします。

  • エクセルマクロ 印刷「105~110」などの自動連続印刷の仕方

    エクセルです。今、Vlookup関数で別のシートから呼び出して表示しています。例えば、シート1のA4に「101」と入力するとシート2を参照してデータをもってくるようになってます。 そして、102、103~と打つことによって変化していきます。 また、 101~131まで、一気に自動印刷するマクロはできました。 同様に、 201~231まで、一気に印刷するマクロはできました。 そこで、教えて欲しいのです。 105~110など途中のところを連続印刷するためのマクロはどのようになりますか。 もちろん、105~110などと打つセルをつくる必要はあると思いますが・・・。お願いしますm(_)m

  • エクセルで行の高さ

    WINDOWS XP(Home Premium)でExcel2003を使用しています。 300行のデータに対し、エクセルで行の高さの自動調整をしました。 しかし、高さが一部不充分であり、印刷されると不備が多々あります。 行の高さを  「メニュー・書式(O)→行(R)→自動調整(A)」でおこなわれる高さの 1.2倍~1.5倍くらいの高さにしたいのですが良い方法はありませんか? おそらくマクロやVBAを使えば可能なんだろうなとは思いながら、 コマンドのことやプログラムを組み立てる知識が無いので、 VBAにこれを貼り付けろ、という提案を頂けたらすごく助かります。 よろしくお願いします。

    • ベストアンサー
    • Mac
  • エクセルで、行の高さの自動調整が出来ません

    セルの書式設定で、 折り返して表示させた場合や、 Alt+Enterキーで改行させた場合、 行の自動調整が出来ません。 正確に言えば出来る時と出来ない時があります。 セルの結合などは行っていなくてもそうなります。 OSはMeです。 ご存知の方、教えてくださいね。

  • 【エクセル】 結合セルで行の高さを自動調整する方法

    通常、セルに多数の文字を書き込んでも列幅を変更 したくないときには、セルの書式設定で 「折り返して全体を表示する」 としておけば、列幅を広くすることなく、行の高さ が自動調整されます。 これを、結合セルでやろうとするとどうしても 自動調整してくれません。 結合セルでも、行の自動調整機能が働く方法を 教えてください。 よろしくお願いします。

  • エクセルでマクロを自動的に実行

    表題の通りなんですが、エクセルで、あるセルに指定された数値(語句)が入った場合に、それを自動的に感知して実行するマクロがあればと思うのですが、そういったことってできるのでしょうか。 具体的には、  1、バーコードリーダーで数値をセルに入力  2、その数値に対応する名前をvlookup関数にて表示  3、その名前が入力された時点でマクロが自動的に実行 と言うものです。  3の部分がよく分からずに困っています。できるかどうか分かりませんが、もしできるようであるならその方法を教えていただければありがたいです。どうか、よろしくお願いします。

  • Excelで50行毎に改ページを入れたい

    表題を1行入れて1ページに49行となるように改ページを入れたいのですが、どのようなマクロを組めばできますか? また、行は49行の倍数と成るように印刷範囲を設定しして列は1ページに収まるように設定するにはどうしたらよいか併せて教えていただければ助かります。 例えば、349行 F列まである場合は、縦が7枚×横が1ページとなるように自動で設定したいです。

専門家に質問してみよう