• ベストアンサー

ファイルの読み込み

タイピングソフトを作っています。 メインのフォーム(タイピング画面)に 配列wk1(99)(ローマ字用)、wk2(99)(日本語)を宣言してます。 まだ初級しか作成してないでメインフォーム(タイピング画面)で Private sub Yomikomi() wk1(0)="hudebako",wk(0)="筆箱" wk1(1)="pasokonn",wk(1)="パソコン" wk1(99)="neko",wk(99)="ネコ" End sub という感じで100個読み込ませてます。 初級だけならよいのですが、その他に中級、上級の2つを準備したいのです。 そうなるとメインのプログラムがとても長くなってしまうので syokyuu,tyuukyuu,jyoukyuuというファイル名で3つのファイルを テキストファイルか何かで準備して メインフォームでそのファイル(指定したファイル)を読み込んで wk1,wk2に計100個保存したいのです。 そういう場合はどのように設定すればよいですか(読み込んで保存すること)? 準備するファイルはテキストファイルでもいいのでしょうか? またその中身の記述はどうすればよいですか? 長くなりましたがよろしくお願いします。

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

確かにこの場合配列を固定させるのは望ましくないかもしれません。 初級/中級/上級の違いは、[主に読み込みファイル/読み込んだデータを収納する変数]が違うだけで、[読み込み方/読み込んだデータを収める方法]は同じはずです。 違う部分をパラメータで切り分け、共通関数を使用すべきです。 サンプルです。 処理内容としては 1.プログラムで使用するテキストファイルの宣言 2.テキストファイルの各問題の区切り文字を宣言 3.各問題を読み込む 4.ファイルサイズを得る 5.ファイルサイズの領域を文字列にセットする 6.テキストを取得する 7.文字列を2で設定した文字で区切り配列にセットする(wk1/wk2/wk3に返す値になる) 8.読み込んだデータ件数を表示 です。 主な関数 ※FreeFile Open "FileNeme1" For Input As #1   Open "FileNeme1" For Input As #2   Close #2 Close #1 このようなファイル番号#1/2などをプログラムで固定で直打ちをしないでも、空き番号が取得できます。重複する事がないので、バグ回避にもつながります。 http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctfreefile.htm ※Split 引数1の文字列を、引数2の文字列にて区切ります。サンプルプログラムでは Const CUT_STR As String = vbLf として改行コードで区切られています。よって、行数の分だけの問題数となります。またvbLfを","などに変更すると、カンマ区切りで配列を創生します。 http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctsplit.htm ※Ubound 配列要素の最大値を得る事ができます。ちなみにLboundは配列要素の最小値を得ます。 http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctubound.htm http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctuboundx.htm FreeFileの使用方法を尋ねていたので参考までに書いたけど、各関数の上にカーソルがある状態でファンクションキーF1を押すと、関連ヘルプ(MSDN)を表示します。各関数はできるだけ調べるように努力しましょう。 もしMSDNがインストールされていない場合、 http://www.microsoft.com/japan/developer/default.asp にオンラインMSDNがありますので、そちらで検索をしましょう。 Sub Main()   '問題ファイル(1)   Const TEST1 As String = "c:\syokyuu.txt"   Const TEST2 As String = "c:\tyuukyuu.txt"   Const TEST3 As String = "c:\jyoukyuu.txt"      '問題の区切り(改行区切り)(2)   Const CUT_STR As String = vbLf      Dim wk1 As Variant     '初級   Dim wk2 As Variant     '中級   Dim wk3 As Variant     '上級      '問題ファイルの読み込み(3)   If Not subTestRead(TEST1, CUT_STR, wk1) Then     Call MsgBox("[" & TEST1 & "]失敗")     GoTo PGMEND   End If   If Not subTestRead(TEST2, CUT_STR, wk2) Then     Call MsgBox("[" & TEST2 & "]失敗")     GoTo PGMEND   End If   If Not subTestRead(TEST3, CUT_STR, wk3) Then     Call MsgBox("[" & TEST3 & "]失敗")     GoTo PGMEND   End If      '読み込んだ情報をメッセージボックスで出力(8)   Call MsgBox( _     "[" & TEST1 & "]は" & UBound(wk1) + 1 & "問のの問題があります" & vbNewLine _     & "[" & TEST2 & "]は" & UBound(wk2) + 1 & "問のの問題があります" & vbNewLine _     & "[" & TEST3 & "]は" & UBound(wk3) + 1 & "問のの問題があります" _     ) PGMEND: End Sub 'テキストファイルを読み込み、配列にして返す 'パラメータ1:ファイルパス 'パラメータ2:テキストファイルは何区切り? 'パラメータ3:返す配列 Public Function subTestRead(inFilePath As String, strCut As String, outTestAry As Variant) As Boolean   Dim lngFileSize As Long 'ファイルサイズ   Dim lngFileNum As Long 'ファイルナンバ      Dim strBuff   As String  '文字列ワーク      'ファイルサイズの取得(4)   On Error Resume Next   lngFileSize = FileLen(inFilePath)   On Error GoTo 0   'サイズが取得できない時NG処理   If lngFileSize < 1 Then     Exit Function   End If      '取得するためのサイズを用意(5)   strBuff = String(lngFileSize, vbNullChar)     'テキスト取得(6)   lngFileNum = FreeFile   Open inFilePath For Binary As #lngFileNum     Get #lngFileNum, , strBuff   Close #lngFileNum      '文字列を区切り、配列に変換(7)   outTestAry = Split(strBuff, strCut)      'OKを記す   subTestRead = True End Function

