dポイントプレゼントキャンペーン実施中!

下記のコードを実行するとSheet1という名前のシートがないBookを開いた場合、「統合元ファイル○○のSheet1を開けません」という警告がでます。
無ければ集計しなくていいので「はい」を押せばいいのですが、その都度止まってしまうのは困ります。
Application.DisplayAlerts = False としても警告されるのはなぜでしょうか?出ないようにすることは出来ないのでしょうか?

Sub test03() 'Sheet1のみ開かずに統合
Dim MyFile As String, MyPath As String
Dim SumFile() As Variant, i As Long
MyPath = ThisWorkbook.Path & "\"
MyFile = Dir(MyPath & "*.xls", vbNormal)
Do Until MyFile = ""
If MyFile <> ThisWorkbook.Name Then
ReDim Preserve SumFile(i)
Application.DisplayAlerts = False
SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" 'A1からB10のLinkを変数に代入
Application.DisplayAlerts = True
i = i + 1
End If
MyFile = Dir
Loop
If i = 0 Then MsgBox "データが有りません ( ̄□ ̄;)!!": Exit Sub
Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile()
End Sub

A 回答 (5件)

横から失礼します。



> ブックをOpenせずにSheet1の存在確認をする方法はありますか?

これをヒントに関数化してみて下さい。

Sub Sample()

  ' ExecuteExcel4Macro メソッドを使う方法
  ' ダミーアクセスしてエラーになったらシートは無い
  
  Dim strQry As String
  Dim Dummy As Variant
    
  strQry = "'C:\[test.xls]Sheet1'!R1C1"
  Dummy = Application.ExecuteExcel4Macro(strQry)
  If IsError(Dummy) Then
    MsgBox "Sheet1 は無い"
  Else
    MsgBox "Sheet1 が在る"
  End If

End Sub
    • good
    • 1
この回答へのお礼

すごい!
Application.ExecuteExcel4Macroが何なのかはぜんぜんわかりませんが、下記のようにしたらAlertを消さなくともOKです!ありがとうございました。

Sub test04() 'Bookを開かずSheet1だけを統合
Dim MyFile As String, MyPath As String
Dim SumFile() As Variant, i As Long
Dim strQry As String
Dim Dummy As Variant

MyPath = ThisWorkbook.Path & "\"
MyFile = Dir(MyPath & "*.xls", vbNormal)
Do Until MyFile = ""
If MyFile <> ThisWorkbook.Name Then
strQry = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1"
Dummy = Application.ExecuteExcel4Macro(strQry) 'ダミーアクセスしてエラーにならなければSheet1あり
If Not IsError(Dummy) Then
ReDim Preserve SumFile(i)
SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" 'A1からB10のLinkを変数に代入
i = i + 1
End If
End If
MyFile = Dir
Loop
If i = 0 Then MsgBox "データが有りません ( ̄□ ̄;)!!": Exit Sub
Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile()
End Sub

お礼日時:2006/06/14 14:07

別の質問みたいになりましたが、ついでなので。



汎用的に使えるように関数にすると、こんな感じ。ブックは開いていても、
閉じていても問題ありません。

Sub Sample2()
  
  If ExistSheet("C:\test.xls", "Sheet1") Then
    MsgBox "Sheet1 あり"
  Else
    MsgBox "Sheet1 が無いか、パスが違うか"
  End If

End Sub

' フルパスで渡されたブックのシート存在チェック(開かれているか? ではない)
’シートがあれば True を返す

Function ExistSheet( _
  ByVal strXLSFullName As String, _
  ByVal strXLSSheetName As String) As Boolean
  
  Dim strDir   As String
  Dim strFilename As String
  Dim strQry   As String
  Dim Dummy    As Variant
  
  On Error GoTo ERROR_HANDLER
  
  ' ディレクトリー切り出し(最後の\マークを含める)
  strDir = Left$(strXLSFullName, InStrRev(strXLSFullName, "\"))
  ' ファイル名切り出し
  strFilename = Dir(strXLSFullName)
  
  ' 問い合わせ文字列生成
  strQry = "'" & strDir & "[" & strFilename & "]" & strXLSSheetName & "'!R1C1"
  ' ダミーアクセスでエラー値が返れば、シートは無い
  Dummy = Application.ExecuteExcel4Macro(strQry)
  
  ' IsError 関数の戻り値を反転させて Return
  ExistSheet = Not IsError(Dummy)
  Exit Function
  
ERROR_HANDLER:
End Function
    • good
    • 0
この回答へのお礼

KenKen_SPさまには、コードの誤りをご指摘いただいたばかりか、汎用でのSheet1の存在確認方法までご教示いただき感謝感激です。
いつもありがとうございます。とても勉強になりました。

お礼日時:2006/06/14 15:50

ブックを開いてないのに「Sheet1」にアクセスしているため、エラーが出てますよね。



>ブックをOpenせずにSheet1の存在確認をする方法はありますか?
無いと思います。たぶん...

>Openし、シート名をLoopしてSheet1かどうかを判断する方法ならわかるのですが
これでいきましょう。
    • good
    • 0
この回答へのお礼

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

>> Openし、シート名をLoopしてSheet1かどうかを判断する方法ならわかるのですが
> これでいきましょう。

件数が多いのでそれではかなりロスがでるんですよねえ。
でも一件落着しました。

お礼日時:2006/06/14 13:54

ざっと見た限りですが、、



SumFile() は Dim SumFile() as Variant と宣言されていますので、単なる
Variant型の変数です。

そこに文字列を代入しているだけですから、この時点ではエラーというか、
アラートが表示されることは無いと思います。

もし、表示されるとしたら、

> Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile()

の Consolidate メソッド実行時ですね。したがって、

  Application.DisplayAlerts = False
  Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile()
  Application.DisplayAlerts = True

としたら、どうでしょうか?

> Sub test03() 'Sheet1のみ開かずに統合

言葉どおり、Sheet1 のみ統合させないなら、ブックを開いて Worksheets
コレクションを For each でループさせ、シート名ではじけば良いのでは?

Set wb = Workbooks.Open(MyPath & "\" & MyFile, UpdateLinks:=0)
For Each sh In wb.Worksheets
  If sh.Name <> "Sheet1" Then
    ReDim Preserve SumFile(i)
    SumFile(i) = "'" & MyPath & "[" & MyFile & "]" & sh.Name & "'!R1C1:R10C2"
    i = i + 1
  End If
Next
wb.Close SaveChanges:=False
    • good
    • 0
この回答へのお礼

またまたお世話様でぇす! (≡^∇^≡)

そうかあ!Consolidate メソッド実行時の警告なんですねえ。
わかりました。解決しました!
ありがとうございました。

'Sheet1のみ開かずに統合は「ブックを開かずSheet1だけを統合」のつもりでしたが、悪い日本語の代表例になってましたね。すみません。

お礼日時:2006/06/14 13:50

On Error Resume Next


しておくか、
存在確認をあらかじめするようにしたらどうでしょう。

>Application.DisplayAlerts = False としても警告されるのはなぜでしょうか?
ヘルプによると、特定のメッセージとあるので全ての警告ではないのでしょう
    • good
    • 0
この回答へのお礼

さっそくありがとうございます。
On Error Resume Nextはもちろん試しました。多分、エラーではなく警告なのでErrorにひっかからないのではないでしょうか?

ブックをOpenせずにSheet1の存在確認をする方法はありますか?
Openし、シート名をLoopしてSheet1かどうかを判断する方法ならわかるのですが・・・・。

お礼日時:2006/06/14 13:08

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

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


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