出産前後の痔にはご注意!

お世話になっています。

マクロでワークブックを開いてシートを挿入したり
セルの値をコピーしたりしております。

その際、相手側のワークブックが閉じていると処理出来ないため
Workbooks.Open で一旦、開いて処理しています。

その時に相手側のワークブックが既に開かれていた場合に
Workbooks.Open でエラーが出て止まってしまうマクロと、

相手側のワークブックが開いているにも関わらず
Workbooks.Open でエラーが出ずにシートを挿入するなどの処理を
問題なく実行してしまうマクロがあります。

既に相手側のワークブックが開いている場合はエラーが出ないように
対策をしてもいいのですが、開いていてもWorkbooks.Open で
エラーが出ない場合と、開いていたらエラーが出てしまう場合の
違いがわかっているとマクロを作成する時にいろいろ便利です。

もし何か区別があるのでしたら教えて下さい。

すいませんが、詳しい方、説明の上手な方、よろしくお願いします。

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

  • どう思う?

    >校閲→ブックの共有を設定しているファイルは他の方が開いていても
    エラーは出ないと思います。

    これのことですよね。
    チェックは外しております

    「【VBA】ワークブックを開く時にエラーが」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/10 15:04
  • どう思う?

    ママチャリさんへ

    いつもご解答ありがとうございます。
    エラーメッセージの画像です。

    いつものようにコードをアップしてもいいですよ。
    必要でしたら遠慮なくリクエストしてくださいね。

    「【VBA】ワークブックを開く時にエラーが」の補足画像2
    No.3の回答に寄せられた補足コメントです。 補足日時:2017/03/10 18:01

このQ&Aに関連する最新のQ&A

A 回答 (6件)

私の経験則なので、あまりあてにならないのですが・・・。


例えば、Aというブックを開いている状態で、再度、Aを開く場合、先に開いていたAに変更が加えらてているケースではエラーが発生します。何の変更も加えられていない場合は、エラーなしで開きます。
ちなみに、Aブック内のシートに、=NOW()関数などを設定している場合は、それだけでも変更扱いになるので、変更していないつもりでもエラーになってしまいます。
    • good
    • 1
この回答へのお礼

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

>例えば、Aというブックを開いている状態で、再度、Aを開く場合、先に開いていたAに変更が加えらてているケースではエラーが発生します。何の変更も加えられていない場合は、エラーなしで開きます。

初めて知りました。

で、、、よく似たことを確認してみると、、、。
確かにエラーの出るワークブックだけ保存の設定が違います。

他のワークブックは変更しないで閉じるときには「変更を保存しますか?」と聞いてきません。
ですが、このワークブックだけは全く変更していない場合でも「変更を保存しますか?」と聞いてきます。

ファイル、オプション、保存の設定で
「このブックの自動回復を行わない」以外、チェックを外してみたのですが、
閉じるときに「変更を保存しますか?」と聞いてきます。

具体的な原因はわかりませんが、多分、ママチャリさんのおっしゃるとおり、
何か自動で更新しているんだと思います。
※=NOW()関数などは設定していませんが。

「区別して利用する」というレベルまで至りませんが、
ママチャリさんのご解答のおかげで、
1つ疑問が解けました。

いつもご解答頂きありがとうございます。
機会がありましたらまたお願いします。

※他の方の意見も聞いてみたいので、質問はしばらく開けておきます。

お礼日時:2017/03/10 22:18

コードを見ないと何とも言えませんが、原因の90%は指定シートが無い場合。


openした後、Worksheetで指定しているシート名がopenしたブックに無い時に発生します。
    • good
    • 0
この回答へのお礼

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

コードを記載しても良いのですが、、、。
その前にアドバイスして頂いたことに対して
確認させて頂きますね。

原因の90%は指定シートが無い場合。
openした後、Worksheetで指定しているシート名がopenしたブックに無い時に発生します。

ここでいう「Worksheetで指定しているシート名」というのは
beforの時に(特定のワークシートの前に挿入する)や
after(特定のワークシートの後に挿入する)の時に使う
ワークシート名のことですよね?

このシートはちゃんと存在します。
それが証拠にワークブックが閉じている時は普通に実行できますよ。

No.5さんへのお礼にも書いたとおり、
No.3さんからのご解答と、そのお礼を読んで頂けると
詳細を理解して頂けると思います。

No.4さんからのご解答とお礼でだいたい解決しておりますが、
何かありましたら、またお願いします。今回はご解答ありがとうございます。

