プロが教えるわが家の防犯対策術!

フォルダ内に複数のExcel(全てマクロあり)があります。
一つのもの以外は共通フォームです。
その共通フォームのExcelを開き、一つのExcelに集約したいと思っております。
集約用のExcelにマクロを記載し、いざ実行するとエラーがでました。

それを見ると、集約用のExcel名に˜$とついたものがフォルダ内に自動生成され、こちらが使用中なのでエラーとなったようです。

どうすれば回避できるでしょうか?
現状はこのような感じです。

Dim filename As String
Dim openedbook As Workbook
Dim isbookopen As Boolean

filename = Dir(ThisWorkbook.Path & "\*.xls*")



Do While filename <> ""
If filename <> ThisWorkbook.Name Then
isbookopen = False
For Each openedbook In Workbooks
If openedbook.Name = filename Then
isbookopen = True
Exit For
End If
Next

If isbookopen = False Then
Workbooks.Open (filename)
End If
End If
filename = Dir()
Loop

A 回答 (2件)

こんにちは。



 Workbooks.Open (filename)
これは、あやふやなコードですね。これで、開ける確率は、半々というところでしょうか?
ステップモードとローカルウィンドウで追いかけてみれば、一目瞭然のはずです。

もちろん、
>集約用のExcel名に?$とついたものがフォルダ内に自動生成され、こちらが使用中なのでエラーとなったようです。
#1様の言うとおりで、それは、ありえませんね。

>一つのもの以外は共通フォームです。
意味は分かります。同じ表の形式で作られたファイルという意味ですね。

ところで、私がマクロを書く時、Dir 関数って、意外にデリケートな部分があって、あまりお膳立てが過ぎると、おかしくなってしまうような気がします。それで、マクロにする時は、最初に、Dir 関数で全部ファイル名を取っておいて、配列変数に格納してから処理するという方法を取ることが多いです。今回は問題なかったようですが。


少し、洒落た書き方をさせてもらいます。

'//
Sub OpenOrNotFiles()
 Dim FName As String
 Dim myPath As String
 Dim myFno As Integer
 Dim iflg As Integer
 myPath = ThisWorkbook.Path & "\"
 
 FName = Dir(ThisWorkbook.Path & "\*.xls*", vbNormal) '←一応念のため
 Do While FName <> ""
  If Dir(myPath & FName) <> "" Then
   myFno = FreeFile()
   On Error Resume Next
   Open myPath & FName For Binary Lock Read Write As #myFno
   iflg = Err()
   Close #myFno
  End If
   If iflg = 0 Then
    Workbooks.Open (myPath & FName) '←こうなります。
    ''Debug.Print myPath & FName
   End If
    FName = Dir
  Loop
End Sub
'///
    • good
    • 0
この回答へのお礼

ありがとうございます。
ここまで丁寧にお教え頂けるとは思っていませんでした。

大変参考になりました!

お礼日時:2015/07/18 14:42

filename = Dir(ThisWorkbook.Path & "\*.xls*")



filename = Dir(ThisWorkbook.Path & "\*.xls*",vbhidden)
としなければ、~$Book1.xlsなどは取得できないハズです。
~$…は隠しファイル属性がつきますので
filename = Dir(ThisWorkbook.Path & "\*.xls*")
では処理対象外ですので~$…が問題になるとは考えにくいです。

別の所に問題がありそうです。
エラーコード、エラーメッセージ、
途中で止まるのならその行を提示してみてください。

PS.
一つのもの以外は共通フォームです。
これは何?
    • good
    • 0
この回答へのお礼

お礼が遅くなり、恐縮です。
もう少し確認してから再度、質問したいと思います。

お礼日時:2015/07/18 14:40

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