プログラミング初級1
文字数カウント・プログラム(ステップ3)


ファイルをオープンし、全5行とその文字数および文字数の合計を表示する。


初級1のステップ3に入ります。
ステップ2は、どうでしたか? わからないところは、ありませんか? 遠慮なく質問してくださいね。
ファイルは、これからも使います。 ステップ7までまだ数回ありますから、とにかく慣れましょう。 あせりは禁物です。自分のペースで進んでくださいね。

さて、今回は「慣れる」ことが目的です。それから次のステップへの足がかりですね。 次のステップが、プログラムのロジックとしては、一番大変なところです。 では、まず、その前の段階をやってみましょう。




ステップ3の仕様


  1. マイ ドキュメントのフォルダにあるテキストファイル mojisu.txt をオープンします。
  2. mojisu.txt の1行目を読み込んで、その内容と文字数をメッセージボックスで表示します。
  3. mojisu.txt の2行目を読み込んで、その内容と文字数をメッセージボックスで表示します。
  4. mojisu.txt の3行目を読み込んで、その内容と文字数をメッセージボックスで表示します。
  5. mojisu.txt の4行目を読み込んで、その内容と文字数をメッセージボックスで表示します。
  6. mojisu.txt の5行目を読み込んで、その内容と文字数をメッセージボックスで表示します。
  7. mojisu.txt の全文字数をメッセージボックスで表示します。
  8. mojisu.txt を閉じます。



ステップ3のプログラム・ソース



  1. Sub Count3()
  2. '文字数カウント・プログラム
  3. 'ステップ3:ファイルをオープンし、全5行とその文字数
  4. ' および文字数の合計を表示する。
  5. Dim gyo As String
  6. Dim moji_su As Long
  7. Dim gokei As Long
  8. gokei = 0 '合計用変数の初期化
  9. Open "C:\My Documents\mojisu.txt" For Input As #1 'ファイルのオープン
  10. Line Input #1, gyo 'ファイルから1行読み込む(先頭行)
  11. moji_su = Len(gyo) '読み込んだ行の長さ(文字数)を '変数 moji_su へ入れる
  12. gokei = moji_su '合計用変数に文字数を入れる
  13. MsgBox "先頭行は 「" & gyo & "」" '読み込んだ1行目の中身を表示する
  14. MsgBox "文字数は " & moji_su '1行目の文字数を表示する
  15. Line Input #1, gyo 'ファイルから1行読み込む(2行目)
  16. moji_su = Len(gyo) '行の長さを変数 moji_su へ入れる
  17. gokei = gokei + moji_su '合計用変数 gokei に文字数を加算する
  18. MsgBox "2行目は 「" & gyo & "」" '読み込んだ2行目の中身を表示する
  19. MsgBox "文字数は " & moji_su '2行目の文字数を表示する
  20. Line Input #1, gyo 'ファイルから1行読み込む(3行目)
  21. moji_su = Len(gyo) '行の長さを変数 moji_su へ入れる
  22. gokei = gokei + moji_su '合計用変数 gokei に文字数を加算する
  23. MsgBox "3行目は 「" & gyo & "」" '読み込んだ3行目の中身を表示する
  24. MsgBox "文字数は " & moji_su '3行目の文字数を表示する
  25. Line Input #1, gyo 'ファイルから1行読み込む(4行目)
  26. moji_su = Len(gyo) '行の長さを変数 moji_su へ入れる
  27. gokei = gokei + moji_su '合計用変数 gokei に文字数を加算する
  28. MsgBox "4行目は 「" & gyo & "」" '読み込んだ4行目の中身を表示する
  29. MsgBox "文字数は " & moji_su '4行目の文字数を表示する
  30. Line Input #1, gyo 'ファイルから1行読み込む(5行目)
  31. moji_su = Len(gyo) '行の長さを変数 moji_su へ入れる
  32. gokei = gokei + moji_su '合計用変数 gokei に文字数を加算する
  33. MsgBox "5行目は 「" & gyo & "」" '読み込んだ5行目の中身を表示する
  34. MsgBox "文字数は " & moji_su '5行目の文字数を表示する
  35. MsgBox "ファイルの文字数は " & gokei '合計用変数 gokei の値を表示する
  36. Close #1 'ファイルのクローズ
  37. End Sub




解       説