お礼日時:2017/03/11 08:43

> その際、相手側のワークブックが閉じていると処理出来ないため


> Workbooks.Open で一旦、開いて処理しています。
> その時に相手側のワークブックが既に開かれていた場合に
> Workbooks.Open でエラーが出て止まってしまうマクロと、

「相手側のワークブックが既に開かれていた」というのは自身のExcelによって既に開かれていた、という意味ですよね? その前提ですすめますが

私も他のブックにアクセスするマクロを書いていますが
こういった場合、相手のワークブックが開いているか(WorkBooks内に存在するか)を確認して
開いていなかったら、Workbooks.Open とするのではないでしょうか?

そうすれば仰るような問題は発生しないと思うのですが。。。
    • good
    • 0
この回答へのお礼

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

>私も他のブックにアクセスするマクロを書いていますが
こういった場合、相手のワークブックが開いているか(WorkBooks内に存在するか)を確認して
開いていなかったら、Workbooks.Open とするのではないでしょうか?

おっしゃるとおりです。
通常はご指摘の通りワークシートを開いているかの確認をしてから
ワークシートを開きにいっています。

ですが、、、後日、最初にテストとして作成したマクロ
(先にワークブックが開かれていた時のエラー対策なし)の動作を
再確認したところ、No3.ママチャリさんへのお礼に記載したとおり、

なぜか4個あるうちの3個ワークブックが開いているにも関わらず
Workbooks.Open を無視してその後の処理を実行します。

なので不思議に思い、ワークシートが開いていた場合でも
Workbooks.Open のエラーを無視してその後の処理を行えるような
条件があるのではと思い、今回こちらで質問させて頂きました。

お手数でなければ、No.3さんの質問へのお礼も読んで頂ければ
詳細がわかると思います。

こんな感じです。何かお心当たりがありましたら
再度ご解答頂けるとうれしいです。
今回はご解答ありがとうございます。機会がありましたらまたお願いします。


追記
>「相手側のワークブックが既に開かれていた」というのは自身のExcelによって既に開かれていた、という意味ですよね? その前提ですすめますが

そのとおりです。

お礼日時:2017/03/11 08:14

エラーが出るケースがあるとのことですが、その時に表示されるエラーメッセージって何ですか?

この回答への補足あり
    • good
    • 1
この回答へのお礼

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

エラーメッセージは以下の通りです。
※補足に画像も貼り付けておきます。

「ファイル名」は既に開いています。2重に開くと、これまでの変更内容は破棄されます。
「ファイル名」を開きますか?

いいえ

実行エラー'1004'
'Open'メソッドは失敗しました:'Workbooks'オブジェクト

詳細
マクロの機能ですが Workbooks.Open  を利用して
4つのワークブックを開いてシートをコピー(挿入)するというマクロです。

この際、3個のワークブックに関しては
ワークブックが開いていようが、閉じていようが関係ありません。
ワークシートを挿入して処理を完了します。
(ワークシートの挿入、セーブ、相手側のワークブックを閉じる)

ところが、どういうわけか1つのワークブックだけが前述の
症状で止まります。
※止まる方が正常だと思うのですが、、、。

再三触れているとおり、ワークブックが開いていた時のエラー対策を
施してもいいのですが、可能なら他の3個のワークブックのように
開いていても書き込みが出来れば便利だと思っています。

という感じです。

いつもご解答ありがとうございます。
続きがありましたら、よろしくお願いします。

お礼日時:2017/03/10 17:51

参照先が外部ワークブックの場合に起こる。



そのエクセルが立ち上がっていたらエラーにならず、立ち上がっていないならエラー。
    • good
    • 1
この回答へのお礼

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

こちらの知識不足で申し訳ないですが、
ご解答の意味がよくわかりませんでした。
順番にいきますね。

1)
>参照先が外部ワークブックの場合に起こる。

外部ワークブックというのは、
No1さんのいうネットワーク上のワークブックと
ローカルPCの中のワークブックということでしょうか?

2)
そのエクセルが立ち上がっていたらエラーにならず、立ち上がっていないならエラー。

ということですが立ち上がっていたらエラーにならないのでしょうか?

Workbooks.Open はワークブックを開くための操作なので、
立ち上がっていたらエラーで、立ち上がっていない場合は
通常はエラーが起こらないです。

今回の質問のケースはマクロによってはどっちでもいい
(立ち上がっていても、立ち上がっていなくてもエラーがでない)
というものがあり、何か区別があるのか?ということです。

実際、立ち上がっていた時のエラー対策をほどこせば
問題ないのですが、最初の質問のとおり区別があるのでしたら
マクロを作成する時に便利なので活用しようと思いました。

という感じです。今回はご解答ありがとうございます。
こんな感じですが、何かご存じでしたら、引き続き
ご解答頂けると嬉しいです。
※続きがない場合はスルーでOKです。

お礼日時:2017/03/10 16:27

>相手側のワークブック


これが自分のPCだけのファイルならこういう記述はしない
だろうという想定で(でもローカルネット上のとか示しておいて
ほしいですが)。
校閲→ブックの共有を設定しているファイルは他の方が開いていても
エラーは出ないと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

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

順番にいきますね。

1)
>校閲→ブックの共有を設定しているファイルは他の方が開いていても
エラーは出ないと思います。

校閲、ブックの共有、編集タグ、
複数のユーザーによる同時編集と、ブックの結合を許可する

のことだと思いますが、複数ユーザーの設定のチェックは外してます。

※相手側のワークブックにもマクロが入っております。
この機能はマクロのあるワークブックでは機能しませんので。
※エクセルのバージョンはEXCEL2010です
※補足のところに画像をアップしておきます。

2)
>これが自分のPCだけのファイルならこういう記述はしない
だろうという想定で(でもローカルネット上のとか示しておいて
ほしいですが)。

おっしゃる通りワークブックは全て
ローカルネットワーク上のNASの中に入っています。

これって関係あるんでしょうか?

という感じです。

続きがあるようですので、ご面倒でなければ続きのご解答を頂ければ嬉しいです。
今回はご解答ありがとうございます。

お礼日時:2017/03/10 15:02

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAでのファイル読込エラーの対応方法

VBAについては、かなり素人です。
エクセルのメインシートからバックグラウンドで任意のファイルを次のようなVBAで読み込んでいます。
次の場合では、存在しないファイル名等をセットすると「ファイル読込エラー」になります。「存在しないファイルが指定されています」等を表示し、Open命令では、ストップしないようにするには、どう記述すればいか教示願います。

PathName:任意のパス名
  CarentFile:任意のファイル名 
Application.ScreenUpdating = False
Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)

Aベストアンサー

Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)
の上下に、以下のように書き込んで下さい。


On Error Resume Next 'エラーがあっても続行する

Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)

If Err.Number <> 0 Then 'エラーがあったら実行する
  MsgBox Error(Err.Number) 'エラー番号に相当するメッセージを表示
  Exit Sub 'マクロの実行を終了する
End If

Qworkbooks.open 開けないファイルの対処法は?

Dirでファイルの存在を確認しworkbooks.openで次々と開き、望みの処理をして次に移る操作をしてます。ファイルが大量にあるので、何らかの理由で開けない事がたまにあり、処理が中断してしまいます。。その時、処理を止めずさっさと次に移るにはどうすればいいでしょうか?

要はファイルを開く際のエラー判定方法を知りたいのです。

Aベストアンサー

エラーをトラップするには、On Errorステートメントを使います。
On Errorステートメント自体は、何かをする命令ではないのですが、
これ以降に発生したエラーに対しての動作が定義できます。
通常、Workbook.Open でエラーが発生すると、そこでプログラムの
動作は停止しますが、次のようなコードにすると動作は停止せず、
行ラベル「ErrorHandler」へ制御が飛びます。

On Error GoTo ErrorHandler
Workbook.Open~  '←ここでエラーが発生すると
On Error GoTo 0
  ・
  ・
  ・
Exit Sub
ErrorHandler:  '←ここへ制御が移ります
  ・
  ・
End Sub
 
OverTheGalaxyさんが書いたプログラムの構造が分からないので、何とも言えないのですが、
きれいに構造化されていれば、Subプロシージャを抜けるだけで対応できるかもしれません。

ちなみに、On Error で定義した動作は、すべてのエラーで有効になってしまいます。
デバッグ中のプログラムは、色々なところでエラーを起こすものですが、その場合も
動作は停止しません。(おかしな動作をするだけで、エラーの発生箇所が分からない状況になります)
エラーの発生が予想される箇所(今回の場合は、Workbook.Open)を過ぎたら、速やかに
エラートラップを無効にすることをお勧めします。
エラートラップを無効にするには、「On Error GoTo 0」を使います。

