• ベストアンサー

結合されたセルの移動 VBA

「結合されたセルの一部を変更することはできません」と言うメッセージイベントでVBAを実行するにはどうしたらよいでしょうか? 結合されたセルあるいは複数の結合されたセルを選んで移動する場合、移動先が自分のセルに重なると、「結合されたセルの一部を変更することはできません」と言うメッセージが現れます。 これを回避するには一旦何も無い離れたところに移動し、それから再び目的の場所に移動します。 私の技能では以下のようなマクロになると思います。 最初に元の結合セルを選び、場所を覚えるマクロを実行しする。 次に移動先を指定し、「一旦何も無い離れたところに移動し、それから再び目的の場所に移動」するマクロを実行します。 これをワン・アクションで、「結合されたセルの一部を変更することはできません」と言うメッセージが出るタイミングで実行するにはどうしたらよいでしょうか。 よろしくお願い申し上げます。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.6

未使用のセルに移して処理するのならエラー云々は関係ないのでは? で、簡単なサンプルを。 一時的に利用する未使用セルを質問と同じ A50000以降とする。 ------------------------------------------------- '(Ctrl+a) Sub 場所の記憶()  Selection.Cut Destination:=Range("A50000") End Sub --------------------------------------------------------- '(Ctrl+b) Sub 特殊貼り付け()   Range("A50000").CurrentRegion.Cut Destination:=ActiveCell End Sub ------------------------------------------------- (1)場所の記憶「Ctl+a」で無条件に選択範囲を使われていないA50000からに移動 (2)次に移動先のセルを選択 (3)特殊貼り付け「Ctl+b」でActiveCellに貼り付け 以上。  

believe_me
質問者

お礼

回答ありがとうございます。 通常のカット&ペーストの動作に準じた動きを想定して いましたが、割り切って考えると、この簡単なマクロで十分ですね。

believe_me
質問者

補足

最初に選択してから、実行しない場合もあり得るので「Selection.Cut Destination:=Range("A50000")」は二つ目のマクロに入れました。 移動先が元のセルの底辺より低い位置の場合、移動先の左上ではなく左したとすることで、どこへでも移動できるようにしました。 皆様のおかげでなんとか実用的なマクロを作ることができました。 ありがとうございました。 Option Explicit Public Pr1 As Long Public Pr2 As Long Public Pr3 As Long Public Pc1 As Long Public Pc2 As Long Public Pc3 As Long Sub 場所の記憶()   Pr1 = Selection.Row   Pr2 = Selection.Rows.Count   Pc1 = Selection.Column   Pc2 = Selection.Columns.Count   Pr3 = Pr1 + Pr2 - 1   Pc3 = Pc1 + Pc2 - 1   Selection.Copy 'ここではコピーしないが、選択範囲を表示する為に行う End Sub Sub 特殊貼り付け()   Dim r1 As Long   Dim r2 As Long   Dim r3 As Long   Dim c1 As Long   Dim c2 As Long   Dim c3 As Long      If (Pr1 = 0) Or (Pr2 = 0) Or (Pc1 = 0) Or (Pc2 = 0) Then     MsgBox "先に位置の指定を行ってください"     Exit Sub   End If   r1 = Selection.Row   c1 = Selection.Column   If r1 > Pr3 Then     r3 = r1     r1 = r3 - Pr2 + 1   Else     r3 = r1 + Pr2 - 1   End If   c3 = c1 + Pc2 - 1   Range(Cells(Pr1, Pc1), Cells(Pr3, Pc3)).Select   Selection.Cut Destination:=Range("A50000")   Range(Cells(r1, c1), Cells(r3, c3)).Select   Range("A50000").CurrentRegion.Cut Destination:=ActiveCell   Application.CutCopyMode = False End Sub

その他の回答 (5)

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

