• ベストアンサー

Excelファイルの読み込み

VBから既存のExcelファイルをフィールドごとに読み込む プログラムを作成しています。 xlFileName = App.Path & "strFileName" Open "xlFileName" For Append As #1 Line Input #1, Str Close #1 これで実行すると「変数は省略できません」というエラー が出てしまいます。 原因がわからないのでよろしかったらご教授ください。 お願いします。

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

  • ベストアンサー
  • SUPERS
  • ベストアンサー率42% (26/61)
回答No.5

>質問なのですがグローバル変数宣言は標準モジュールで >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 などを使わないと処理できませんので。 (蛇足でしたらごめんなさい)

tomokoji
質問者

お礼

回答ありがとうございました。 宣言のしすぎでした。グローバル変数以外に、 各フォームでも宣言していました。 修正してデバッグしたら、パス名が必要な箇所では strFileName = "" などの空白がなくなり コモンダイアログから引っ張ってきたパス名がはいっていました。 これで次の処理に移れます。 皆さん丁寧なアドバイスありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

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で起動して読むのが正しいと思います。

tomokoji
質問者

お礼

回答ありがとうございました。 宣言のしすぎでした。グローバル変数以外に、 各フォームでも宣言していました。 修正してデバッグしたら、パス名が必要な箇所では strFileName = "" などの空白がなくなり コモンダイアログから引っ張ってきたパス名がはいっていました。 これで次の処理に移れます。 皆さん丁寧なアドバイスありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

まずstrFileNameの内容を、MsgBoxなりウォッチウィンドウで見ると何が入っていますか? 確認したところ、コモンダイアログで strFileName = CommonDiarog1.FileName とした場合、選択したファイルのフルパスが入ってました。 なので、 xlFileName = App.Path & strFileName ではなく、 xlFileName = strFileName でいいと思います。 つまりstrFileNameをそのまま使えばよいのではないかと思いますがいかがでしょうか?

tomokoji
質問者

補足

ご回答ありがとうございます。 pen_pen_penさんのご教授のとおり xlFileName = strFileNameでやってみましたが やはり「パス名が無効です」と出てしまいます。 質問なのですがグローバル変数宣言は 標準モジュールでPublic strFileName As String と宣言し、 それ以外にも各フォームごとにも Dim strFileName As Stringと 宣言をすべきなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • SUPERS
  • ベストアンサー率42% (26/61)
回答No.3

#1です。 別のフォームの変数をそのまま使いたいときは、 標準モジュールを追加してそこに Public strFileName As String などと定義するとグローバル変数として使えます。 つまり、どのフォームからも同じ変数として認識可能です。 ただし、フォームのコードが実行される順番が きちんとしてないと変数がnullになってしまうこと があります。

tomokoji
質問者

補足

返答ありがとうございます。 標準モジュールを追加して Public strFileName As Stringを 定義したのですが、やはり「パス名が無効です」のエラーになってしまいます。 追加した標準モジュールには Public strFileName As String の一行だけでいいのでしょうか? 他に考えうる改善点がありましたら教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • komet163
  • ベストアンサー率51% (22/43)
回答No.2

試したことないんで不明ですが、Excelファイルをテキストファイルと同様に読込めるものでしょうか。 テキスト扱いするのなら、 VB で Excel を定義して起動し、目的のファイルを開いて、Excel → テキトスファイル で書出し、ブック&エクセルを閉じて、書出したテキストファイルを操作、になると思います。 しかし、こんな面倒な処理より、Excel VBA で目的の行、列からダイレクトに読込むことを薦めます。

tomokoji
質問者

お礼

回答ありがとうございます。 無事完成するよう精一杯やってみます。

全文を見る
すると、全ての回答が全文表示されます。
  • SUPERS
  • ベストアンサー率42% (26/61)
回答No.1

まず、引数が省略できませんの直接の原因は、 変数の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

tomokoji
質問者

補足

