Option Explicit
Sub openFile()
'variables
Dim strFilter As String, title As String
Dim fileName As Variant
Dim wb As Workbook
strFilter = "Excel Files(*.xlsx), *.xlsx"
title = "Select file to import"
fileName = Application.GetOpenFilename(strFilter, 2, title, , True)
If fileName(1) <> "False" Then
For Each wb In Workbooks
If wb.Name = fileName Then
MsgBox "file is already open"
Exit Sub
End If
Next wb
Workbooks.Open fileName
End If
End Sub
Application.GetOpenFilenameのパラメータ
MultiSelect=True
になっているので、
ダイアログで何も選択しない場合には、
If fileName <> False Then
で良いのですが
ひとつでもファイルを選択した場合には
fileNameが配列として返ってくるため、上記比較ではエラーになります。
(Excel2013で確認)
さらに、
ファイルを選択した場合には、
If wb.Name = fileName Then
および
Workbooks.Open fileName
では、fileNameが配列なので、このままではやはりエラーとなります。
なので、以下のようにしてみてはいかがでしょうか?
Sub openFile() Dim strFilter As String, title As String Dim fileName As Variant Dim wb As Workbook Dim isMatched As Boolean Dim i As Long strFilter = "Excel Files(*.xlsx), *.xlsx" title = "Select file to import" fileName = Application.GetOpenFilename(strFilter, 2, title, , True) If IsArray(fileName) Then For i = LBound(fileName) To UBound(fileName) isMatched = False For Each wb In Workbooks If wb.FullName = fileName(i) Then isMatched = True Exit For End If Next wb If isMatched Then MsgBox "file(" & fileName(i) & ") is already open" Else Workbooks.Open fileName(i) End If Next i End If End Sub
元々のコードが、MultiSelectをTrueにする必要があるのかよくわからないので
一部勝手にアレンジしてあります。
不明な点、要望等あれば、レスください。
可能な範囲で解説、回答します。
ダイアログで複数のファイルを選択する必要がないのであれば
もう少しシンプルなコードになります。
Z1000Sさん、丁寧に教えていただきありがとうございました。サンプールコード参考にさせていただきます。これから試してみます。
(1) も外しました?
2018/07/22 00:29:25# 最初に回答で投稿したの、間違ってます(すみません
a-kuma3さん、回答ありがとうございました。(1)を外してもやはり同じエラーが出ていました。別の方法をでやろうかなと思います。GetOpenFileName()の戻り値をString してやっていました。しかし、複数ファイル選択できるのまかできていません。もう一度ありがとうございました。
2018/07/22 17:53:38