タイピングソフトを作っています。
メインのフォーム(タイピング画面)に
配列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.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
くわしくありがとうございました。
むずかしいことばっかで理解するのがかなり大変ですが
なんとかがんばってみます。
ただ、どうしても
ファイルにこれ以上データが存在しません。
というエラーがわからないんですよ・・・。
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.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っていうのがいまいちわかりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- ホームページ作成・プログラミング ホームページ作成について。「ワードプレスではありません」。 3 2023/08/13 14:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VBS] 16進数でバイナリファイ...
-
DXFファイルをVBで取り込み、図...
-
fread関数の使い方がわかりませ...
-
バイナリファイルでOutOfMemory...
-
VBAでテキストファイルを複数開...
-
バイト型のデータを16進表記で...
-
ファイル入力のデータを構造体...
-
Cで2次元配列にCSVファイルを...
-
VBAでテキストファイルの改行を...
-
ファイルのアクセス回数について
-
エクセルvbaでdocuworksprinter...
-
エクセルのプロパティーでセキ...
-
バッチファイル 二つ上のディ...
-
エクセルで複数のコメントのサ...
-
カンマ区切りのCSVファイルから...
-
ExcelブックをGoogleスプレッド...
-
frxファイルの役目
-
Wordで差込印刷した後に別々の...
-
CSV形式での保存時に”文字列...
-
Excel 相対パス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
VBAでテキストファイルの改行を...
-
テキストファイルを後ろから読...
-
VBAでテキストファイルを複数開...
-
バイナリファイルでOutOfMemory...
-
DXFファイルをVBで取り込み、図...
-
RGBのバイナリデータをCImageに...
-
CFileの使い方を教えてください
-
datagridviewでドラッグ操作が...
-
Excel VBAで画像解析
-
バイナリの読み込みから出力まで
-
bmpファイルの明暗の数値化の方法
-
fread関数の使い方がわかりませ...
-
SDKにて。
-
日本語を配列に収め、そして表...
-
バイナリ出力
-
VBSにてCSV読み込みし比較
-
ファイル内の(&H0A)を(&H0D0A)...
-
Cで2次元配列にCSVファイルを...
-
日本語混じりのファイルをラン...
おすすめ情報