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

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Activesheet

ここまで作りました。

管理台帳を開き、
別ファイルにコピーし
管理台帳は閉じる、というところで、
実行するとエラーとなり、
デバッグをクリックしたら、管理台帳を閉じるコードが黄色くなります。

()の中の”を消してもダメでした。
配列数が大きい時と存在しない名前を指定した時になるとのことですが、、
Set〜のコードは、取得できていないのでしょうか?

質問者からの補足コメント

  • ネットでは、workbook(book1).Close〜
    もしくはworkbook(”book1.xls”)など
    カッコの中の書き方が人それぞれですが、
    それでも動いてるようですし、どれでもいいんでしょうか?

      補足日時:2016/10/19 09:55

A 回答 (2件)

こんにちは



>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用いますし、workbooks(book1).Closeの場合は、book1が文字列変数等であると考えられます。
例えば
 book1 = ”book1.xls”
 workbooks(book1).Close
で、一行目と同じ意味になりますよね。

変数とその意味するところを理解して使い分けることが必要です。
というか、意味を決めているのはそのコードを作成している質問者様なのですが。
    • good
    • 0

変数名を「book1」などとするから混乱するのですよ。


例えば「objBook」とすればイメージが掴みやすくなりませんか?

Dim objBook As Workbook
Set objBook = Activeworkbook
・・・
objBook.Close SaveChanges:=False

> カッコの中の書き方が人それぞれですが、

人それぞれではなく、カッコの中が何を表しているかによります。


◆ネットでは、workbook(book1).Close〜 '正しくは Workbooks ですよ
この場合 book1 は ワークブック名を表す文字列です。

Dim strBook As String

strBook = "管理台帳.xlsx"
・・・
Workbooks(strBook).Close.SaveChanges:=False

◆もしくはworkbook(”book1.xls”)など
これは上記の 変数を使わず、ダイレクトに文字列で指定したケースですね。

Workbooks("管理台帳.xlsx").Close.SaveChanges:=False

クローズするのは Workbook オブジェクトですから、
単体の Workbook オブジェクトを取得するいずれかの書き方をすれば良いのです。

【参考】
Workbook オブジェクト (Excel)
https://msdn.microsoft.com/ja-jp/library/office/ …
    • good
    • 0

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