sakky_t
質問者

お礼

くわしくありがとうございました。 むずかしいことばっかで理解するのがかなり大変ですが なんとかがんばってみます。 ただ、どうしても ファイルにこれ以上データが存在しません。 というエラーがわからないんですよ・・・。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

先にご解答の方に補足させていただきます。 データをプログラムの中の配列で発生・定義するのは、 初等の解説書に載っていますが、レコード数が増えたり、 別種のデータで処理したいとき、ソースプログラムをいじらなければならなくなるので勧められません。早く卒業する事です。 そこで、ファイルを作りそれに記録するのです。 これが、コンピュータプログラムが発達し始め、COBOLなどの時代になると、主流になりました。 ファイル(データ)とプログラムの分離です。 ファイルを処理する為には、ファイルが存在しなければなりません。自分で作るわけです。どうして作るか。   (1)VBで作る。JAVAでも出きれば良いでしょ     う。入力を受けつけるプログラムで作る   (2)エクセルでセルにデータを入力して作り、CS    V形式で保存する。   (3)メモ帳で作る。   (4)その外に他人が作ったデータを処理することも     当然多い。 (2)はファイル-名前をつけて保存-ファイルの種類を CSV(カンマ区切り)を指定して「保存」する-ファイル名を仮にBook1.csvとする。これを読むにはVBで Private Sub Form_Click() Open "c:\My Documents\Book1.csv" For Input As #1 If EOF(1)=-1 Then GoTo p2 p1: Input #1, a$, b$ Form1.Print a$, b$ '(表示の例) '(処理がここに入る) GoTo p1 p2: close #1 End Sub -------------- (1)で作るには Private Sub Form_Click() Open "c:\My Documents\Book2.csv" For output As #1 p1: a$=InputBox("a=") if a$="end" then goto p2 b$=InputBox("b=") Print #1,a$;","; b$(2項目の例) GoTo p1 p2: close #1 End Sub 上記がシーケンシャルファイルと言われるものです。 (どちらもGOTO文があり、旧BASICの色を残す拙いプログラムで済みません。) 将来ぜひファイルに「構造」を持たせることを学んで ください。本当に面白い分野と思います。

sakky_t
質問者

お礼

回答ありがとうございます たしかにファイルの構造はやってて楽しいです。 ただエラーが出るのだけは苦労しますけど・・・。 なんにでもエラーはつきのもですもんね。 がんばってエラーをなくすようがんばってみます。

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

