プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。よろしくお願いいたします。

Excel 2003で複数のワークブック、ワークシートを以下の方法以外に簡素にActivateする方法ありませんでしょうか?

Workbooks("ほげ.xls").Activate
Worksheets("ほげほげ").Activate

複数の違うワークブック、ワークシートを何度も処理の途中でActivateする為、Workbooksと、Worksheetsを変数に格納し、変数.Activateのような事ができないかと考えているですが、方法がわかりません。

よろしくお願いいたします。

A 回答 (3件)

こんにちは。



>複数のワークブック、ワークシートを以下の方法以外に
どういうコードを書いているのか分かりませんが、あまり、そういう方向に考えないほうがよいと思います。

すでに開いているものなら、
Set wb = Workbooks("ほげ.xls")
Set sh1 = wb.Worksheets("ほげほげ")
Set sh2 = wb.Worksheets("ほげほげほげ")
sh1.Activate
sh2.Activate

で済みますが、数多くあるものなら、こういうのは面倒です。最初に、ブックをオブジェクト変数に入れておけば、そのままActivate できるはずです。

'-------------------------------------------

Dim org_wb As Workbook
Dim dest_wb As Workbook
Dim i As Integer
Set org_wb = Workbooks("TEST_A.xls")
Set dest_wb = Workbooks("TEST_B.xls")

For i = 1 To 3
 org_wb.Worksheets("Sheet" & i).Activate
 dest_wb.Worksheets("Sheet" & i).Activate
Next i

Set org_wb = Nothing
Set dest_wb = Nothing

'-------------------------------------------
しかし、実際のマクロコードでは、このようなActivate やSelect を使うことは、まずありえません。そのまま値は取得できるので、そのまま、コンテナで取得すればよいです。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

ファイル自体はそこまで数はないのですが、シートが多い為、以下の方法を使用させていただきました。

Set wb = Workbooks("ほげ.xls")
Set sh1 = wb.Worksheets("ほげほげ")
Set sh2 = wb.Worksheets("ほげほげほげ")
sh1.Activate
sh2.Activate

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

お礼日時:2009/07/20 15:37

こういう説明で判るのではないですか。


Sheet1とheet2,Sheet3,Sheet5というシートが現にあります。
Sheet2  のA1 aaa
Sheet3  のA1 bbb
Sheet5  のA1 ccc
のデータが入っています(内容は何でも良い)。
ーー
Sub test01()
Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
s = Array("Sheet2", "Sheet3", "Sheet5")
For i = 0 To 3 - 1
Set sh2 = Worksheets(s(i))
sh1.Cells(i + 1, "A") = sh2.Cells(1, "A")
Set sh2 = Nothing
Next i
End Sub
ーーー
実行するとSheet1の
A1 aaa
A2 bbb
A3 ccc
となります。
ーーー
一度もActivateは使っていません。
実はSheet4がありますが、ここをActivateして実行してもOKです。
ーー
ブックの場合もブック指定の部分が前に引っ付くだけです。
CurDirの中にあるブックなら、記述が簡単でしょう。
まずSet sh2 = Worksheets(s(i))のところを他ブックならどうなるかやってみてください。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

参考にさせていただきます

お礼日時:2009/07/19 17:14

下記のような感じでしょうか?


適当なプログラムに共通する処理を纏めてしまえば良いでしょう。
今回の場合、Call Job で呼び出し。

Sub test()

Dim WB As Variant
Dim WS As Variant
Dim i As Integer

WB = Array("hoge1.xls", "hoge2.xls")
WS = Array("sheet1", "sheet2")

For i = lbounb(WB) To UBound(WB)
Workbooks(WB(i)).Activate
Worksheets(WS(i)).Activate

Call Job
Next

End Sub

----------------------------------------------------------
Array関数で一度に値を格納する
http://www.officepro.jp/excelvba/array/index6.html
    • good
    • 0
この回答へのお礼

Arrayを使えばよかったのですね。

ありがとうございます。

For文で得に連続して開く事は考えていなかったのですが、大変参考になりました。

以下を試してみると インデックスが有効範囲にありません とエラーが出てしまいます。

Dim WB As Variant
Dim WS As Variant
Dim i As Integer
Dim ii As Integer

Workbooks("ほげ.xls").Activate
Worksheets("ほげほげシート").Activate

hoge = ActiveSheet.Range("A1").Value

WB = Array("お試し.xls", hoge)
WS = Array("Sheet1", "Sheet2")
i = 1
ii = 1
Workbooks(WB(i)).Activate
Worksheets(WS(ii)).Activate

'A1に他エクセルファイル名が絶対パスで入っており、MsgBox (WB(1))でファイル名が取得できているのですが、Activateできません。

よろしくお願いいたします。

お礼日時:2009/07/19 17:12

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