プロが教えるわが家の防犯対策術!

タイピングソフトを作っています。

メインのフォーム(タイピング画面)に
配列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個保存したいのです。


そういう場合はどのように設定すればよいですか(読み込んで保存すること)?
準備するファイルはテキストファイルでもいいのでしょうか?
またその中身の記述はどうすればよいですか?

長くなりましたがよろしくお願いします。

A 回答 (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 …

※Split
引数1の文字列を、引数2の文字列にて区切ります。サンプルプログラムでは
Const CUT_STR As String = vbLf
として改行コードで区切られています。よって、行数の分だけの問題数となります。またvbLfを","などに変更すると、カンマ区切りで配列を創生します。
http://www.microsoft.com/JAPAN/developer/library …

※Ubound
配列要素の最大値を得る事ができます。ちなみにLboundは配列要素の最小値を得ます。
http://www.microsoft.com/JAPAN/developer/library …
http://www.microsoft.com/JAPAN/developer/library …


FreeFileの使用方法を尋ねていたので参考までに書いたけど、各関数の上にカーソルがある状態でファンクションキーF1を押すと、関連ヘルプ(MSDN)を表示します。各関数はできるだけ調べるように努力しましょう。
もしMSDNがインストールされていない場合、
http://www.microsoft.com/japan/developer/default …
にオンライン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
    • good
    • 0
この回答へのお礼

くわしくありがとうございました。
むずかしいことばっかで理解するのがかなり大変ですが
なんとかがんばってみます。

ただ、どうしても
ファイルにこれ以上データが存在しません。
というエラーがわからないんですよ・・・。

お礼日時:2001/11/19 12:14

先にご解答の方に補足させていただきます。


データをプログラムの中の配列で発生・定義するのは、
初等の解説書に載っていますが、レコード数が増えたり、
別種のデータで処理したいとき、ソースプログラムをいじらなければならなくなるので勧められません。早く卒業する事です。
そこで、ファイルを作りそれに記録するのです。
これが、コンピュータプログラムが発達し始め、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の色を残す拙いプログラムで済みません。)
将来ぜひファイルに「構造」を持たせることを学んで
ください。本当に面白い分野と思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

たしかにファイルの構造はやってて楽しいです。
ただエラーが出るのだけは苦労しますけど・・・。
なんにでもエラーはつきのもですもんね。

がんばってエラーをなくすようがんばってみます。

お礼日時:2001/11/19 12:17

例えば初級ファイルの中身は



"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

各関数はヘルプを見て確認して下さい。

この回答への補足

試しにやってみたのですが
ファイルにこれ以上データがありませんと
input~
のところでエラーが出てしまいます。

配列をintger→long
配列の数を100→110
といろいろとやってみたのですが
エラーが解除できません。
このエラーの原因は何でしょうか?
ブレイクポイントを設定してみると
どうやらi=97で止まるみたいです。

あと"FlNum = FreeFile "とはどういう意味なんでしょうか?
FreeFileっていうのがいまいちわかりません。

補足日時:2001/11/17 20:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!