GetOpenFilename()で複数ファイル選択ができない、IsArray()でNG

このQ&Aのポイント
  • GetOpenFilename()関数を使用して複数のファイルを選択する方法が不具合となり困っています。IsArray()関数の結果も正常に動作していません。
  • 使用環境はMicrosoft EXCEL 2002 (10.6856.6853)SP3、Microsoft Visual Basic 6.0、Microsoft Windows XP Professional version 2002 Service Pack 3です。
  • 不具合の発生箇所は、取込元ファイルを選択する部分で、IsArray()関数を使って読み込みの成功を確認しています。しかし、この箇所で正常に動作していません。
回答を見る
  • ベストアンサー

◆ GetOpenFilename()で複数ファイル選択ができない、I

◆ GetOpenFilename()で複数ファイル選択ができない、IsArray()でNG。。。   複数選択のやり方をOKWaveで見つけ便利に活用させて頂いていたのですが、  今年になって、機能しなくなり困っています。手が出ない状況です。  ご教示、よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 概要:Debugでみると、IsArray()の結果がfalse(GetOpenFilename不成功)  使用環境:  Microsoft EXCEL 2002 (10.6856.6853)SP3  Microsoft Visual Basic 6.0  Microsoft Windows XP Professional version 2002 Service Pack 3 不具合の発生箇所: 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 <問題のマクロ> Sub メイン() ' ------------------------------------------------------------------- ' -  取込元のファイルを選択してオープン  ' ------------------------------------------------------------------- Dim 取込元ファイル, Work1, Work3 As Variant Dim i As Integer 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 For i = 1 To UBound(取込元ファイル) '配列の上限UBound(データの件数 4件) Workbooks.Open 取込元ファイル(i)   'ファイルオープン Work1 = Dir(取込元ファイル(i)) WORK3 = WORK3 & Work1 & vbCrLf 'MSG表示用(取込んだファイル名一覧)   MsgBox "選択したファイルは " & vbCrLf & WORK3 & " ", vbInformation Next i Else MsgBox "取込元ファイルのオープンを" & vbCrLf & "中止しました", vbExclamation End If End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

質問者が選んだベストアンサー

  • ベストアンサー
  • wkbqp833
  • ベストアンサー率36% (319/886)
回答No.1

OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", MultiSelect:=True) とします くわしくは下記URLにて

参考URL:
http://officetanaka.net/excel/vba/file/file02.htm
wata_a
質問者

お礼

ヒントを頂き、ありがとうございました。お陰様で不具合が解決(解消)しました。 OpenFileName = Application.GetOpenFilename("Excelブック(*.xls),E*.xls", _ , , , True)   と記述をパラメータ直接型にしてみたところ、OKとなりました。   元のマクロ(MultiSelect:=True)を使用しても、なぜか、再現しなくなりました。   シンプルな方の指定(,,,,True)で、様子を見ることにします。 

wata_a
質問者

補足

感謝!! 安心できました。重ねて、御礼申し上げます。  ご回答の意味を取り違えていましたので、追加記載します。 【背景】  『FilterをE*.xlsと記述するのは誤りで、*.xlsに要修正』とのご指摘であったことに、  下記(1)(2)の思い込みがあり、気がつきませんでした。   (1) E*.xlsでも普段は問題なく機能していた。   (2) VBAのヘルプの記述にワイルドカード使用可と記載されていたので、      E*.xls指定で、Eで始まるファイル(Exxxx.xls)を限定表示できると認識。 【現状と今後】  *.xlsとして使用することで解決したようですので、  E*.xlsで不具合が1度再発しましたが、  これ以上の追跡はやめることとします。  THANK YOU.   ーーーーーーーー< VBAのヘルプの記述 >ーーーーーーーーーーーーーー  > FileFilter <  省略可能です。  バリアント型 (Variant) の値を使用します。  ファイルの候補を指定する文字列 (ファイル フィルタ文字列) を指定します。  ファイル フィルタ文字列とワイルドカードのペアを、必要な数だけ指定します。  ファイル フィルタ文字列とワイルドカードはカンマ (,) で区切り、各ペアもカンマで区切って指定します。  各ペアは、[ファイルの種類] ボックスのリストに表示されます。  例えば、テキストとアドインの 2 つのファイル フィルタの指定は次のようになります。   "テキスト ファイル (*.txt),*.txt,アドイン ファイル (*.xla),*.xla"  1 つのファイル フィルタ文字列に複数のワイルドカードを対応させるには、次のように 各ワイルドカードをセミコロン (;) で区切ります。   "Visual Basic ファイル (*.bas;*.txt),*.bas;*.txt"  この引数を省略すると、"すべてのファイル (*.*),*.*" を指定したことになります。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

関連するQ&A

  • ダイアログボックスで複数フォルダの複数ファイルの選択

    ダイアログボックスで複数フォルダの複数ファイルの選択がうまくいきません。 単一フォルダ内からの複数ファイルの選択は機能しているのですが、ダイアログボックスで他のフォルダを選択して他のファイルを選択すると最終的に選択したファイルのみが残り、先に選択した分が累積されません。  OpenFileNameが上書きされるのが原因な気がするのですが配列への累積処理が解りません。 その後の処理で選択したファイルを全て開いて加工したいので、累積させる方法を知りたいのです。下記コードはLoop処理で行おうとして累積が解らないままのものです。 一度のダイアログ表示で複数フォルダの複数ファイルを選択出来る方法があればそれでもかまいません。どなたか助けては頂けないでしょうか。お願いします。 '**明細の選択(複数同時)** Do BN = Application.InputBox("対象明細書の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2) If BN = False Then '入力なければ GoTo OWARI End If WorkPath = ThisWorkbook.Path & "\明細書一覧" & BN & "月" ChDrive WorkPath ChDir WorkPath OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _ Title:="対象の明細書を選んで下さい。Ctrlキーを押しながら複数ファイルを同時に選択出来ます。", MultiSelect:=True) Rtn = MsgBox("他にも対象ファイルがありますか?", vbYesNo, "選択") If Rtn = vbNo Then Exit Do End If Loop Mypath = ThisWorkbook.Path MyFile = "\請求制御.xls" 'ここにファイル名記入 If IsArray(OpenFileName) Then For i = 1 To UBound(OpenFileName) If OpenFileName(i) = Mypath & MyFile Then MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません" GoTo OWARI End If tmp = tmp & Dir(OpenFileName(i)) & vbCrLf Next MsgBox vbCrLf & tmp & vbCrLf & "の全" & i - 1 & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "

  • 複数のエクセルファイルを順番に開く

    Excel2003、OS WindowsXPを使用し、Visual Basicに関する質問です。 下記マクロを作成したのですが、これですとファイルを複数選択した場合に毎回開く順番がランダムになってしまいます。これをファイル名を参照して順番に開くようにしたいのです。 因みにファイル名は **-***_AAA_日付.xls です。 *には数字が入り、AAAには漢字による名称が入ります。 例)(1)24-002、(2)24-005、(3)24-008といった3つのファイルを開くとします。現在ですと(3)→(1)→(2)のような順番で開きますが、これを(1)→(2)→(3)のようにファイル名の数字をkeyとして順番に開きたいのです。 色々と調べてみたのですが、よく分かりませんでした…。 すみませんが、ご回答の程、宜しくお願い致します。 Opf = ThisWorkbook.Path & "\注文書・請書" ChDrive ThisWorkbook.Path ChDir Opf 'ファイルを開くダイアログを開く vntFileName = _ Application.GetOpenFileName( _ FileFilter:="エクセルファイル(*.xls),*.xls" _ , FilterIndex:=1 _ , Title:="ファイル選択" _ , MultiSelect:=True _ ) 'ファイルが選択されているとき(vntFileNameが配列型)は '選択した全てのファイルをWorkbooks.Openメソッドを使い開く If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Workbooks.Open vntGetFileName Next Else Exit Sub End If

  • GetOpenFilename(MultiSelect)が配列を返さない

    下記のIf行で配列を返したいのですが、うまくいかずに Stopステートメントで止まってしまいます(デバッグ用です)。 特に、下記コードを記述したブックを非表示にし、 ダイアログ内でファイルの場所を変更した時に 配列を返さないようです。 どなたか解決方法をご存知の方がいらっしゃったら、 よろしくお願いいたします。 なお、WindowsXP Pro. SP2、Excel2003 SP2です。 Dim OpenFileName As Variant OpenFileName = Application.GetOpenFilename _ (FileFilter:="dsc,*.dsc,すべてのファイル,*.*", MultiSelect:=True) If IsArray(OpenFileName) Then ・・・コード・・・ ElseIf OpenFileName <> False Then Stop End If

  • EXCEL VBA複数ブックからの貼り付け

    複数のブックにあるデータを一つのシートに繋げるマクロを作っています。 元となるブックのフォーマットは全て一緒の為下記の様なコードを書きました。 Dim OpenFileName As Variant, tmp As String, i As Long '複数のブック巣を選択 OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _ MultiSelect:=True) '名前の取得 If IsArray(OpenFileName) Then For i = 1 To UBound(OpenFileName) tmp = tmp & OpenFileName(i) & vbCrLf Next i MsgBox "選択したファイルは " & vbCrLf & tmp & " ", vbInformation Else MsgBox "キャンセルされました。", vbInformation End If '選択したブックを開く For i = 1 To UBound(OpenFileName) Workbooks.Open OpenFileName(i) Next i '最初のファイルをコピーをし、DataSheetに貼り付ける Workbooks(OpenFileName(1)).Worksheets("元帳").Cells.Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A1") '2個以降のファイルを下に貼り付ける For i = 2 To UBound(OpenFileName) Workbooks(OpenFileName(i)).Worksheets("元帳").Range("A9:V54").Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A65536").End(xlUp) Next i '最初のファイルをコピーをし、DataSheetに貼り付ける Workbooks(OpenFileName(1)).Worksheets("元帳").Cells.Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A1") 上の部分で『インデックスが有効範囲にありません。(Error 9)』の エラーが発生してしまい、困っております。 また、該当箇所をコメントアウトしても『2個目以降のファイルを貼り付ける』の箇所でも同様のエラーが発生してしまいます。 無知な私ですが、宜しくお願い致します。

  • VBAでファイルOPEN ダイアログを使用したいです

    現在、指定したファイルを開くVBAを書いているのですが、 ↓こんなの ----------------------------------------------------------- Dim vntFileName As Variant 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="開けゴマ" _ , MultiSelect:=False _ ) 'ファイルが選択されているときは '選択したファイルをWorkbooks.Openメソッドで開きます If vntFileName <> False Then Workbooks.Open Filename:=vntFileName End If ---------------------------------------------------------------- あらかじめ開くディレクトリを、ネットワーク上のフォルダに指定したいのですが、どこにパスを書いたらいいのか、わかりません。 教えていただけますでしょうか。

  • ダイアログで選択させたファイルの重複防止を教えて下さいませ

    http://okwave.jp/qa4955154.htmlの続きなのですが、 下記コードのようにDo~Loopでダイアログを廻し対象ファイルを選択してもらうのですが、コードの書いてあるBOOKの選択は防止しているのですが、選択済みのファイルを選択してしまうことを下記コード中の '*****同じファイルの選択防止            ←ここを作りたいのです '*****同じファイルの選択防止完了 ここの部分に記入したいのです。 ダブリがあってもそのまま進むのですが、例示コードより先の開いたファイルを閉じる部分でエラー(Do~Loopで閉じてゆくので、既に閉じているものを閉じようとする結果) ダブリ選択は、集計が狂うので防がなければならないのですが、ダイアログ上では無理な気がするので、全て選択後の選択ファイルのコレクションをチェックさせたいのです。 どなたかお助け願えませんでしょうか? Do BN = Application.InputBox("元となる対象明細書一覧の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2) If BN = False Then '入力なければ GoTo OWARI End If WorkPath = ThisWorkbook.Path & "\明細書一覧" & BN & "月" ChDrive WorkPath ChDir WorkPath mySelectFile = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _ Title:="対象の明細書を選んで下さい。Ctrlキーを押しながら複数ファイルを同時に選択出来ます。", MultiSelect:=True) '●●●選択ファイルをCollectionに登録 If IsArray(mySelectFile) Then myGetFiles.Add mySelectFile End If Rtn = MsgBox("他にも対象ファイルがありますか?", vbYesNo, "選択") If Rtn = vbNo Then Exit Do End If Loop '●●●Collectionの展開 If myGetFiles.Count = 0 Then MsgBox "ファイルがひとつも選択されていません!" GoTo OWARI End If Mypath = ThisWorkbook.Path MyFile = "\請求制御.xls" 'ここにファイル名記入 cnt = 0 '●myGetFilesのチェック cnt = 0 For Each OpenFileName In myGetFiles For i = LBound(OpenFileName) To UBound(OpenFileName) cnt = cnt + 1 If OpenFileName(i) = Mypath & MyFile Then MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません" GoTo OWARI End If '*****同じファイルの選択防止              ←ここを作りたいのです '*****同じファイルの選択防止完了 tmp = tmp & Dir(OpenFileName(i)) & vbCrLf Next i Next OpenFileName '●選択したファイルの一覧化及び数量の表示 MsgBox vbCrLf & tmp & vbCrLf & "の全" & cnt & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "

  • GetOpenFilenameメソッド アクセス

    エクセルには GetOpenFilenameメソッドが用意されてるから Debug.Print Application.GetOpenFilename("Microsoft Excelブック,*.xls") のようにしてファイル名を取得できますが アクセスで同じような事がしたい場合、どのメソッドを使えば良いでしょうか? アクセスにGetOpenFilenameメソッドはないようです。

  • エクセルを選択して開き印刷するマクロ

     お世話になっております。 タイトル通りのマクロの作成をしているのですが、行き詰ってしまい質問させていただきました。 説明させていただきますと、、 実行し、複数のエクセルbookを選択し開くとシートを全選択し通常使うプリンタで印刷をする。というマクロなんですが、改善していきたい事がありまして、助言をいただきたく思っております。 1.複数選択して開いても印刷されるのは開いた後アクティブになっているbookのみ。これを全て開いたbook印刷にしたい。 2.現在は通常使うプリンタで印刷するようにしていますが、複数選択し開いた時に始めの1回だけプリンタの設定画面になるようにしたい。 3.開いて印刷し閉じるだけなのにリンクなどが残っており、「保存しますか?」という文章が出るときがありますが、それを聞かれないように保存せずに閉じる。と自動的に実行してくれる。 2と3は、出来ればそうなってほしいという事なので、最重要は1番です。120個のエクセルを(1つあたりの容量は少ない)印刷しなければならないので困っております。一気に120個印刷かけるわけではなく10個位を分けてマクロ実行で印刷しようと思っております。 コードを載せさせて頂きますので、「ココをこう直せば出来るよ」など簡単な事でも結構ですのでアドバイスよろしくお願いいたします。 ----------------------------------------------------------- Sub 複数のファイルを選択して開く_エクセル版() '複数のファイルを選択する例 Dim vntFileName As Variant Dim vntGetFileName As Variant 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="印刷するファイルを選択" _ , MultiSelect:=True _ ) 'ファイルが選択されているとき(vntFileNameが配列型)は '選択した全てのファイルをWorkbooks.Openメソッドを使い開きます。 If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Workbooks.Open vntGetFileName Worksheets.Select 'シート全選択 Next ActiveWindow.SelectedSheets.PrintOut Copies:=1 '通常設定のプリンタで出力 End If ActiveWindow.Close 'ファイルを閉じる End Sub

  • 【VBA】【複数ファイル選択】困っています。

    23歳OLです。 会社でマクロを組みたいと思うのですが、 どうしてもエラーがでて困っています。 ご教示よろしくお願いします。 =========質問============= ▼やりたいこと。 ・複数ファイルを選択(いろんな種類のファイルを取り込みたいです。主にテキストとログとvファイルです) ・取り込んだデータを任意のシートの列に置きたいです。 (たとえば、シート1のA列に最初に~~~って名前がついているファイル。のように。) ・新しいシートを作りたくないです。 (あくまで任意のファイルにペーストする形です。) ・複数ファイルを選択→最初のファイルを開く→ファイルの中身を任意のシートの任意の列に最後までペーストする→ファイルを閉じて次のファイルにという形です。 現在こんな形で出来上がっています。 Sub ReadMultiCSVFiles() ' [[ 変数定義 ]] Dim varFileName As Variant Dim CSVWorkSheet As Worksheet Dim NewWorkSheet As Worksheet Dim SheetName As String ' [[ ファイルパスからファイル名を取得 ]] SheetName = Dir(Filename) ' [[ ファイル名で新しいシート作成 ]] Set NewWorkSheet = CreateWorkSheet(SheetName) ' [[ 複数ファイルパス名を取得 ]] varFileName = Application.GetOpenFilename(FileFilter:="(*.*),*.*", _ Title:="CSVファイルの選択", MultiSelect:=True) ' [[ ファイルパス取得できなかったら ]] If IsArray(varFileName) = False Then Exit Sub End If ' [[ ファイルパス取得できたら ]] For Each Filename In varFileName ' [[ CSVファイルを開く ]] Dim buf As String, n As Long Open varFileName For Input As #1 【ここにエラーが出ます。型が違うと出ます】 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop ' [[ CSVファイルを閉じる(保存無し) ]] ActiveWorkbook.Close SaveChanges:=False Next End Sub ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ' [[ ]] ' [[ ワークシート名を指定したワークシートの作成 ]] ' [[ ]] ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] Function CreateWorkSheet(WorkSheetName As String) As Worksheet ' 変数定義 Dim NewWorkSheet As Worksheet Dim iCheckSameName As Integer ' ワークシートの作成 ' ※一番最後に挿入 Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' 同じ名前ワークシートが無いか確認 iCheckSameName = 0 For Each WS In Sheets If WS.Name = WorkSheetName Then MsgBox "ワークシート名:" + WorkSheetName + " この名前は既に使われています。" iCheckSameName = 1 End If Next '同じ名前のワークシートがなければ If iCheckSameName = 0 Then NewWorkSheet.Name = WorkSheetName Set CreateWorkSheet = NewWorkSheet End If End Function =============================== ※いろんなサイトから切り貼りして試行錯誤してみています。 お力をいただけると嬉しいです。

  • GetOpenFilenameを使用し、複数行のデータを抽出について

    エクセルVBA初心者です。 いろいろ調べましたが、うまくいかずご教授頂ければとお聞きします。 よろしくお願いします。 テキストファイル10万行からなるデータが入っています。 「aaa」と文字列を検索し、その下10行を抽出したいのです。 Sub 抽出() fname = Application.GetOpenFilename(FileFilter:="(*.*),[*.*]", Title:="data?", MultiSelect:=False) if fname For Input As #1 Do Line input as #1 If InStr(data, "aaa") > 0 Then For i = 1 To 10 Cells(i, 1).Value = data Next End If Loop Until EOF(1) Close #1 End Sub