例えば初級ファイルの中身は "hudebako","筆箱" "pasokonn","パソコン" ~ "neko","猫" とします。 ファイルを読み込むときは input関数を使います。 例えば Private Sub Command1_Click() Dim FlNum as Integer Dim i as Integer FlNum = FreeFile Open "ファイル名" For Input As FlNum i = 0 Do While Not EOF(FlNum) Input #FlNum, wk1(i),wk(i) i = i + 1 Loop Close FlNum End Sub 各関数はヘルプを見て確認して下さい。

sakky_t
質問者

補足

試しにやってみたのですが ファイルにこれ以上データがありませんと input~ のところでエラーが出てしまいます。 配列をintger→long 配列の数を100→110 といろいろとやってみたのですが エラーが解除できません。 このエラーの原因は何でしょうか? ブレイクポイントを設定してみると どうやらi=97で止まるみたいです。 あと"FlNum = FreeFile "とはどういう意味なんでしょうか? FreeFileっていうのがいまいちわかりません。

関連するQ&A

  • 新しいファイルの作成について

    タイピングのプログラムを作っています。 今、基になるファイル(Syokyuu1)があり ローマ字設定をしなおして 新しいファイル(Syokyuu2)を作りたいと考えています。 FINum = FreeFile Open "Syokyuu1.txt" For Input As #FINum i = 0 Do While Not EOF(1) Input #FINum, wk1(i) i = i + 1 Loop Close #FINum という具合にSyokyuu1を読み込んで wk1(100)に保存するところまでできました。 ※ wk(n)の構造:wk(0)=inu,wk(1)=ennpitu,wk(2)=honn・・・ ここでwk(0)からwk(99)までローマ字の設定をしなおして 新しいファイルSyokyuu2を同じ構造で作成したいのです。 その場合どのように記述すればよろしいですか? よろしくお願いします。 Syokyuu1の中は "inu" "ennpitu" "honn" という構造です。

  • アクセスサブフォームで保存するとエラーとなる

    以前教えてもらった下記のサブフォームでのデータ保存VBAですが、このままだと添付ファイルのような画面が出てきてメインフォームでの保存が自動で出来ず、いろいろ試してみましたがうまくいきません。 何卒、ご指導宜しくお願い致します。 Private Sub 保存_Click() MsgBox "データを確定保存します" DoCmd.RunCommand acCmdSaveRecord If Not SysCmd(acSysCmdGetObjectState, acForm, "メインフォーム名") = 0 Then 'MsgBox "メインフォームの画面を更新します" With Forms!メインフォーム名 .Refresh End With End If End Sub

  • C# 別なフォームへ値を渡す (初心者です)

    メインのフォームからサブのフォームを呼び出して、 サブのフォ-ムからさらにクラスを呼び出し、 クラスからメインのテキストボックスのテキストに書き込むプログラムを作成中です。 ですが、テキストボックスがパブリックにも関わらず、表示されません。 デバックで見る限り、テキストボックスのテキストには値が入っているのですが、 フォームを見ると表示されていません。 知恵をお貸しください。

  • iniファイルへの追記について

    FORM上の保存ボタンをクリックしたら、フォームに入力したデータがiniファイルへ追記していくというものを作りたいのですがわかりかねています。 フォームのソースで作っていこうとしていて、 ソースの始めは public sub Command保存_Click() で始まり、End sub で終りますよね? そこで フォーム上の値、例えば、3 を変数 a_col に格納します。ここまではできます。 この格納したものをiniファイルと同じものをあらわす名前のini_colに格納し、iniファイルに ini_col=3と表示したいのです。 iniファイルから、フォームへ取り込むところまではなんとかできました。 初心者ですのでアドバイスおねがいします。

  • サブフォームにあるテキストボックスの値を参照したい

    ACCESS2010です。 サブフォーム(帳票フォーム)のフッターにある、コントロールソースが =nz(sum([金額]),0) と設定してあるテキストボックスがあります。([合計金額s]) この[合計金額s]の値を、メインフォームのコントロールソースがテーブルの項目に設定されているテキストボックス([金額])で参照したいのですが、金額入力直後の値が参照できません。 現在はメインフォームに中継用のテキストボックス([金額wk])を作成し、コントロールソースを[合計金額s]に設定、acNewRecする前に[金額wk]の値を[金額]へ渡しています。 何とか直接参照する方法はありませんでしょうか。

  • ファイル保存

    Private Sub Command1_Click()   intFileNo = FreeFile   Open "sample_01.csv" For Output As #intFileNo   Print #intFileNo, Text1.Text   Close #intFileNo End Sub このプログラムではテキストボックスに表示されたcsvをファイル名sample_01.csvとして保存できるのですが、 これだとテキストボックスに表示されているのが何でもファイル名がsample_01.csvとなってしまいます>< こうではなくて、テキストボックスに表示されている、『○○○.csv』というのをそのままファイル名として保存したいのです。 sample_01.csvの部分をtext1.textにかえてやったらエラーがでてできませんでした・・・ どなたかご教授お願い致しますm(__)m

  • さくらサーバー ファイルマネージャー

    さくらサーバーでサブドメインを作成しましたが、どこからファイルマネージャーに入るかがわかりません。 いつもメインのドメインで入るフォームで、サブドメインアドレスを入力してPWを正規のものを打ちますが、 「ドメイン名が間違ってます」と出てしまいます。 メインのドメインで入って「ドメイン設定」を開きますと、確かにサブドメインは登録されてます。 FAQでも回答を捜せず、サポート電話も通じなくて困ってます。 どこからサブドメインのファイルマネージャーに入るのでしょうか?

  • 超初心者です。クラスファイルの作成について、

    超初心者ですが宜しくお願いします。 phpの学習をはじめて、演算、比較、繰り返し、などを初級本の通り進めてきたのですが、classの作成で悩んでいます。 拡張子を.phpではなく.classで保存と書いてあるのですがテキスト通り試みても画面に出力されません。(errorも出ちゃいます。)テキストではそのままクラスファイルを実行すると画面に出力されると書いてあるのですが.classの保存ではいけないのでしょうか?・・ javaのmainクラス作成の様に処理されると考えていたのですが・・・ それと環境ですが、php5でエディタは、DreamWになります。 初歩的な質問ですがどうぞ宜しくお願いします。

    • 締切済み
    • PHP
  • Access csvファイルで出力したい

    いつもお世話になっています。 フォームにボタンを作成して、指定したフォームをExcelファイルで保存しています。 これをcsvファイルで出力に変更したいのです。(フルパスではない方法) Private Sub Eccelで保存_Click() DoCmd.OutputTo acOutputForm, "活動記録", acSpreadsheetTypeExcel9 End Sub お力添えをお願いいたします。

  • VB.netでTIFFファイルの読み込みと保存

    GDI+については全くの初心者です。 フォームにボタンを貼り付け、下記のような処理を書いてみました。 単純にTIFFファイルを読み込んで、別名で保存するという 処理ですが、元のTIFF(test1.tif)と保存後のTIFFファイル(test2.tif)では、ファイル容量が、1/2位に小さくなってしまいます。また、元のファイルはPhotoshop7で読み込めるのですが、保存後のファイルは、読み込めません(ファイルにはこのバージョンのphotoshopと互換性がありませんというエラーメッセージ)。しかし、他のソフト(例えばIE)からはどちらも読み込めます。 これは、一体どういう理由で、どのようにすれば、両方とも全く同じTIFFファイルにすることができるでしょうか。なお、この処理の目的は、単にファイル名の変更をしたいというものではなく、本来は、読み込みと保存の間に、何らかの変換処理を行いたいのです。 よろしくお願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bmp As New Bitmap("c:\test1.tif") bmp.Save("c:\test2.tif", ImageFormat.Tiff) bmp.Dispose() End Sub