#3です。 ご質問の趣旨を私が誤解ー>使えない ということのようですが、 あるセルを選択、または注目したとき、被結合セルの判別ができれば 、その際あるモジュールを実行するなり何なりできると思って、 コードの有効性をテストしてコードまで挙げました。 そのアイデアは(1)MergeCellsプロパティがTrueでかつ (2)基準セルが自分の番地と違うという判定です。 これでは、質問のケースでは使えないの課も知れませんが、セルの 選択をする場合(SelectionChange)などなら 選択した瞬間に上記判別に入れば、役立つような気がしてました。 役立たないのなら、残念ですが、#3は無視してください。 >最初に元の結合セルを選び、場所を覚えるマクロを実行しする。 こういう「覚えておく」式のロジックは一般に避けたほうが良いと思う。 >次に移動先を指定し、「一旦何も無い離れたところに移動し、それから再び目的の場所に移動」するマクロを実行します。 これをワン・アクションで、「結合されたセルの一部を変更することはできません」と言うメッセージが出るタイミングで実行するにはどうしたらよいでしょうか この意味は、被結合セルを指定されたら、結合セルを強制的に選択してしまうということですか?表現がわかりにくい。もう一歩自分のプログラムロジックは置いておいて、したいケースを文章に表現したらどうですか。

believe_me
質問者

補足

どうもマウスだけのワン・アクションでは無理なような気がして、以下のVBAを作ってみました。 Sub 場所の記憶()にCtr-aを、Sub 特殊貼り付け()にはCtr-bを割付けました。 元の場所を選んでCtr-aで記憶させ、移動先を選らんでCtr-bを押して貼り付けることができました。 但し上方方向だけで、下方方向は選択した場所が結合セルの右上になっているので重ねることはできません。左下のセルが先頭になるような貼り付けマクロをもう一つ作ればできると思います。 Option Explicit Public Pr1 As Long Public Pr2 As Long Public Pr3 As Long Public Pc1 As Long Public Pc2 As Long Public Pc3 As Long Sub 場所の記憶() Pr1 = Selection.Row Pr2 = Selection.Rows.Count Pc1 = Selection.Column Pc2 = Selection.Columns.Count Pr3 = Pr1 + Pr2 - 1 Pc3 = Pc1 + Pc2 - 1 Selection.Copy 'ここではコピーしないが、選択範囲を表示する為に行う End Sub Sub 特殊貼り付け() Dim r1 As Long Dim r2 As Long Dim r3 As Long Dim c1 As Long Dim c2 As Long Dim c3 As Long r1 = Selection.Row c1 = Selection.Column r3 = r1 + Pr2 - 1 c3 = c1 + Pc2 - 1 Range(Cells(Pr1, Pc1), Cells(Pr3, Pc3)).Select Selection.Cut Cells(50000, 1).Select '多分ここら辺は使われていないだろう ActiveSheet.Paste If Cells(r1, c1).MergeCells Then Cells(r1, c1).UnMerge End If If Cells(r1, c3).MergeCells Then Cells(r1, c3).UnMerge End If If Cells(r3, c1).MergeCells Then Cells(r3, c1).UnMerge End If If Cells(r3, c3).MergeCells Then Cells(r3, c3).UnMerge End If Cells(50000, 1).Select Selection.Cut Range(Cells(r1, c1), Cells(r3, c3)).Select ActiveSheet.Paste Application.CutCopyMode = False End Sub

  • Ce_faci
  • ベストアンサー率36% (46/127)
回答No.4

No2です そうですか >メッセージが出るタイミングで実行するにはどう… プログラムを同時に実行することは出来ないものと考えております。 エラーメッセージ「結合されたセルの一部を変更することはできません」は、 コピーを試みた。 が、出来なかった。 メッセージでお知らせ。 の順を踏んでいると考えております。 おやりになりたい作業マクロはメッセージの出る前でしょうか、あとでしょうか? 前者の場合でしたら、セルのプロパティがどうなっているのかを調べてから、作業することになると思われます。 私は後者の場合で考えました。もっとも、私が添えたMsgboxは、マクロ実行で何も結果が確認できないのはどうかと考えて付けたものでございますが、見方を変えればMsgboxがエラーメッセージの表示と変わらないと考えます。その場合、Callの行は削除になり、MsgboxにSetステートメントを用いて次のマクロをご用意されるといいかと存じます。

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