(A)、(B)はおかげさまで解決いたしました。 ありがとうございました。 (C)に関して、このフォームでは別のフォームで コモンダイアログによって選択した既存のExcelファイルを表示させたいのですが、 実行すると「パス名が無効です」とエラーになってしまいます。 コモンダイアログのフォームでは strFileName = CommonDialog1.FileName としているのですが、別のフォームで同じパスは使えないのですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB2005 でCSVファイルの読み込み

    VisualBasic2005でカンマ区切りのcsvファイルを読み込み、各項目を配列に取り込みたいのですが、どうすればいいのですか? VB6の時のように書くとエラーになります。 VB2005にはopen命令はないみたいですね。 Open ファイル名 For Input As #1 input #1,s(1),s(2),s(3) close #1 ちなみにcsvファイルの内容は "会社名(co.xxx,sss)","工場名","製品名(aaa,xxx)" のように各項目中にカンマやピリオドが入っています。 VB6はVBAではダブルコーテーションで囲めば正常に読み込めました。 どなたか教えて下さい。よろしくお願いします。

  • バイナリデータのファイル入出力について

    ○No.1 Open filename For Binary Access Read As #1 Get #1, , 変数 Close #1 ○No.2 Open filename For Input As #1 Line Input #1, 変数 Close #1 No.1とNo.2のプログラムでは読み込み方にどのような違いがあるのでしょうか?たとえば、No.2のLine Inputでは改行文字は読み飛ばされますが、No.1は改行文字も読み込みますよね。また、No.1ではDim 変数 As String * 1と最後の* 1など文字の読み込み数を定義しておく必要がありますが、Line Inputに対応するものがないからでしょうか? また、バイナリデータを読み書きするときに他に良いコードというかこうするのが定石みたいなのがあったら教えてください。

  • 変数の頭「#」の意味

    VB初心者です。 VB5のOPEN関数等で見かける #変数名 の#はどういう意味でしょうか? ヘルプを見ると「省略可能」とありますが・・・ 指定した場合に何か意味を持つものなのでしょうか? 例 intFileNo = FreeFile Open "test.txt" For Input As #intFileNo

  • VB6.0 CSVファイル読み込みについて

    VB6.0について質問です。 CSVファイルの読み込みを行いたいのですがうまくいきません。。。 以下のソースのどこに問題ありますでしょうか?>< 14個のカンマ区切りのCSVファイルを読み込んでいますが ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。 ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。 しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。 以下のソースで実行すると改行部でエラーになるようです。 改行を無視するようなロジックを入れる必要があるのでしょうか? Dim MyString(), i Open App.path & "\" & CSV_filename For Input As #1 ReDim MyString(13) Do While Not eof(1) Input #1, MyString(i) Label4(i).caption = MyString(i) i = i + 1 Loop Close #1

  • VBからExcelのテキストを指定して開きたい

     VBのアプリケーションから文書名を指定してエクセルを起動したいのですが 出来なくて困っています。ちなみにコードは下記のとおりです。どこに問題があ るのか教えていただけないでしょうか。 Private Sub Command1_Click() Dim lngReturnCode As Long Dim strFileName As String strFileName = "AllTitles.csv"   lngReturnCode = ShellExecute(Me.hwnd, _ "open c:\***\***.xls", _ strFileName, _ vbNullString, _ App.Path, _ SW_SHOWNORMAL) End Sub

  • テキストファイルを一行づつとる方法

    テキストファイルを一行だけとる方法は以下のとおりかと思いますが、最後の列まで一行づつとる場合はどうすればいいのでしょうか?教えて頂ければ幸いです。 Open "c:\data.txt" For Input As #1 Line Input #1, str Close #1

  • ActiveBasic 動画の画面のサイズを取得したい(Fieldの使い方)

    お世話になっています。 今回、動画の画面のサイズを取得したく、方法を探していたところ、 以下のようなページを見つけました。 http://tokyo.cool.ne.jp/kanain/APIHTM/AVI_Size.html しかし、Fieldのところで詰まってしまい、先へ進めません・・・ #N88BASIC Dim path As String Dim str As String Dim width As Double Dim height As Double Input"動画ファイルへのパス:",path Open path As #1 Field #1,3 Get #1,65,str Close #1 とりあえず、ここまで書きましたが、 数値が返ってきません・・・ (mpgで実験しました) やり方をご存知の方、お手数ですがご教授いただければ幸いです。 AB 4.23.00 Win XP

  • VBA 複数のファイルの特定の列だけ取得してマージ

    お世話になっております。 VBAで、複数のCSVファイルの特定の列だけを抽出して別のCSVファイルにマージする方法を探しています。 例えば、マージフォルダに1000のCSVファイルがあります。 1000あるファイルのA列とC列だけを抽出して、 それを別の「マージ.CSV」というファイルにA列とB列にマージして一つにしたいのです。 1000のファイルにはA~Qまで値が入っていて、A~Q列の値全て取り込みマージするとデータが重くなってしまうのです。 Unionメソッドを仕様して列を選択するのかなと思うのですが。。。 現在、こちらのコードを参考にしています。 わかる方いましたらよろしくお願いいたします。 Sub csvmerge() wpath = Range("B3") wfile = Dir(wpath & "\") flag = 0 Do While wfile <> "" If InStr(wfile, ".csv") Then flag = flag + 1 If flag = 1 Then FileCopy wpath & "\" & wfile, ThisWorkbook.Path & "\output.csv" Open ThisWorkbook.Path & "\output.csv" For Output As #1 Close #1 End If Open ThisWorkbook.Path & "\output.csv" For Append As #1 Open wpath & "\" & wfile For Input As #2 Do Until EOF(2) Line Input #2, w_str Print #1, w_str Loop Close #2 Close #1 End If wfile = Dir() Loop MsgBox "マージ完了", vbInformation End Sub

  • テキストファイルの閉じ方について

    いつもお世話になります。 環境はXPを使用しています。 VBAでセルに設定してあるハイパーリンクを開くと テキストファイルが開くようにしてあります。 このテキストファイルを閉じようとするのですが、 閉じません。 ちなみにソースは以下の通りです。 intFileNum = FreeFile Open strFileName For Input As intFileNum i = 1 Do While Not EOF(intFileNum) Input #intFileNum, TextLine Cells(i, 1) = TextLine i = i + 1 Loop Close #intFileNum 最後のCloseで閉じないのはなぜですか? 初めてテキストファイルを操作するのでよくわかりません。 よろしくお願いします。

  • CSVの作り方

    VBの初心者です。 VBでCSVファイルを新規で開いて 保存できたと思ったのですが、できていませんでした。 まだ何か足らないのでしょうか? ーーーーーソースーーーーー '取り合えず開いて保存 open app.path + "ファイル名"for output access write as #1 close #1 ーーーーーソースーーーーー