下記のコードが型一致しませんというエラーを出していますが、初心者なので原因はあまり分かっていません。


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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2018/07/21 22:39:47
  • 終了:2018/07/28 22:40:05

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4784ベストアンサー獲得回数20572018/07/22 00:07:51

If fileName(1) <> "False" Then

↓ こんな感じのはず。

If fileName <> False Then
他1件のコメントを見る
id:a-kuma3

(1) も外しました?
# 最初に回答で投稿したの、間違ってます(すみません

2018/07/22 00:29:25
id:muhiddineagle

a-kuma3さん、回答ありがとうございました。(1)を外してもやはり同じエラーが出ていました。別の方法をでやろうかなと思います。GetOpenFileName()の戻り値をString してやっていました。しかし、複数ファイル選択できるのまかできていません。もう一度ありがとうございました。

2018/07/22 17:53:38
id:Z1000S No.2

空腹おやじ回答回数37ベストアンサー獲得回数252018/07/22 07:26:35

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にする必要があるのかよくわからないので
一部勝手にアレンジしてあります。
不明な点、要望等あれば、レスください。
可能な範囲で解説、回答します。

ダイアログで複数のファイルを選択する必要がないのであれば
もう少しシンプルなコードになります。

id:muhiddineagle

Z1000Sさん、丁寧に教えていただきありがとうございました。サンプールコード参考にさせていただきます。これから試してみます。

2018/07/22 17:54:10

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません