- ベストアンサー
選択範囲のセルを1行ずつ結合するマクロ
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 以下は、私がツールバーで使っているものです。 そのままですと、書式がCenter になってしまいますので、左寄せにします。また、これは、トグルになっていますから、同じ範囲を選択すれば、元に戻すことが可能です。 なお、これは、良く使われるものですから、個人用マクロブック側に入れて呼び出しています。 '------------------------------------------------- Sub MergeCells() Dim r As Range If StrComp(TypeName(Selection), "Range", 1) = 0 Then For Each r In Selection.Rows If r(1).MergeCells = False Then r.Merge With r.Rows .HorizontalAlignment = xlLeft .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext End With Else With r .UnMerge .HorizontalAlignment = xlGeneral End With End If Next r End If End Sub
その他の回答 (9)
- Wendy02
- ベストアンサー率57% (3570/6232)
#9の補足 なお、私のマクロは、既存の横結合ですと、文字の場合は左寄せされますが、数字を入れると、右寄せされてしまいます。それを結合と同時に左寄せします。また、トグルで横結合を戻しますと、書式も標準に戻すようになっています。
お礼
Wendy02さん、補足ありがとうございます。 > なお、私のマクロは、既存の横結合ですと、文字の場合は左寄せされますが、 > 数字を入れると、右寄せされてしまいます。それを結合と同時に左寄せします。 > また、トグルで横結合を戻しますと、書式も標準に戻すようになっています。 ご説明ありがとうございます。 この機会でマクロをもっと勉強したいと思います。 なかなか手の出ないマクロでしたが、思い切って質問して良かったです。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >毎回「最左端のデータのみ保持されますが、結合しますか?」 >というようなダイアログが出るのですがこれは飛ばせるかどうかです。 これは、既存の機能ですから、私個人は、一般的には手を付けませんてした。これは、なるべく既存のものに近づけるためです。今の段階では、Ctrl + z で戻す機能は付けておりません。ややこしくなるからです。DisplayAlerts でも、可能だと思います。 If r(1).MergeCells = False Then r.Offset(, 1).Resize(, r.Columns.Count - 1).ClearContents '*この行を加えます。 r.Merge なお、コマンドボタンに既存の横結合はあるのは知っていますが、私のマクロは、ふつうの結合ボタンと同じようにトグルになっています。横結合している範囲を選択して、もう一度、マクロを行えばわかります。ツールボタンは、結合と同じボタンを使っています。それでなければ、新たに作る意味がありません。もともと、私のコードは私のために作ったものです。 mars180sxさん、どうもありがとうございます。
お礼
Wendy02さん、ご返答ありがとうございます。 せっかくの技術を提供していただいたのに、自分本位なことばかり言ってしまい、申し訳ありませんでした。 みなさんは何かの経緯でマクロを開発されるのですし、 何かしら意図があってのスクリプト内容ということに気付くべきでした。 不快な気持ちにさせてしまったことをお詫び申しあげます。 トグル機能についてですが、前の回答で触れずすみませんでした。 ちゃっかり使わせていただいています。 また、新たにマクロのご提示ありがとうございます。 早速試させていただきました。 手作業を加えることなくすっきり結合されました。嬉しいです。 ご返答ありがとうございました。
- mars180sx
- ベストアンサー率31% (37/119)
度々失礼します。 お望みの形に出来たようなので、私もうれしく思います。 で、結合時にメッセージが表示される件ですが、以下の命令を 追記するとメッセージは表示されなくなります。 (強制的に注意ダイアログを表示しないようにする設定です) ===================================================== Sub Macro1() Application.DisplayAlerts = False ←この行を追記 | (以下、前述と同じ) ===================================================== 制御系のプログラムを開発する仕事に従事しているので、処理の 速さには重点を置いているのですが、私から見てもWendy02さんの コーディングの方が結合前の状態にも戻せるという点で優秀だと 思います。メッセージを非表示にする方法は上記と同じでOKな はずです。 お役に立ちましたら、Wendy02さんにポイントを付与していただけると 幸いです。(_ _)m
お礼
mars180sxさん、ご返答ありがとうございます。 おかげさまで気持ちよく作業をすることができました。 > 制御系のプログラムを開発する仕事に従事しているので、処理の > 速さには重点を置いているのですが、私から見てもWendy02さんの > コーディングの方が結合前の状態にも戻せるという点で優秀だと > 思います。メッセージを非表示にする方法は上記と同じでOKな > はずです。 なんと、ということは贅沢にも使い分けができますね。 ありがとうございます。 早速ですが、戻したいときはWendy02さんのを、早く処理したいときはmars180sxさんのを使用させて頂いております。 色々な実現方法があるという点でもとても勉強させていただきました。 本当にありがとうございました。
- myRange
- ベストアンサー率71% (339/472)
>「最左端のデータのみ保持されますが、結合しますか?」 >というようなダイアログが出るのですが このメッセージを表示しないようにするには DisplayAlertsプロパティで前後を挟んでやります。 '--------------------------------------- Sub Test() Dim Rng As Range Application.DisplayAlerts = False For Each Rng In Selection.Rows Rng.Merge Next Rng Application.DisplayAlerts = True End Sub '---------------------------------------- 以上ここまで。
お礼
myRangeさん、ご回答ありがとう御座います。 >DisplayAlertsプロパティで前後を挟んでやります。 このようなプロパティがあるとは・・。 丁寧にマクロも載せていただきありがとうございます。 早速やってみましたが、ダイアログが消えてとてもすっきりしました。 ありがとうございました。
- nattocurry
- ベストアンサー率31% (587/1853)
> あとはこれを選択範囲ぶん繰り返すマクロを組めばできそうな気がしてきました。 ん??? 範囲を選択して、このボタン(コマンド)一発で、やりたいことが出来るはずなので、もうマクロを組む必要は無いと思うのですが・・・ 横方向に結合したい範囲が、離れたところにいくつもあるということでしょうか?
お礼
nattocurryさん、ご返信ありがとうございます。 > ん??? > 範囲を選択して、このボタン(コマンド)一発で、やりたいことが出来るはずなので、もうマクロを組む必要は無いと思うのですが・・・ > > 横方向に結合したい範囲が、離れたところにいくつもあるということでしょうか? いえ、私の勘違いでした。すみません。 勘違い(1) 横方向に結合は1行ずつ選択しないといけないと思っていた。 これはnattocurryさんへの投稿をしたあとすぐに間違いだと気付きました。 勘違い(2) 各行を結合させるごとに 毎回「最左端のデータのみ保持されますが、結合しますか?」という ダイアログが表示されるのですが、 このとき「OK」ボタンを押下する作業が発生するので、 それもマクロで実現させる必要があると思っていました。 結果、繰り返しのマクロを組めばよいのでは、という結論に至りました。 これも勘違い(1)が解消されたあとすぐに気付いて補足するべきでした。 ご返信いただきありがとうございました。
- mars180sx
- ベストアンサー率31% (37/119)
すみませんでした。当を得ていない回答だったようなのでリベンジ させていただきます。 以下のマクロは、選択した範囲を「各行毎」に自動でセル結合するものです。 Sub Macro1() Dim lng_Row As Long Dim lng_Column As Long Dim lng_Rows As Long Dim lng_Columns As Long Dim cnt_1 As Integer lng_Row = Selection.Row lng_Column = Selection.Column lng_Rows = Selection.Rows.Count lng_Columns = Selection.Columns.Count cnt_1 = 0 Do Until lng_Rows = cnt_1 Range(Cells(lng_Row + cnt_1, lng_Column), _ Cells(lng_Row + cnt_1, (lng_Column + lng_Columns) - 1)).Merge cnt_1 = cnt_1 + 1 Loop End Sub
お礼
mars180sxさん、ご返信ありがとうございます。 私のつたない文章にお応え下さってとても嬉しく思います。 マクロありがとうございます。 早速ためしてみました。 できました!! 自分でマクロを記録させるよりずっと早く処理してくれてありがたいです。 (自分の記録されたのを見てみたのですが長くなりすぎて意味不明でした・・) ところで、各行を結合させるごとに 毎回「最左端のデータのみ保持されますが、結合しますか?」 というようなダイアログが出るのですがこれは飛ばせないですよね? もしお時間があればご意見いただけると幸いです。 ご回答ありがとうございました。
- nattocurry
- ベストアンサー率31% (587/1853)
マクロを作ることも出来ますが、Excelにそのような機能がありますよ。 表示 - ツールバー - ユーザー設定 「コマンド」タブ 分類:書式 コマンド:横方向に結合 この「横方向に結合」を、ツールバーのどこかに配置しておけば、 範囲を選択して、このボタンを押すだけで、やりたいことが出来ます。
お礼
nattocurryさん、ご回答ありがとうございます。 >コマンド:横方向に結合 これをやりたかったんです!! こんなのがあったんですね。不勉強で皆様申し訳ありませんでした。 あとはこれを選択範囲ぶん繰り返すマクロを組めばできそうな気がしてきました。 (また懲りずに質問しそうですが・・) 本当にありがとうございました。
- mars180sx
- ベストアンサー率31% (37/119)
画像に記載されている文字が読み取れないので正解ではないかも しれませんが- Sub Macro1() Selection.Merge End Sub これだけで選択した範囲が結合されるはずです。
お礼
mars180sxさん、ご回答ありがとう御座います。 >画像に記載されている文字が読み取れないので正解ではないかも >しれませんが- なんとも申し訳ありません。イメージの注釈をつけていました。 一応記載させていただきますと、 「※イメージを表すために別のセルに書いていますが、 本来は「別のセルではなく、そのセルが結合される」というようにしたいのです」 ということでした。 範囲選択のマージのマクロありがとうございます。 選択された範囲で1行ずつのマージを行いたかったので、 このマクロはまた別の機会に使わせていただきます。 ありがとうございました。
- Sinogi
- ベストアンサー率27% (72/260)
>イメージとしては >(1)範囲選択する >(2)マクロ実行する マクロ記録をとればできることだと思います。 記録されたマクロからその時の範囲をRem化するだけじゃないかな
お礼
Sinogiさん、ご回答ありがとう御座います。 >マクロ記録をとればできることだと思います。 そもそもどんなマクロにすればよいのか自体もよくわかっていませんでした。 せっかく教えていただいたのに、もともとの説明が足りずすみません。 >記録されたマクロからその時の範囲をRem化するだけじゃないかな ちょっと聞きなれない言葉なので、調べてみます。 解決方法が見えてきました。ありがとうございました。
お礼
Wendy02さん、ご回答ありがとうございます。 マクロをご提示いただきありがとうございます。 このようなやり方でも実現できるのですね。 セル毎のオプションも多様にあることがわかり、勉強になりました。 早速やってみましたが、無事実現できました。ありがとうございました。 以下他の方にも質問して恐縮なのですが、 よければご意見お聞かせ願えないでしょうか。 聞きたい内容は、各行を結合させるごとに 毎回「最左端のデータのみ保持されますが、結合しますか?」 というようなダイアログが出るのですがこれは飛ばせるかどうかです。 お時間あればご意見くださると幸いです。 ご回答ありがとうございました。