うわっ、長いソースですね〜。(笑) しかし、恐れる(?)ことはありません。 同じことを繰り返して書いているだけですから。

  1. 1行目は、Count3() という サブルーチン の開始です。
    今回はステップ3なので、Count3 という名前にしてサブルーチンを作成しています。


  2. 2〜4行目は、コメントです。
    さて、コメント とは、何だったでしょう? 説明できますか? (^^) 「まだ何だかよくわかんない」という人は、また実行の時に、F8 キーを押していってみましょう。 とにかく「慣れる」ことが一番大切です。


  3. 5行目は、変数の宣言です。
    Dim は何でしたか? どういう意味でしたか? Dim の次は、何が来ましたか?
    Dim 変数名 As データ型
    という構文でしたね。変数名は、a とか b とかいう名前じゃなくて、 ちゃんと意味のある名前を付けましょうね。 あとから見直すと、a とか b とかいう名前じゃ、なんのことだか さっぱりわからなくなりますよ。 5行目は、テキストファイル mojisu.txt を1行ずつ読み込むたびに、 その行の内容を入れておくための変数 gyo を文字列型で宣言しています。 (変数とは、なにか値を入れるものですね。)


  4. 6行目も、変数の宣言です。
    6行目の変数は、moji_su という名前で、Long(長整数型)で宣言しています。
    この変数 moji_su は、入力された文字列の文字数を入れるために用意しました。 これは、ステップ2と同じです。

    ところで、どうして長整数型にしているのでしょうか?
    まず、Len 関数の VBヘルプを見てみますと、
     「指定した文字列の文字数または指定した変数に必要なバイト数を表す長整数型 (Long) の値を返します。」
    と書いてあります。 つまり Len 関数は、その結果(長さ)を長整数型で返してくるのです。 (変数以外も、すべてのデータにはデータ型が決められているのですよ。) だから Len 関数の結果を入れる変数も、同じ長整数型にしておくと、問題がないと言えるでしょう。 「なんとなく」あるいは「たまたま」長整数型にしているわけではなかったのです。(笑)
    こんな風に、関数の結果を入れる変数を、関数の戻り値のデータ型と同じにしておくのは、慎重なやり方と言えます。 望ましいやり方ではありますが、実際はなかなかそこまで考えたりしません。 (^^; 私だったら、メモリをケチって、Integer(整数型)にしてしまうところです。(笑) しかし、まぁ、皆様には「お手本」のプログラムをお見せしないとダメですね。
    ちなみに、「関数の結果を入れる変数」と「関数の戻り値」のデータ型が違うと、 バグ(プログラム上のミス)が発生する可能性があります。


  5. 7行目も、変数の宣言です。
    ステップ3から違う部分は、各行の文字数の合計を計算する点です。 この合計が、ファイル全体の文字数になります。 その合計用の変数を、gokei という名前で、Long(長整数型)で宣言しています。 moji_su が長整数型ですから、moji_su を合計していく gokei も長整数型として データ型を合わせているのです。
    プログラミングって、こまかいところまで気を使うでしょ? でも、一度データ型の違いでバグを出して苦労してみれば、 データ型の大切さが理解できるようになるでしょう。 (あんまり苦労したくない?)


  6. 8行目は、変数の初期化です。
    これから使用する変数は、まず使用前に初期化することをお勧めします。
    「初期化」とは、使用前に一定の値を入れて「クリア」しておくことです。 通常、数字には 0 を、文字列には "" を入れます。 もちろん、0 や "" 以外の値を入れておくこともあります。
    8行目は、合計用の変数 gokei に 0 を入れています。 こういう場合、「変数 gokei をゼロクリアする」と言います。
    さて、代入の意味の = には、慣れましたか? = は ← の意味でしたね。(^^)

    でも、gokei だけ初期化するの? 他の変数は? と言う方、ごもっともなご意見です。 本当は、全変数を初期化しておいたほうがいいです。 ただ、私(講座作成者)がズボラなのです。(^^; moji_su も gyo も、最初に出てくるところが、=(代入)なので、 初期化で代入するのも、最初に出てくるところで代入するのも変わりない、 なんて考えちゃって・・・あはは。(マネしないでね。)
    では、皆様は moji_su と gyo を初期化してください。 どうしますか?
    「数字には 0 を、文字列には "" を入れます。」でしたね。


  7. 9行目は、仕様の 1.の部分にあたります。
    マイ ドキュメントのフォルダにある テキストファイル mojisu.txt をオープンします。
    Open というステートメント(命令)は、 何かのファイルを開くことを、コンピューターに要求します。 次の "C:\My Documents\mojisu.txt" が開くべきファイル名です。 これは、ステップ2と同じですね。
    Open ファイル名 For Input As #1
    が構文です。ファイル名は必ず " ではさんでください。


  8. 10行目は、ファイルから入力(読み込み)された文字列を gyo という変数に入れます。
    仕様の 2.の前半分 「mojisu.txt の1行目を読み込んで、」にあたります。
    Line Input # は、開いてあるファイルから1行読み込めというステートメント(命令)です。 これも、ステップ2と同じです。
    Line Input #1, 文字型変数名
    が構文です。


  9. 11行目は、入力された文字列の文字数を計算するところです。
    ファイルから入力(読み込み)された文字列は、10行目で gyo という変数に入れました。 だから gyo の長さを出せば、それがつまり入力された文字列の文字数になります。
    文字列の長さは Len() という 関数 を使います。ここもステップ2と同じですね。
    長整数型変数名 = Len(文字列)
    が構文です。 Len() の括弧 () の中に、長さを出したい文字列を入れます。→ Len(gyo)
    その結果(長さ)を、moji_su という変数に入れます。→ moji_su = Len(gyo)
    = は ← の意味でしたね。 OK???


  10. 12行目は、ファイルの全文字数の計算です。 さて、ステップ2と違う点の1つです。
    1行の文字数を出しただけでなく、各行の文字数を合計していってファイルの全文字数を出します。 今は、先頭の1行を読んだだけですので、まず1行目の文字数を合計用の変数 gokei に代入します。 = は ← の意味でしたね。ただいま gokei には、1行目の文字数が入りました。


  11. 13行目と14行目は、仕様の 2.の後「その内容と文字数をメッセージボックスで表示します。」にあたります。
    ステップ2と同じです。


  12. 15〜19行目は、2行目の処理です。
    仕様の 3. 「mojisu.txt の2行目を読み込んで、その内容と文字数をメッセージボックスで表示します。」 にあたります。
    10〜14行目(1行目の処理)の繰り返しです。 違うところは、ファイルの全文字数 gokei の計算です。 12行目で、gokei には、1行目の文字数が入りました。 17行目で、12行目と同じく gokei = moji_su としてしまうと、 gokei には、2行目の文字数が入り、1行目の文字数は消えてしまいます。 それで、gokei = gokei + moji_su としています。
    右辺の gokei には、1行目の文字数が入っています。 moji_su には、2行目の文字数が入っています。 だから、gokei と moji_su を足すと、2行目までの文字数が入りますね。 gokei(右辺) と moji_su を足した結果を、また gokei(左辺) に入れ直します。
    数学の式だと考えると、まったく変ですね〜。 でも、= はここではイコールの意味ではなく、←(代入)の意味なんですよね。 (^^)


  13. 20〜24行目は、3行目の処理です。
    仕様の 4. 「mojisu.txt の2行目を読み込んで、その内容と文字数をメッセージボックスで表示します。」 にあたります。
    15〜19行目(2行目の処理)の繰り返しです。
    22行目で、3行目までの文字数が gokei に入ります。


  14. 25〜29行目は、4行目の処理です。
    仕様の 5. 「mojisu.txt の2行目を読み込んで、その内容と文字数をメッセージボックスで表示します。」 にあたります。
    15〜19行目(2行目の処理)の繰り返しです。
    27行目で、4行目までの文字数が gokei に入ります。


  15. 30〜34行目は、5行目の処理です。
    仕様の 6. 「mojisu.txt の2行目を読み込んで、その内容と文字数をメッセージボックスで表示します。」 にあたります。
    15〜19行目(2行目の処理)の繰り返しです。
    32行目で、5行目までの文字数が gokei に入ります。 これでやっと gokei は、ファイルの全文字数になりました。 ファイルの全行数が、5行ですから。


  16. 35目は、「ファイルの文字数は」という文字と、ファイルの全文字数とを表示します。
    仕様の 7. 「mojisu.txt の全文字数をメッセージボックスで表示します。」 にあたります。
    「ファイルの文字数は」という文字と、ファイルの全文字数とを & でつないでいます。


  17. 36行目は、使用したファイルを閉じます。
    仕様の 8.の部分にあたります。開いたものは、必ず閉じてくださいね。
    Close #1
    が構文です。いまのところは、#1 のままで覚えましょう。 ファイルは使用前には必ず開いて、使用後は必ず閉じないと、エラーになります。 これは、「コンパイルエラー」でなく、「実行時エラー」になります。


  18. 37行目は、サブルーチンの終了を表します。
    お疲れ様でした〜。



ステップ3実行前の準備


ステップ2で使用したのと同じファイルを使います。 もしまだ準備していない方がいましたら、ステップ2を見て準備してください。 ファイルの中身は、こうなっています。
abcde
bcde
cde
de
e




実       行


    では実行確認です。

  1. カーソルの位置を確認してから、F5キーを押してください。

  2. いきなりエラーメッセージが出た人!

    こんなエラー画面ですか?
    イメージ

    だとしたらステップ2と同じですので、ステップ2をやってから、ここへ戻ってきてください。

  3. 上手く動けば、「abcde」がメッセージボックスで表示されます。

    イメージ

    「OK」をクリックすると、

  4. ちゃんと正しい文字数 5 が表示されましたか?

    イメージ

    ここまでは、ステップ2と同じですね。
    「OK」をクリックすると、次から次へとメッセージボックスが現われます。 そして、順番にファイルの中身と文字数を表示していきます。 ちゃんと表示されているかどうか、確認してくださいね。

  5. 最後のメッセージボックスです。

    イメージ


    ファイルの文字数計算の方法がわかりましたか? もちろん、今はどのファイルでも、先頭から5行までしか計算できませんね。 次回は、その辺を変更します。 いよいよ全ステップのメインです。
    慣れるためには、マイ ドキュメントのフォルダにある他の「テキストファイル」に変えて、 そのファイルの先頭5行目と文字数と合計がちゃんと表示されるかやってみてね。



入れ替え1


ではまた、ソースの行の順番をでたらめにしたやつを、ここに書いておきます。 正しい順番に並べ替えてください。もちろん、正解を見ずにね。 それで正しいと思ったやつをコピーして、エラーが出ないかどうか試してみてください。 お遊びの感覚で出来るといいですね。




MsgBox "文字数は " & moji_su            '2行目の文字数を表示する
Line Input #1, gyo                      'ファイルから1行読み込む(先頭行)
MsgBox "ファイルの文字数は " & gokei    '合計用変数 gokei の値を表示する
Dim moji_su As Long
moji_su = Len(gyo)                      '行の長さを変数 moji_su へ入れる
gokei = gokei + moji_su                 '合計用変数 gokei に文字数を加算する
MsgBox "2行目は 「" & gyo & "」"       '読み込んだ2行目の中身を表示する
Dim gyo     As String
MsgBox "先頭行は 「" & gyo & "」"       '読み込んだ1行目の中身を表示する
'文字数カウント・プログラム
Close #1                                'ファイルのクローズ
Line Input #1, gyo                      'ファイルから1行読み込む(3行目)
MsgBox "4行目は 「" & gyo & "」"       '読み込んだ4行目の中身を表示する
gokei = moji_su                         '合計用変数に文字数を入れる
moji_su = Len(gyo)                      '行の長さを変数 moji_su へ入れる
Line Input #1, gyo                      'ファイルから1行読み込む(2行目)
MsgBox "文字数は " & moji_su            '5行目の文字数を表示する
Open "C:\My Documents\mojisu.txt" For Input As #1   'ファイルのオープン
gokei = gokei + moji_su                 '合計用変数 gokei に文字数を加算する
MsgBox "3行目は 「" & gyo & "」"       '読み込んだ3行目の中身を表示する
'             および文字数の合計を表示する。
gokei = 0                                   '合計用変数の初期化
MsgBox "文字数は " & moji_su            '1行目の文字数を表示する
MsgBox "文字数は " & moji_su            '3行目の文字数を表示する
Line Input #1, gyo                      'ファイルから1行読み込む(4行目)
moji_su = Len(gyo)                      '行の長さを変数 moji_su へ入れる
Sub Count3()
gokei = gokei + moji_su                 '合計用変数 gokei に文字数を加算する
'ステップ3:ファイルをオープンし、全5行とその文字数
Dim gokei   As Long
End Sub
MsgBox "文字数は " & moji_su            '4行目の文字数を表示する
Line Input #1, gyo                      'ファイルから1行読み込む(5行目)
moji_su = Len(gyo)                      '行の長さを変数 moji_su へ入れる
gokei = gokei + moji_su                 '合計用変数 gokei に文字数を加算する
MsgBox "5行目は 「" & gyo & "」"       '読み込んだ5行目の中身を表示する
moji_su = Len(gyo)                      '読み込んだ行の長さ(文字数)を
                                        '変数 moji_su へ入れる




入れ替え2


はい、コメント抜きです。
ヒント:同じ行をまとめると、ずっと見やすくなります。(同じことを繰り返していますから。)




MsgBox "5行目は 「" & gyo & "」"
Line Input #1, gyo
gokei = gokei + moji_su
moji_su = Len(gyo)
MsgBox "文字数は " & moji_su
moji_su = Len(gyo)
MsgBox "ファイルの文字数は " & moji_su
Line Input #1, gyo
MsgBox "文字数は " & moji_su
gokei = moji_su
Line Input #1, gyo
Dim moji_su As Long
MsgBox "2行目は 「" & gyo & "」"
Dim gyo     As String
MsgBox "先頭行は 「" & gyo & "」"
Close #1
MsgBox "4行目は 「" & gyo & "」"
MsgBox "文字数は " & moji_su
MsgBox "3行目は 「" & gyo & "」"
gokei = 0
gokei = gokei + moji_su
Line Input #1, gyo
MsgBox "文字数は " & gokei
moji_su = Len(gyo)
Sub Count3()
gokei = gokei + moji_su
Dim gokei   As Long
Line Input #1, gyo
Open "C:\My Documents\mojisu.txt" For Input As #1
End Sub
MsgBox "文字数は " & moji_su
moji_su = Len(gyo)
gokei = gokei + moji_su
moji_su = Len(gyo)




戻る

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル