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

メインのフォーム(タイピング画面)に
配列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で質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「古い圧縮ファイル」の確認方法

Dドライブのディスクのクリーンアップをしたいのですが、実行できるものが、「古い圧縮ファイル」の削除しかありません。

「古い圧縮ファイル」がどのプログラムかを確認する方法を教えてください。

また、圧縮されたファイルの名前は青くなるらしいのですが、見つかりません。どうしてでしょうか
圧縮ファイルは1G弱あります。

Aベストアンサー

http://www.atmarkit.co.jp/fwin2k/win2ktips/106cleanup/106cleanup.html

初期設定では、50日以上アクセスの無かったファイルに対して、圧縮が行われます。
当然、圧縮してからでないと、ファイル名は青色にはなりませんので、ディスク・クリーンアップでの候補段階では、黒色のままです。


尚、設定によっては青色表示にならない場合も有りますけど。

http://121ware.com/qasearch/1007/app/nec.jsp?005084

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。

Qファイルの圧縮方法

AVIやMPGの画像ファイルを圧縮する方法を教えてください。900mb位のファイルをCD-Rに落とし込める700mbまで圧縮したいんですが。できれば、zipやlzhなどの後で解凍しなくてはいけないような圧縮方法ではなく、多少画像が荒くなってもファイルを単純に縮小させるような方法を教えていただけると有り難いのですが。。
因みに、TMPGEncを試してみたんですが、どうもうまくいかなくて。。ファイルサイズが元のファイルより逆に大きくなってしまうんです。
すいませんが、宜しくお願いします。

Aベストアンサー

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450 450 くらいでカット。
対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331
ではでは!

追伸
カンタンにならrmファイルに変更かなあ
でも画質は落ちますよ
ネット配信 ストリーミング形式でどぞ!
RealplusG2とかRealEncoderで変換
でもaviでもないしmpegでもないですけど、どお?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qファイルの圧縮方法が解りません

窓の杜やベクター等に置かれている、フリーの圧縮、解凍ソフトをダウンロードしていますが、テキストファイルや、画像ファイルの圧縮方法が解りません。何方か教えて頂けませんか?

Aベストアンサー

ソフトの開発者のサイトで質問することをお奨めします。

ソフトごとに操作方法が異なりますので、使用しているソフト名すらない状態では誰も必要とする回答を出せません。

窓の杜やベクターでは開発者のサイトへのリンクがありますから、そこからアクセスできますよ。

QExcel VBA: private sub 内の変数の値を Sub へ渡すには

VBA初心者です。private sub 内で条件に合致した変数の値をSubへ渡すにはどうしたらよいのでしょう。下記を見ていただければやりたいことの意図は伝わるかと思います。private sub内の変数が多分private sub内のみでしか参照出来ないからだとは思いますが、うまくいきません。グローバル変数化みたいなことが出来るのでしょうか。

Sub Find_OK()
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK
End If
Next
End Sub

Aベストアンサー

Sub Find_OK(var1)
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK(var1)
End If
Next
End Sub

Qpsdファイルの圧縮方法

psdファイルの圧縮方法を教えてください。(基本的質問で恐縮ですが)
win98です。なお、ファイルは9MB程度ですが、圧縮したものを解凍する際、鮮明度が落ちずに元通りの画像で開けますでしょうか?

Aベストアンサー

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (デフォルトでは 1.2MB を上限として分割される。)
   (このサイズは +Lhaca で変更できる。)
 5. (4)のファイル全てを、容量を超えないようにメールに添付して送信
   する。
   (添付ファイル総数を本文に明記すること。)
 6. 受け取った側は、全ての添付ファイルを一箇所に集めて、バッチファ
   イルを実行する。
   (操作手順は、本文に明記すること。)
 7. 分割されたファイルが結合されるので、結合された圧縮ファイルを解
   凍する。
 8. 9MBのファイルが解凍されるので、作業する。


これでどうかな!?

※他の圧縮ソフトも分割機能が備わっていると思うが・・・

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (...続きを読む

QIf myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou こちらについて教えていただきたいです。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, i + 24) = myTorikomibi
Next i
マクロを編集しようとしましたところこちらが解読できづに困っています。
こちらだけとりだして実行しながら解読していますが混乱してしまっています。ご存知の方いらっしゃいましたら教えてください。Then以降がわかりません。よろしくお願いいたします。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells...続きを読む

Aベストアンサー

こんにちは。maruru01です。

ヘルプはご覧になりましたか?
特に、Cellsについて。
Cellsは、

Cells(行番号, 列番号)

で、セルを参照します。
なので、各条件の時に、変数「myTantou」や「myTorikomibi」に格納されている値をそれらのセルに代入しているだけですが。
ただし、行番号が、

「myPrefNO + 3 - 47」
「myPrefNO + 3 - 47 - myCityNu」

などとちょっとややこしくなっていますが。
これも、変数「myPrefNO」「myCityNu」に入っている値から行番号が決まるというだけです。
例えば、
myPrefNO=60
myCityNu=2
なら、下の例は、
60+3-47-2=14
で、14行目となるということです。

QNTFS圧縮したファイルを全部まとめて戻す方法

NTFS圧縮したファイルをプロパティからひとつひとつチェックをはずして戻すのではなく、圧縮されたファイルを全部まとめて元に戻す方法ってあるのでしょうか?

Aベストアンサー

圧縮を解除したいファイルを全て選択した状態で
→プロパティ→NTFS圧縮のチェックを外す→OK

それらのファイルがフォルダに入っているなら
フォルダのプロパティからやってもいい。
(サブフォルダにも適用するか尋ねられるからOKにする)

Q【Access VBA】subフォームの空のテキストデータが認識できない

名前を入力してその人のデータを抽出したい。パスワードが空欄のときメッセージを表示させコントロールソースを変更したいのですが、できません。どなたかアドバイスお願いします
If (Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号].Value = "") Then
↑これが認識しません。「NULL」でやってもだめです。

以下がソースです。

Private Sub cmd検索_Click()

Forms![名前検索]![SUB_名前検索].Requery

If DCount("[使用者氏名]", "q_リンク名前抽出") = 0 Then
MsgBox "データがありませんよ"
Me.txt名前入力.SetFocus
End If

If (Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号].Value = "") Then
MsgBox "から"
Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号].ControlSource = "入力データフォーマットV8新人.職員番号"
End If

名前を入力してその人のデータを抽出したい。パスワードが空欄のときメッセージを表示させコントロールソースを変更したいのですが、できません。どなたかアドバイスお願いします
If (Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号].Value = "") Then
↑これが認識しません。「NULL」でやってもだめです。

以下がソースです。

Private Sub cmd検索_Click()

Forms![名前検索]![SUB_名前検索].Requery

If DCount("[使用者氏名]", "q_リンク名前抽出") = 0 Then
MsgB...続きを読む

Aベストアンサー

="" =NULL の命令はあんまり 機能発揮しないことがありますからね
ISNULL 関数を使うほうがいいと思います

Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号]
をどこか1次的な 項目へ入れて
DIM KOMOKU-1 AS VARIANT

KOMOKU-1=Forms![名前検索]![SUB_名前検索]![職員アカウント.職員番号]
IF ISNULL(KOMOKU-1) THEN
MsgBox "から"
ENDIF

---------------------------------------------------------
あと 気づいた点は
サブフォームの中の項目指定は
[Forms]![フォーム名]![サブフォーム名].[Field名]
でいいんじゃないでしょうか
Value はなくてもいい???


人気Q&Aランキング

おすすめ情報