A1:A10でA3:A5とA8:A9をセル結合して、下記を実行すると、被併合セルである、4,5および9が表示された。これを生かせないでしょうか。 Sub merg1() For i = 1 To 10 Cells(i, "A").Activate If Cells(i, "A").MergeCells = True And ActiveCell.Address <> Cells(i, "A").Address Then MsgBox i End If Next i End Sub がエラーなく動きました。 被結合セルのプロパテイと結合セル(基準セル)プロパテイがVBAにないみたいなので、苦肉のアイデアです。 ーーー 既出回答のエラートラップも良いと思います。

believe_me
質問者

お礼

回答ありがとうございます。 ちょっと質問が言葉足らずだったようです。 「結合されたセルの一部を変更することはできません」のエラーを回避することではなく、このエラーが出るべきタイミングで特定のマクロのを自動実行させる方法をお聞きしたいのです。 具体的には、エクセルシートで結合されているセルをマウスで選択し、ドラッグし、ドラッグ先が自分自身(又は他の結合セルでもいいんですが)に被っていて、通常は「結合されたセルの一部を変更することはできません」とメッセージが出るところで、自動的に任意のマクロを実行する、と言うことです。

  • Ce_faci
  • ベストアンサー率36% (46/127)
回答No.2

こんばんわ エラー番号で処理しようにも、1007が出る前に マクロの実行エラー1004が出ますね。それでもいいんですけどね。 そこで、エラーメッセージで条件分けしてみました。カッコ悪いですけれど。 私のPCでは動きます。 以下コードです。 例では、セルA6:C6を結合して、試しました。 Sub 私の過ち() On Error Resume Next 'ココにお好みのコピーのコードを書いてください ActiveSheetRange("A1:B1").Copy Destination:=Range("A6") If Err.Description = _ "結合されたセルの一部を変更することはできません。" Then 'Call 次にやりたいサブルーチン MsgBox "迎春" End If End Sub

believe_me
質問者

お礼

回答ありがとうございます。 恐れ入りますが、No3のお礼を参照願います。

  • toshi_2000
  • ベストアンサー率30% (306/1002)
回答No.1

このエラー番号は、1004です。 エラートラップ処理をしたらどうでしょう。

believe_me
質問者

補足

回答ありがとうございます。 恐れ入りますが、No3のお礼を参照願います。

