質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

329閲覧

コピーしたシートの値の削除について

miguin0324

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/09/22 13:12

前提

VBAを練習中です。
コピーしたシートに対して、セル範囲を変数に入れその範囲に対して処理を実施したいのですが、変数に入れると思った通りの動きになりません。

・1つのブック内での操作
・左から「sheet1」と「data」の2つシートがある
・「data」シートには表が入力されている(範囲はA1からF501まで。F列のみ空白多数あり。)

実現したいこと

「data」シートをコピーした後、コピーしたシートの表のデータ部分(A2:F501)を、値のみ削除したい

※コード②でやりたい事は出来ているのですが、変数を使って実現したいです。
※変数に入れた場合と入れない場合で動きが異なる理由が知りたいです。

該当のソースコード

コード①
Dim rng As Range
Set rng = Range("A2:F501")
Worksheets("data").copy After:=Worksheets(Worksheets.count)
rng.ClearContents

→dataシートのA2:F501の値が消える、
data(2)シートのA2:F501の値は消えない

コード②
Worksheets("data").copy After:=Worksheets(Worksheets.count)
Range("A2:F501").ClearContents

→dataシートのA2:F501の値は消えない
data(2)シートのA2:F501の値が消える

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Rangeの前のシート指定を省略するとActiveSheetのRangeということになります。
つまり、コード①は下記の意味になります。

vba

1Dim rng As Range 2Set rng = ActiveSheet.Range("A2:F501") 'この時点でActiveSheetはdata、dataのセル範囲が代入される 3Worksheets("data").copy After:=Worksheets(Worksheets.count) 'ここでActiveSheetはdata(2)に変わる 4rng.ClearContents 'dataのセル範囲が対象

コピーする前に変数に代入したいのなら、Range変数に代入するのではなく、セル範囲のアドレスを代入するといいでしょう。

vba

1Dim adrs As String 2adrs = "A2:F501" 3Worksheets("data").copy After:=Worksheets(Worksheets.count) 4ActiveSheet.Range(adrs).ClearContents

投稿2022/09/22 13:40

hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miguin0324

2022/09/22 15:21

回答ありがとうございます。 すみません、まだ理解できていません。 書いていただいた通り、コードの3行目ではアクティブシートがdata(2)になっていますよね。 そして4行目に行った時、変数rngは4行目時点でアクティブであるシートのdata(2)を対象にすると思っていたのですが、これはなぜdataが対象になってしまうんでしょうか?
hatena19

2022/09/22 15:58

2行目の ActiveSheet は dataシート です。 つまり、 Set rng = ActiveSheet.Range("A2:F501") で rng に代入されるのは、Worksheets("data").Range("A2:F501") です。 この後、アクティブなシートが変わっても、 rng は Worksheets("data").Range("A2:F501") のままです。 まあ、このような誤解をうみかねないし、アクティブなシートが想定しているシートでない場合があったりするので、最初から、 Set rng =Worksheets("data").Range("A2:F501") としておけば紛れないですね。
miguin0324

2022/09/23 14:21

ありがとうございます。やっと理解できました。 教えていただいた通り、セル範囲のアドレスか、シートも含めて代入 でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問