dポイントプレゼントキャンペーン実施中!

エクセル2013のVBAで、ActiveWorkbook.ActiveSheetの、例えばC3からI3まで結合されているセルを基準ActiveCellにして、行方向は4から17セルまで列方向はC列からI列までをコピーしたいのですが、思ったようにOffsetで位置がとれず列がどうしてもずれてしまいます。
どのような指定をすればできるでしょうか?

すいませんが、よろしくお願いいたします。

A 回答 (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」の部分に、今の状態から該当する数値を拾ってきて当てはめるような工夫をします。
    • good
    • 0
この回答へのお礼

すいません、回答を見落としていました。
これでいけました。
どうもありがとうございました。

お礼日時:2014/12/22 00:18

補足を読ませていただきました。


まだ本当によく理解できていないのですが、もしかしたら、コピーの範囲をマクロで決めて、ユーザーの任意で貼付けするということでしょうか?

もし、そうなら、かなり特殊なマクロで、一般的ではありません、できないわけではないのですが。

それとも、「日付の[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
'//

まだ、私は、よく分っていないかもしれませんが、たぶん、コードの考え方は、多少の参考になるのではないかと思っています。
    • good
    • 0
この回答へのお礼

<#1さんがお書きなった方法で良いはずです。

そうでした。#1さんの回答を見落としていました。
とりあえず、コピーして貼り付けるんですがそちらは一応素人なりの書き方で完成しているんで大丈夫ですがコードの書き方は参考になります。お手数をおかけしました。

どうもありがとうございました。

お礼日時:2014/12/22 00:16

ご質問の趣旨がよく理解できないのです。



 結合セルが[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までを選べず列がずれたりするのでどういう指定をすればよいのか知りたいのです。(または、あきらめた方がよいのかな?、とか名前を定義すればいけるのかな?日ごとに定義が必要?)

すいません、この説明で内容の方よろしいでしょうか?

補足日時:2014/12/15 23:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!