ブック名やコピー先を変数で指定するには?

Question 28.2 Previous Next
今勉強中です。質問は、セルの内容をマクロ内で使用したい場合の書き方です。例えば、
1) セルの名前で、あるシートを保存する。シートの保存自身は、自動記憶でも出来ますが・・・
2) シート1のある範囲を、シート2のあるセルにコピーしたい場合で、 シート2のセルを任意に変更したい場合は、マクロをどう書けばよいでしょうか。 コピー自身は自動記憶でも出来ますが・・・
宜しく御願い致します。
Answer   Copyright (C) 2000.5.9 永井善王
変数で指定する方法を知りたいのですね。
講義 この「すぐに役立つエクセルVBAマクロ集」には、
変数名で範囲指定して選択するには? のページがあります。
そこに掲載されている
「印刷枚数を変数で指定する方法」と、
「シート名と貼り付け位置を変数で指定する方法」を見ていただければわかるかと思いますが、 「今勉強中」ということですので、あらためて、まとめておきます。
1) ブック名を変数で指定して保存するマクロ

最初に確認しておきますが、質問の「セルの名前で … 保存する」の言葉の意味は、「セルに入っている文字列をブックの名前にする」 と解釈してよいでしょうか。 それとも、「セルに付けられている名前」と解釈すべきでしょうか。
ここでは素直に、前者として回答を進めます。
それと「シートを保存する」とあるのは、「ブックを保存」と解釈します。

ブックを保存するマクロは、
[Macro] - [ブックシート] のページに 「ブックを保存する、閉じる」 として掲載されていますが、関係部分を次に抜き出しておきます。
Sub アクティブブックを名前を付けて保存する()
    ActiveWorkbook.SaveAs "BBB.xls"             '※1
End Sub
このマクロの "BBB.xls" の部分を変数におきかえると、次のとおりです。
    ActiveWorkbook.SaveAs ブック名
セルの値を取り出すマクロは、 [Macro] - [値の出入・基本型] のページに 「セルの値を取り出す」 として掲載されていますが、関係部分を次に抜き出しておきます。
Sub アクティブシートのセルの値を取り出す()
    Windows("BBB.xls").Activate                 'ブックをアクティブにする ※1
    Sheets("SSS").Select                        'シートを選択する ※2
        年 = Cells(2, 1)                        'A2セルの値を取り出す ※3
        月 = Cells(2, 2)                        'B2      〃          ※3
        日 = Cells(2, 3)                        'C2      〃          ※3
End Sub
このマクロを見習って次の 1行目のように作り、上のマクロと組み合わせましょう。 名前を取り出すセルは、とりあえず A2セルとして進みます。
    ブック名 = Cells(2, 1)                      'A2セルの値を変数「ブック名」に取り出す
    ActiveWorkbook.SaveAs ブック名              'アクティブブックを名前を付けて保存する

2) 貼り付けるセルを任意に変更する方法

最初に説明した
変数名で範囲指定して選択するには? のページの 「シート名と貼り付け位置を変数で指定する方法」のとおりですが、もう1つ例示しておきます。

次のマクロは、
[Macro] - [コピー] のページに 「クリップボードを経由せずにコピーして貼り付ける」 として掲載されているものです。
Sub クリップボードを経由せずにコピーして貼り付ける()
    Sheets("SSS").Range("A1:C3").Copy _
	destination:=Sheets("SS2").Range("A4") '※1,2,3,4
End Sub
このマクロは、"SSS"シートの A1:C3セル範囲をコピーして 、"SS2"シートの A4セルに貼り付けます。
あなたの希望との相違点は、(1)シート名が違うことと、(2)セルを任意に変更したいことですね。

マクロを次のように修正して、変数「貼り付け範囲」に任意のセルを設定すれば、よいでしょう。
Sub クリップボードを経由せずにコピーして貼り付ける()
    コピー範囲 = "A1:C3"
    貼り付け範囲 = "A4"
    Sheets("Sheet1").Range(コピー範囲).Copy _
	destination:=Sheets("Sheet2").Range(貼り付け範囲)
End Sub

 

Excel VBA Macro