- ベストアンサー
エクセル2013のVBAで結合セル基準Offset
エクセル2013のVBAで、ActiveWorkbook.ActiveSheetの、例えばC3からI3まで結合されているセルを基準ActiveCellにして、行方向は4から17セルまで列方向はC列からI列までをコピーしたいのですが、思ったようにOffsetで位置がとれず列がどうしてもずれてしまいます。 どのような指定をすればできるでしょうか? すいませんが、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ActiveWorkbook.ActiveSheetの、例えばC3からI3まで結合されているセルを基準ActiveCellにして 何がアクティブセルになっているのか、まず調べてみましょう。 ○状況 C3からI3まで結合済みにしてある sub macro1() range("C3").select msgbox activecell.address end sub >行方向は4から17セルまで列方向はC列からI列までをコピーしたい このように(コピーしたい範囲の)行数や列数が「既知である」と前提を置いてしまうと、「C3:I3が結合されている」とかはどうでもよくなってしまいます。 sub macro2() range("C3").select activecell.offset(1).resize(14,7).copy end sub そうではなくて何か結合セルの「今の姿」を基準にどーにかしたいなら、上述マクロ2の「7」あるいは「14」の部分に、今の状態から該当する数値を拾ってきて当てはめるような工夫をします。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
補足を読ませていただきました。 まだ本当によく理解できていないのですが、もしかしたら、コピーの範囲をマクロで決めて、ユーザーの任意で貼付けするということでしょうか? もし、そうなら、かなり特殊なマクロで、一般的ではありません、できないわけではないのですが。 それとも、「日付の[C3:I3]」を選んだ時点で、[C4からH17]を範囲選択するというものでしょうか? >Range(ActiveCell, ActiveCell.Offset(13, 6)).COPY ActiveCell が、結合セルなら、この方法ではうまく行きません。 そこに、結合セルを含めると、列はずれてしまいますから、結合セルは、別にしなければなりませんね。 むろん、I列が空の状態なら、なんら問題はないはずです。 大事なのは、そのコピーした後の、貼り付け先が重要な鍵になるはずです。 **** >日付の下の行の内容をコピーしたいと思っています。 というだけなら、 #1さんがお書きなった方法で良いはずです。 '// Sub Test1() If ActiveCell.MergeCells Then ActiveCell.Offset(1, 0).Resize(14, 6).Copy End If End Sub '// しかし、貼り付け先が、後で決まるような場合で、なおかつ、結合セルを含める場合は、例えば、このような複雑なスタイルになってしまいます。 [結合セルの日付]をダブルクリックすると、その下の範囲がコピーされます。そして、任意の場所を右クリックすると、まず、データ部分を一行下に貼り付けて、次に、右クリックした場所に、[日付の部分]を貼り付けます。本来、コピーする前に、結合セルを通常セルに戻してしまい、その後で、結合セルに戻す方法でもよいかと思います。二つのマクロがセットになります。 '// 'シートモジュール Dim rng As Range Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'ダブルクリック(コピー用) Cancel = True If Target.MergeCells Then Set rng = Target.Offset(1, 0).Resize(14, 6) rng.Copy End If End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) '右クリック(貼り付け用) Cancel = True If Not rng Is Nothing Then Target.Offset(1).PasteSpecial rng.Offset(-1).Cells(1).MergeArea.Copy Target End If Set rng = Nothing End Sub '// まだ、私は、よく分っていないかもしれませんが、たぶん、コードの考え方は、多少の参考になるのではないかと思っています。
お礼
<#1さんがお書きなった方法で良いはずです。 そうでした。#1さんの回答を見落としていました。 とりあえず、コピーして貼り付けるんですがそちらは一応素人なりの書き方で完成しているんで大丈夫ですがコードの書き方は参考になります。お手数をおかけしました。 どうもありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
ご質問の趣旨がよく理解できないのです。 結合セルが[C3:I13]まであって、 ・行方向は4から17セルまで →これはよく分からないです。3からではないでしょうか? ・列方向はC列からI列までをコピー これは、結合セルを一つにして、コピーするという意味だと思いました。 というなら、要するに、結合セルというものは、「左上端のセル」を基点としているから、 Range("B3").MergeArea.Copy Range("B17") こういうことではないのかな? それとも、たんに17行先なら With Range("B3") .MergeArea.Copy .Offset(18) End With 一番上にセルの基点として、17行先なら、 With Range("B3").MergeArea .Copy .Offset(17 - .Rows.Count, 0).Resize(.Rows.Count, .Columns.Count) End With こういうことかな?
補足
すいません、書き方がだいぶ悪かったです。 結合セルが[C3:I3]まであって(その下の行は結合されていません、列方向は同じく結合セル[J3:P3]・・・と続いている)、そのセルを選択してアクティブな状態にしている時に、C4からH17までOFFSETでコピーしたいのです。 もっと書くと 結合セル[C3:I3]には日付が入っており、日付の下の行の内容をコピーしたいと思っています。日付が変われば[J3:P3]を選んだりして列が変化するので、セルの番地での指定はできません。 とりあえず、現在はC4(やJ4・・・)を選択した状態で ActiveWorkbook.ActiveSheet.Range(ActiveCell, ActiveCell.Offset(13, 6)).COPY でC4からH17までコピーしていますが(実際はさらにその下の方もいくつかOffsetで位置を取得してコピーしていきます)、日付を選んだ状態の方が、別の人が使う時操作的に分かりやすいので変更したいのですが、結合したセルを基準にOFFSETで位置を指定しても、どうしてもC4からH17までを選べず列がずれたりするのでどういう指定をすればよいのか知りたいのです。(または、あきらめた方がよいのかな?、とか名前を定義すればいけるのかな?日ごとに定義が必要?) すいません、この説明で内容の方よろしいでしょうか?
お礼
すいません、回答を見落としていました。 これでいけました。 どうもありがとうございました。