エラーをトラップするには、On Errorステートメントを使います。
On Errorステートメント自体は、何かをする命令ではないのですが、
これ以降に発生したエラーに対しての動作が定義できます。
通常、Workbook.Open でエラーが発生すると、そこでプログラムの
動作は停止しますが、次のようなコードにすると動作は停止せず、
行ラベル「ErrorHandler」へ制御が飛びます。

On Error GoTo ErrorHandler
Workbook.Open~  '←ここでエラーが発生すると
On Error GoTo 0
  ・
  ・
  ・
Exit Sub
ErrorHandler...続きを読む

Qエクセルファイルが開けない

こんにちわ。
今回、困難にぶち当たったのでご質問させて頂きます。

VB(正確にはACCESSのVBAですが)から、複数のエクセルファイルを順番に開き、中のセルをクリアする処理をしています。
ソースを下記に記載させて頂きます。

Private Sub Excel_Delete(sXlsFile As String)
Dim sXls As Workbook

Set sXls = excel.Workbooks.Open(sXlsFile, 0)
sXls.Sheets(1).Range("I7:AM3005").ClearContents
sXls.Saved = True
sXls.Save
sXls.Close
Set sxlx = Nothing
End Sub

今まで問題なく動作していたのですが、ある日、
Set sXls = excel.Workbooks.Open(sXlsFile, 0)
の部分でエラーが出ました。
↓エラー内容は下記の通りです。
実行時エラー-2147417851(80010105)
openメソッドは失敗しました ’Workbooks’オブジェクト

開くエクセルファイルは、フォルダから列挙して取得していますので、
ちゃんと存在しています。
しかも、エラーが起きるファイルは同じファイルではなく、エラーが起きない時もあります。
列挙するエクセルファイルは、日に日に増えていっていて、現在では500個
近くになっています。
数が増えてきたのが原因でしょうか?
それとも、何か根本的な間違いがあるのでしょうか。
何かわかる方がいらっしゃいましたら、よろしくお願いします。

こんにちわ。
今回、困難にぶち当たったのでご質問させて頂きます。

VB(正確にはACCESSのVBAですが)から、複数のエクセルファイルを順番に開き、中のセルをクリアする処理をしています。
ソースを下記に記載させて頂きます。

Private Sub Excel_Delete(sXlsFile As String)
Dim sXls As Workbook

Set sXls = excel.Workbooks.Open(sXlsFile, 0)
sXls.Sheets(1).Range("I7:AM3005").ClearContents
sXls.Saved = True
sXls.Save
sXls.Close
Set sxlx = N...続きを読む

Aベストアンサー

Excel のブックを開く前に、Excel のアプリケーションを起動させなきゃダメです。

Dim xlApp As Excel.Application
' Excel を起動
xlApp = New Excel.Application
' Excel を表示(表示させない場合はいらない行です)
xlApp.Visible = True

Dim xlBook As Excel.Workbook
Set xlBook = xlApp.Workbooks.Open(パス)
最後に・・・
xlApp.Quit

です。
だから質問文にあるようなプロシージャでプロシージャ内で Excel アプリケーションを開いたり閉じたりする処理を書いちゃうと、1つのブックを処理するたびに Excel を起動して終了してってなっちゃいますから、その上位で Excel アプリケーションを管理したほうが忙しくないです。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QエクセルVBAが途中で止まります

以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。
下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。
で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。
自宅で別データを作ってやってみるとうまくいきました。
コピー元のブックにはテキストデータのみで、200文字から500文字程度の大きさしかありません。
ファイル名も50文字程度の物を全部20文字程度まで短くしてもみましたが、ダメでした。
どうかお知恵をお貸しください。

Sub ★1★ブックの結合()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook, aWB As Workbook
Dim dSheetCount As Long
Dim i As Long
Dim SOURCE_DIR As String

'エクセルデータに変換されたファイルのあるフォルダを選択します。
MsgBox "エクセルに変換されたデータのフォルダを選択"
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
SOURCE_DIR = .SelectedItems(1) & "\"
End If
End With

Application.ScreenUpdating = False

'指定したフォルダ内にあるブックのファイル名を取得
sFile = Dir(SOURCE_DIR & "*.xls")

'フォルダ内にブックが無ければ終了
If sFile = "" Then Exit Sub

'集約用ブックを作成
Set dWB = Workbooks.Add

'転記マクロの中のDMリストシートをコピーする
Workbooks("転記用マクロ.xlsm").Worksheets("DMリスト").Copy Before:=dWB.Worksheets("Sheet1")
Application.DisplayAlerts = False
Worksheets(Array("Sheet1", "sheet2", "sheet3")).Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True

