- ベストアンサー
Excelファイルの読み込み
VBから既存のExcelファイルをフィールドごとに読み込む プログラムを作成しています。 xlFileName = App.Path & "strFileName" Open "xlFileName" For Append As #1 Line Input #1, Str Close #1 これで実行すると「変数は省略できません」というエラー が出てしまいます。 原因がわからないのでよろしかったらご教授ください。 お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>質問なのですがグローバル変数宣言は標準モジュールで >Public strFileName As String と宣言し、 >それ以外にも各フォームごとにも >Dim strFileName As Stringと宣言をすべきなのでしょうか? 各フォームで宣言するとローカルな同じ変数になります。 したがって、この場合宣言するとややこしくなりますので 宣言しないほうがいいでしょう。 「パス名が無効です」でMSDNのヘルプを検索してください。 「パス名が無効です。(Error 75)」 Open、MkDir、ChDir、または RmDirなどのファイル アクセスまたは ディスク アクセス操作の際に、オペレーティング システムでパスと ファイル名を関連付けることができませんでした。エラーの原因と 対処方法を次に示します。 ファイル指定の形式が間違っています。 ファイル名には、絶対パスと相対パスがあります。絶対パスは (パスが別のドライブの場合は) ドライブ名で始めて、ルートから ファイルまでのパスを明示的に指定します。絶対パスで指定されて いないパスは、カレント ドライブとフォルダへの相対パスになります。 既存の読み取り専用ファイルと同じ名前でファイルを保存しようとして います。 ターゲット ファイルの読み取り専用の属性を変更するか、別のファイル 名で保存します。 読み取り専用ファイルをシーケンシャル Output または Append モードで 開こうとしています。 Input モードで開くか、読み取り専用属性を変更します。 以上のような記述でひっかかっているかどうか判断できませんか? 何か根本的なところでおかしい気もします。 思いもしない箇所のエラーで、結果として上記エラーになっている 可能性もあります。 「ファイルがありません」などのメッセージではないですから。 参考にならなかったら申し訳ありませんが。 まさか、エクセルファイル(通常バイナリ)をシーケンシャルで 開こうとしているとか? エクセルのファイルは、CSVなどのテキストですよね? バイナリならば、シーケンシャルでは無理なので、 Open FileName For Binary As #1 などに し、Get などを使わないと処理できませんので。 (蛇足でしたらごめんなさい)
その他の回答 (5)
- pen_pen_pen
- ベストアンサー率65% (52/79)
No.4でも聞いてみたのですが、Openする直前でxlFileNameには何が入っているのでしょうか? MsgBox xlFileName と1行入れてみてください。コモンダイアログで選択したファイルのフルパスが表示されるでしょうか? もしも入っていない場合、標準モジュールで宣言した Public strFileName As String 以外には「strFileName」という名前で宣言されている箇所が無い事を確認してください。 更に、無ければ strFileName = "" などと、初期化する箇所がファイル選択してからOpenするまでの間に存在しない事を確認して下さい。 私は無事にファイルを開くところまでは確認できました。 「開くところまでは」といいますのは・・。 試した事無いけどできるのかと思っていたのですが、このファイルの読み方では普通のEXCELファイルは読めませんね。 No.5のSUPERSさんのご解答を見て気になったので、やってみました。 質問者さんが言うEXCELファイルがCSVファイルならば読めるのですが・・。 強引に読んでみると、化けてました。当然ですけど。 そもそもどのシートが読み出されるのか分かりませんね。 普通のEXCELファイルを読むようでしたら、No.2のkomet163さんのおっしゃるようにEXCELをVBで起動して読むのが正しいと思います。
お礼
回答ありがとうございました。 宣言のしすぎでした。グローバル変数以外に、 各フォームでも宣言していました。 修正してデバッグしたら、パス名が必要な箇所では strFileName = "" などの空白がなくなり コモンダイアログから引っ張ってきたパス名がはいっていました。 これで次の処理に移れます。 皆さん丁寧なアドバイスありがとうございました。
- pen_pen_pen
- ベストアンサー率65% (52/79)
まずstrFileNameの内容を、MsgBoxなりウォッチウィンドウで見ると何が入っていますか? 確認したところ、コモンダイアログで strFileName = CommonDiarog1.FileName とした場合、選択したファイルのフルパスが入ってました。 なので、 xlFileName = App.Path & strFileName ではなく、 xlFileName = strFileName でいいと思います。 つまりstrFileNameをそのまま使えばよいのではないかと思いますがいかがでしょうか?
補足
ご回答ありがとうございます。 pen_pen_penさんのご教授のとおり xlFileName = strFileNameでやってみましたが やはり「パス名が無効です」と出てしまいます。 質問なのですがグローバル変数宣言は 標準モジュールでPublic strFileName As String と宣言し、 それ以外にも各フォームごとにも Dim strFileName As Stringと 宣言をすべきなのでしょうか?
- SUPERS
- ベストアンサー率42% (26/61)
#1です。 別のフォームの変数をそのまま使いたいときは、 標準モジュールを追加してそこに Public strFileName As String などと定義するとグローバル変数として使えます。 つまり、どのフォームからも同じ変数として認識可能です。 ただし、フォームのコードが実行される順番が きちんとしてないと変数がnullになってしまうこと があります。
補足
返答ありがとうございます。 標準モジュールを追加して Public strFileName As Stringを 定義したのですが、やはり「パス名が無効です」のエラーになってしまいます。 追加した標準モジュールには Public strFileName As String の一行だけでいいのでしょうか? 他に考えうる改善点がありましたら教えてください。
- komet163
- ベストアンサー率51% (22/43)
試したことないんで不明ですが、Excelファイルをテキストファイルと同様に読込めるものでしょうか。 テキスト扱いするのなら、 VB で Excel を定義して起動し、目的のファイルを開いて、Excel → テキトスファイル で書出し、ブック&エクセルを閉じて、書出したテキストファイルを操作、になると思います。 しかし、こんな面倒な処理より、Excel VBA で目的の行、列からダイレクトに読込むことを薦めます。
お礼
回答ありがとうございます。 無事完成するよう精一杯やってみます。
- SUPERS
- ベストアンサー率42% (26/61)
まず、引数が省略できませんの直接の原因は、 変数のStrが定義されていないのでは?→(A) また、読込なのに Appendはおかしいです。→(B) strFileNameも変数ならば下記のようにしたら→(C) 変数は、""で囲んでしまうと文字列そのものに なってしまいます。 Dim Str As String (A) Dim strFileName as String (C) strFileName= "\TestFile.ext" xlFileName = App.Path & strFileName (C) Open xlFileName For Input As #1 (B) Line Input #1, Str Close #1
補足
(A)、(B)はおかげさまで解決いたしました。 ありがとうございました。 (C)に関して、このフォームでは別のフォームで コモンダイアログによって選択した既存のExcelファイルを表示させたいのですが、 実行すると「パス名が無効です」とエラーになってしまいます。 コモンダイアログのフォームでは strFileName = CommonDialog1.FileName としているのですが、別のフォームで同じパスは使えないのですか?
お礼
回答ありがとうございました。 宣言のしすぎでした。グローバル変数以外に、 各フォームでも宣言していました。 修正してデバッグしたら、パス名が必要な箇所では strFileName = "" などの空白がなくなり コモンダイアログから引っ張ってきたパス名がはいっていました。 これで次の処理に移れます。 皆さん丁寧なアドバイスありがとうございました。