関連するQ&A

  • VBA 結合セルに名前を付ける

    作成中のマクロで、 「B9とB10を結合したセルに名前を付ける」 作業を入れたいのですが、 Range("B9:B10").Name = "あああ" とすると、マクロを実行した時にエラーになってしまいます。 Range("B9").Name = "あああ" としても、エラーになりました。 エラーが出ないvbaを教えてほしいです。

  • VBAで、結合したセルの位置を変えたい

    エクセル2007のVBAですが、たとえば結合したセルG11があります。 このセルに、マクロ実行時に値を渡してセルの場所を変えることはできますか? たとえば(横の値,縦の値)とし、(1,0)という値を渡すとセルの位置はH11となり、 (0,1)という値を渡すとG12となる。 (-1,0)ならF11、といった感じです。 可能でしょうか?よろしくお願いします。

  • EXCEL2Kのセルの結合でエラー

    結合していないセルを入力しようとすると 「結合されたセルの一部を変更することは出来ません」と表示されます。マクロ等は、書かれていません。 そのセルの書式を見ても結合はされていません。 他のどのセルが影響しているのか調べる方法ご存知な方、教えていただけませんでしょうか?

  • エクセルVBA 結合されたセルの内容を消去させる方法

    こんにちは、いつもお世話になっています。 結合されたセルの入力内容を消去したいです。(書式などはそのまま) 現在 Range("A9").ClearContents となっているのですが、実行してみると 「実行エラー1004 結合されたセルの一部を変更することはできません」 と出てしまいます。 何かいい方法はあるでしょうか。

  • 結合していないセルから結合したセルへのコピーの方法

    何行にも渡る結合していないセルのデータを何行もある結合したセルへとコピーしたいけど、「結合した一部のセルを変更することはできません」と表記され、できません。何か方法はありますか?簡単なものの質問で恐縮です。

  • 結合セルから結合セルへ値のコピー

    結合されたセルに計算式が入力されています。 その値だけを結合した別のセルへコピーしたいのですが、 「同じサイズの結合セルが必要です。」とメッセージが出てできません。 コピー先の結合セルはコピー元のセルと同じように結合しています。 コピーできる方法を教えてください。

  • VBA セルの値を別セルにコピーするには

    VBAでPastespecialでセルの値を別セルにコピーするマクロを組みたいです。 以下は参考にしたソースコードです。 Worksheets("Sheet1").Range("A1:B10").Copy Worksheets("Sheet2").Range("A1").PasteSpecial _                  Paste:=xlPasteValues, _                  Operation:=xlNone, _                  SkipBlanks:=False, _                  Transpose:=False あるExcelマクロの入力フォームSheetに、製品リストと使用している場所のマスタデータをクエリで読み込んで、製品IDと場所のコードを入力したらINDEX関数で抽出し、マクロ実行ボタンを押すと抽出結果を入力フォームの入力欄に貼り付けします。 上記のマクロだと貼り付けする元セルを移動させたら内容がずれた値がそのまま貼り付けされてしまうと思われますが、地道にコードのコピー元のセルを書き直さないといけないのでしょうか。 Excelの関数だと参照範囲を固定したら掴んで移動させてもセル番地が連動して移動してくれますが、マクロの場合どのようにすれば良いでしょうか。 また、複数個所のセルをコピーするので Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False をコピーするセルの箇所に毎回入れていますが、コピー元のセル・コピー先のセル番地を一括して実行する方法はありますでしょうか。 VBAはソースコードを参考に当てはめているだけで、自力でコードを書くスキルは皆無です。 Excelは2016です。 詳しい方いましたらご教授ください。よろしくお願い致します。

  • Excel VBAで可視セルをコピーしようとすると結合されたセルを変更

    Excel VBAで可視セルをコピーしようとすると結合されたセルを変更する事が出来ないとメッセージが出て進めないのは、何故でしょうか。

  • 結合したセルの高さを内容に合わせてVBAで設定したい

    EXCELのVBAで質問です。 ファイルから文章を取り出し、 別のファイルの指定された位置に その文章をはめ込む作業を行っています。 文章を入れるセルは結合されたセルで、 折り返して全体を表示する設定にしてあります。 セルの幅は固定、フォントはプロポーショナルフォントを使用します。 (英文の場合半角で入力されるので) この時、文章の長さに合わせて、 文字が切れることなく印刷されるように マクロでセルの高さを設定したいと考えています。 そういう方法はありますでしょうか?  あれば教えていただきたいと思います。 文章の長さは数文字~数百文字とまちまちで、 あらかじめ適当な高さを取るわけにはいきません (はめ込む文章は1つではなく、複数あり、 はめ込む先も複数行あるため、 1つ1つのセルの高さを多めに取ると、 文章が短い場合にやたら空白ができてしまうため) 宜しくお願いいたします。

  • Excel 結合セルへのコピーが出来たり出来なかったりする

    こんにちは。 Excelで、”結合されていない”セルを、 別シートの結合セルへ貼り付ける時に、 正常に貼り付けできる場合と、できない場合があります。 (出来ない場合は、「結合されたセルの一部を変更することはできません」 というメッセージが表示されます。) 結合セルへの貼り付けが出来ないことがあるのは理解しているのですが、 何度か試しているうちに、セルの内容に関わらず、 例えば、コピー元のセルが、A2だとNGで、A3だとOKという風に、 セル位置が決まっているようです。 というのも、OKだったA3のセルをA2にコピーし、それを結合セルに 貼り付けると、NGになってしまいます。 原因や解決策のヒントなどがありましたら、お願いします。

専門家に質問してみよう