'集約用ブック作成時のシート数を取得
dSheetCount = dWB.Worksheets.Count

Do
'コピー元のブックを開く
Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)

'コピー元のsheet1を集約用ブックにコピー
sWB.Worksheets("sheet1").Copy After:=dWB.Worksheets(dWB.Sheets.Count)

シート転記

'コピー元ファイルを閉じる
Application.DisplayAlerts = False
sWB.Close
Application.DisplayAlerts = True

'セルA2の名前を変更する


'シート名をセルA2の値に変更
'ActiveSheet.Name = Range("A2").Value


'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""

'集約用ブックを保存する
'dWB.SaveAs Filename:=DEST_FILE


Application.ScreenUpdating = False


End Sub

以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。
下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。
で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。
自宅で別データを作ってやってみるとうまくいきました。
コピー元のブックにはテキストデータのみで、200文字から500文字...続きを読む

Aベストアンサー

http://oshiete.goo.ne.jp/qa/8750372.html


例えば、30ファイルあっても10ファイルしか読み込まれない事があり、
エラーメッセージもない、何事もなく終了するが10ファイルしか処理されていない、
常に発生する訳ではなく、マシンが変われば同じデータでもOKだったり、
データが少し変わればOKだったりする。
なので、昨日までOKだったのに、今日データが変わった為、急にダメになったりする。
もし、10ファイル目で発生した場合、何度実行しても必ず、10ファイル目までしか処理されない。
そのファイルがおかしいかと思い、その前後の2~3ファイルを削除しても、
やっぱり、10ファイル目(さっきとは違うファイル)までしか処理されない、
という恐ろしいバグがExcel VBAにありますが、それじゃないですかね?

While文などのループの中に、ワークブックのオープンがあると、
何度目かでオープンが実行されず、エラーなしでスルンと終わります。

回避方法は、Open 文の前に DoEvets の1行を書く事。
だいたいこれで直りますが、これで直らなかったマクロもあったので、
Open 文の後ろにも DoEvets の1行を書いて、前後を DoEvets ではさむと直りました。
安全(?)の為、前後をはさんでおいた方が良いと思います。

こんな感じ:
DoEvents
Workbooks.Open aaa
DoEvents

かなり前(1年くらい?)にハマりググりまくったところ、ほとんど情報はなかったですが、
1人だけ、自分の質問に「直った」と自己回答している方がいて、Open文の前にDoEvetsをつけたら直ったそうです。
半信半疑で真似たら私も直りました。
何故、これで直るのかはわかりませんが、DoEvetsを外すと見事に再現し、DoEvetsではさむとピタッと直ります。

ググりまくった際、とても情報が少なく、こんなに顕著に再現するのに、
何故、情報が少ないのかは不思議に思いました。

http://oshiete.goo.ne.jp/qa/8750372.html


例えば、30ファイルあっても10ファイルしか読み込まれない事があり、
エラーメッセージもない、何事もなく終了するが10ファイルしか処理されていない、
常に発生する訳ではなく、マシンが変われば同じデータでもOKだったり、
データが少し変わればOKだったりする。
なので、昨日までOKだったのに、今日データが変わった為、急にダメになったりする。
もし、10ファイル目で発生した場合、何度実行しても必ず、10ファイル目までしか処理されない。
そのファイルがおかし...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QExcelVBAで質問です。Workbook_openイベントが発生し

ExcelVBAで質問です。Workbook_openイベントが発生しない。
Excel2003を開いている状態で「ファイル」→「開く」でファイルを開くと
Workbook_openイベントが発生しません。他のマクロは正常に動くのですが、
Excelを閉じている状態でファイルを開くとWorkbook_openイベントが発生します。
(Workbook_Activateイベントでも同様の結果になりました。)
なぜでしょうか?基本的なことかもしれないですが教えていただけると幸いです。
宜しくお願いします。

Aベストアンサー

『常に』Workbook_openイベントが発生しないのですか?
試しに
Sub test()
  MsgBox Application.EnableEvents
End Sub
こんなマクロを実行してみてください。
イミディエイトウィンドウに
?Application.EnableEvents
と入力してEnter、でも良いです。
これでApplicationのイベント制御状態が判ります。
Falseの場合、イベントを発生させない設定になっています。
他Bookのコードで
Application.EnableEvents = False
と記述している箇所はないですか?

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング