タイピングソフトを作っています。
メインのフォーム(タイピング画面)に
配列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個保存したいのです。
そういう場合はどのように設定すればよいですか(読み込んで保存すること)?
準備するファイルはテキストファイルでもいいのでしょうか?
またその中身の記述はどうすればよいですか?
長くなりましたがよろしくお願いします。
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
各関数はヘルプを見て確認して下さい。
この回答への補足
試しにやってみたのですが
ファイルにこれ以上データがありませんと
input~
のところでエラーが出てしまいます。
配列をintger→long
配列の数を100→110
といろいろとやってみたのですが
エラーが解除できません。
このエラーの原因は何でしょうか?
ブレイクポイントを設定してみると
どうやらi=97で止まるみたいです。
あと"FlNum = FreeFile "とはどういう意味なんでしょうか?
FreeFileっていうのがいまいちわかりません。
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の色を残す拙いプログラムで済みません。)
将来ぜひファイルに「構造」を持たせることを学んで
ください。本当に面白い分野と思います。
回答ありがとうございます
たしかにファイルの構造はやってて楽しいです。
ただエラーが出るのだけは苦労しますけど・・・。
なんにでもエラーはつきのもですもんね。
がんばってエラーをなくすようがんばってみます。
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 …
※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
くわしくありがとうございました。
むずかしいことばっかで理解するのがかなり大変ですが
なんとかがんばってみます。
ただ、どうしても
ファイルにこれ以上データが存在しません。
というエラーがわからないんですよ・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ファイル内の(&H0A)を(&H0D0A)に変換したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DXFファイルをVBで取り込み、図...
-
bmpファイルの明暗の数値化の方法
-
Cで2次元配列にCSVファイルを...
-
CSVファイルによる検索の高速化
-
RGBのバイナリデータをCImageに...
-
インデックスが配列の境界外で...
-
[VBS] 16進数でバイナリファイ...
-
エクセルのプロパティーでセキ...
-
ファイルのアクセス回数について
-
エクセルvbaでdocuworksprinter...
-
カンマ区切りのCSVファイルから...
-
エクセルで複数のコメントのサ...
-
Windows10でコマンドプロンプト...
-
LAN接続HDD(LinkStation)で削...
-
Vba初心者です。下記のコード助...
-
エクセル2010、図が大きすぎま...
-
xcopyコマンドの進行状況を表示...
-
frxファイルの役目
-
同じファイル名 上書きしないフ...
-
マクロから出力されるcsvのダブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DXFファイルをVBで取り込み、図...
-
RGBのバイナリデータをCImageに...
-
VBAでテキストファイルの改行を...
-
VBAでテキストファイルを複数開...
-
ファイル内の(&H0A)を(&H0D0A)...
-
テキストファイルを後ろから読...
-
datagridviewでドラッグ操作が...
-
ファイル入力のデータを構造体...
-
バイナリファイルでOutOfMemory...
-
Excel VBAで画像解析
-
ファイルからビット単位での読...
-
バイナリ出力
-
バイト型のデータを16進表記で...
-
バイナリファイルの一部分をカ...
-
VBScriptの配列は、要素数を指...
-
インデックスが配列の境界外で...
-
Mscomm を使用してバイナリでデ...
-
perl 特定の文字列をdatファイ...
-
Cで2次元配列にCSVファイルを...
-
[VBS] 16進数でバイナリファイ...
おすすめ情報