見出し画像

0から始めるPHPプログラミング #1-4 VBAで入力チェックを実装する その4

こんにちは。

前回はループ処理と関数を学習しました。デバッグをやりやすくする方法(Debug.Print)も最後にお伝えしましたね。

この先の実装を進めるための役者はそろいました。

ここからは入力チェックの実装をガツガツと進めていきます。


入力チェックを実装する ~中級編その3~

今、ソースがどんな状態かというと・・・

Sub validation2()

    '項目名
    Dim itemName As String
    '項目値
    Dim itemValue As String
    'アスタリスクの出現ポイント
    Dim asteriskPoint As Integer
    'メッセージ
    Dim message As String

    For i = 4 To 30
   
        '項目名を代入
        itemName = Cells(i, 1).Value
       
        '項目値を代入
        itemValue = Cells(i, 2).Value
   
        '項目名中のアスタリスクの出現位置を代入
        asteriskPoint = InStr(itemName, "*")
          
        If asteriskPoint > 0 Then
           
            Debug.Print i & "行目の項目:" & itemName & vbCrLf & _
                        " アスタリスクが登場するのは " & asteriskPoint & "番目です。"
          
        End If
      
    Next
   
End Sub

001_今のソース

こうでしたね。

InStr関数のおかげで、アスタリスクの文字が項目名に含まれるかどうかを検証することができる、すなわち必須チェックの対象項目を絞ることができる、という話でした。

では、ここからはそのIf文の中の処理を書いていくだけです。

002_チェックされる個所

必須項目かどうか?をチェックするのは赤枠で囲ったセルですが、実際に値があるのかどうか?をチェックしたいのは青枠のセルです。

入力値を格納する変数は前回一緒に宣言しましたね。itemValueです。

    '項目値
    Dim itemValue As String

ループ中に変数に値を代入する処理も書きました。

        '項目値を代入
        itemValue = Cells(i, 2).Value

これでしたね。


では、ここからは必須チェックの対象項目の場合、値が設定されているかどうかを検証する処理を書いていきましょう。

必須チェックの対象項目の場合にのみ行う処理を書く、ということはどこにソースを追加するかというと・・・

003_ソースの追加位置

ここですね。アスタリスクが項目名の中に含まれる、すなわち必須項目というわけですから。

それでは以下のソースを下図のように追記してください。

'入力値があるかどうかを検証する
If itemValue = "" Then
  
  'アスタリスクを削除
  itemName = Replace(itemName, "*", "")
  
  'エラーメッセージの設定
  message = message & itemName & "が入力されていません。" & vbCrLf

End If

004_ソース追加

赤枠の部分に追加しましょう。

前回書いたDebug.Printはあってもなくても処理に影響しないので、残しておきます。イミディエイトウィンドウに出力するだけなので、ユーザに対しては何もしません。開発者用のコードということになります。

実際の開発でもエラー発生時に原因を素早く見つけるための助けとしてデバッグ用コードを残しておくことはあります。


そして、今まで触れてこなかったのですが、ForループやIf文のような制御構文がネスト(入れ子)になるときはインデントに気を付けてください。

インデントとは字下げのことです。

005_インデント注意

補助線を入れてみました。このようにForIf を書くときはその中の処理は1段下げて記載することで、読みやすくなります。

ちなみにこの1段はTabキー1回分か半角スペース4つを私は使っています。本文中にソースを貼ったときは微妙に異なってるかもしれません。あなたの開発画面に貼る時はよしなに調整してください。

006_インデント説明

一応検索結果も貼っておきます。↑画像クリックで拡大表示。


さて、ソースコードの解説です。

'入力値があるかどうかを検証する
If itemValue = "" Then
  
    'アスタリスクを削除
    itemName = Replace(itemName, "*", "")
  
    'エラーメッセージの設定
    message = message & itemName & "が入力されていません。" & vbCrLf

End If

最初のIf文はもうわかりますよね。itemValue変数にもつ値が空文字かどうかを検証しています。空文字だった場合はエラーとしてユーザに教えてあげたいからエラーメッセージを出すための処理をしているIfの中に進みます。

次に新しい関数が出てきます。

  'アスタリスクを削除
  itemName = Replace(itemName, "*", "")

これはReplace(りぷれいす)関数といいます。

第一引数に指定した値の中に、第二引数に指定した値があれば、第三引数の値に置き換える、という処理をしてくれます。

つまり「ふりがな*」を第一引数に指定した場合、第二引数である「*」を第三引数の空文字に置き換えるので、「ふりがな」という文字列が返ってきます。

この処理をしなかったら

007-2_replace関数しない版ポップアップ

このようなポップアップになりますが、この処理をすることで

007-3_replace関数する版ポップアップ

このようなポップアップになります。アスタリスクの有無に違いがありますね。細かな違いですが、これもユーザに不自然さを感じさせないための工夫です。


  'アスタリスクを削除
  itemName = Replace(itemName, "*", "")

ここの処理、引数にitemName変数を渡していますが、戻り値の代入先もitemName変数を使っています。こういう使い方もアリです。

もちろん、戻り値を受け取る用の変数を別に宣言しておくのも良いのですが、今回の場合、引数に渡すのも項目名、返ってくる値も項目名、と値の意味合いが変わらないので、同じ変数を使用しています。

格納してある値の意味合いと変数名は一致するように気を付けましょう。これはこの先もくどいくらい何度も言っていきます。


次。

  'エラーメッセージの設定
  message = message & itemName & "が入力されていません。" & vbCrLf

End If

これは見慣れたソースですね。初級編での入力チェックは項目名もメッセージの中にべた書きしていましたが、今回は動的にメッセージを組み立てるので、項目名はitemName変数を使用するようにしています。

End IfはIf文の終了ですね。


ここまでの処理で、必須チェックエラーのメッセージは組み立てられました。でも、出力の処理をまだ書いていませんね。追加しましょう。

以下ソースを下図のようにお願いします。

If Len(message) = 0 Then

    '正常メッセージの設定
    message = "入力チェックを行いました。問題ありません。"

End If

MsgBox message

007-1_ソース追加

ここ、やってることは今までと同じなんだけどちょっとだけひねりを加えています。今までは、message変数に値が設定されているかどうかを

If message = "" Then

こんな風に書いていましたが、今回はLen関数を使用しています。

Len関数のLenはLength(れんぐす)の略です。第一引数に指定した値の長さ(=文字の数)を返してくれるんですね。

なので、それが0ってことは空文字、つまりエラーがなかったという意味になるので、動作としてはこれまでとまったく同じです。

プログラミングではやりたいことに対して実現方法が複数あることがよくあります。その時その時の最適を選び取っていきましょう(といっても、最初のうちは何が最適かわからないのでできる方法でOKです)。


Len関数の後はこれまでと同じです。

If Len(message) = 0 Then

    '正常メッセージの設定
    message = "入力チェックを行いました。問題ありません。"

End If

MsgBox message

正常時のメッセージを微妙に変えているけど、特に意味はありません。

End IfでIf文を閉じて、最後にMsgBoxでポップアップにmessage変数の内容を表示する、という流れですね。


さてさて、他の列にも項目はあるのですが、ひとまず、1列目の項目の必須チェックの実装ができました。それでは動作確認してみましょう。

まずは児童のふりがな、保護者の氏名、メールアドレスを空文字の状態で実行してみます。

008_動作確認1

すると・・・

009_動作確認2

はい、そうですね。想定通りの結果を得られました。3項目がエラーに引っ掛かっています。ヤッタネ(∩´∀`)∩。


では、次にこれらの項目も埋めた状態で実行してみましょう。

010_動作確認3

するとすると・・・

011_動作確認4

!!!

なんと!?なぜ!?

メールアドレスは入力されているのに・・・!



はい。

実はこれもただ書いたとおりに動いた結果なんですよね。解説しましょう。

012_1列目2列目

上図を見ていただくとわかりやすいのですが、今回、項目名を1列目から、項目値を2列目から取得しました。ソースコードで言うと以下の部分です。

        '項目名を代入
       itemName = Cells(i, 1).Value
       
       '項目値を代入
       itemValue = Cells(i, 2).Value

メールアドレスの値があるのは3列目なんですよね。そして入力フォームの17行目2列目はセルが結合していてわかりにくいけど空文字なんです。


実際の処理の流れを図に反映してみると下図のようになります。赤枠のセルに対して必須チェックの対象かどうかを検証し、対象だったら青枠のセルに対して値があるかどうかを検証しています。

013_処理図解

この時、結合しているセルの値はどのセルの所属になるのか?が気になると思います。

例えば、児童のふりがなに「たなかたろう」と入力していますが、システム的にはB4セル、C4セル、D4セル、E4セルのそれぞれに「たなかたろう」という値を持っているわけではないんです。

ひとつのセルだけが値を持っており、それ以外は空文字です。

セルが結合している場合、その結合セルに入力された値の所在は結合範囲内の最も左上のセルになります。

014_セルの所属

ふりがなの入力欄にカーソルを合わせると、左上のセル番地のところに「B4」って記載されているじゃないですか。これが実際の所属です。


この理屈を先ほどのメールアドレスに当てはめてみると・・・

015_メールアドレスの番地

「メールアドレス*」という項目名はA17セル、つまり1列目だからいいんですが、B列は結合に使っているので、実際は空文字ということになります。

だから、入力欄であるC17セルに値を入力されても、そもそもチェックされていない、という現象が起きてしまうんです。


ここまでの話を踏まえて、今一度入力フォームを見てみてください。

もう一か所、怪しいところありませんか?


メールアドレスは入力しているのに空文字と誤判定されてしまうバグでしたが、もう一つは値を入力しなくても値があると誤判定されてしまうバグです。

メールアドレスの話からして、項目名のセルを結合しているかどうか?がポイントでした。その視点で今一度入力フォームを見返してみると・・・

016_住所の罠

はい、「住所*」もセルを結合していますね。A6セル、A7セルを結合しているので、「住所*」という値の所属は先ほど言った最も左上に該当するA6セルです。なので、項目値のチェックはB6セルに対してされてしまう。

ただ、こちらは若干メールアドレスとは事情が異なります。

結合していることが問題なのではなく、項目値をチェックするはずのB6セルに「郵便番号*」を置いてしまっていることが問題です。

実際に実行結果で説明すると・・・

017_住所の罠解説1

この状態(住所が入力されている)で、住所が必須チェックに引っ掛からないのは想定通り、望んだ動作ですが・・・

018_住所の罠解説2

このように住所が入力されていない場合も必須チェックに引っ掛かりません。

なぜなら何度やっても実際に住所の必須チェックの対象になっているのは今「郵便番号*」という値があるB6セルだからです。

ではどうするか?という話になりますが、簡単な方法としては・・・

019_フォーム改造

こういうのがあります。郵便番号の項目を1行下げました。こうすれば住所の必須チェックは正常に動作します。これ、あなたはやらなくていいです。採用しないので。

だいたい世の中のいろんな記入票って郵便番号を住所より先に書かせるフォームになっていますよね。これも大事なポイントでユーザに対する配慮、わかりやすさです。世の慣例・慣習に合わせます。

システムや実装のしやすさという都合ユーザへの配慮という都合は時にぶつかります。

ですので、郵便番号の位置は元通りにするとして、今回は次のような方法をとりましょう。


・必須チェックの対象は項目名にアスタリスクがついているかつ、結合していないこととする


です!アスタリスクがついているだけでは正常に動作しないことがわかりましたからね。

では、実装です。

先ほど「アスタリスクがついているかつ~」という話をしたので、手を加えるのは必須チェックの対象かどうかを判断している箇所です。

If asteriskPoint > 0 Then

ここですね。これを・・・

        '必須チェックの対象かどうかを評価する
        If asteriskPoint > 0 And Not Cells(i, 1).MergeCells Then

020_ソース改修

こんな風に改修します。ついでにコメントつけました。

前回、世界のナベアツのループ処理をしたときに、3の倍数もしくは3がつくときアホになる、ということでOR条件(おあじょうけん)を使いました。

今回はそれとセットで覚えてほしいAND条件の登場です。そのまま、あんどじょうけんと読みます。

アスタリスクがついているだけではだめ、結合していないだけでもだめ。アスタリスクがついている、かつ結合していないときに必須チェックの対象としたい、というときに使います。

2つの条件をAndでつなぎます。

If 条件A And 条件B Then
 条件Aと条件Bのどちらも満たしたときに実施する処理
END If

(条件A、条件Bの2つだけで説明していますが、条件はもっと繋げられます。条件Aかつ条件Bかつ条件Cかつ条件Dかつ・・・みたいに。)

さて、処理の内容ですが・・・

        '必須チェックの対象かどうかを評価する
        If asteriskPoint > 0 And Not Cells(i, 1).MergeCells Then

これはCells関数が提供してくれる数ある情報の中のひとつですね。その情報とはセルが結合しているかどうか?です。前回Fontというのが出てきましたが、こんなのもあるんですね。

Cells関数が持っているMergeCellsは結合していたらTrue(とぅるー)が、結合していなかったらFalse(ふぉるす)が設定されています。

前回説明した真偽値(しんぎち)ですね。Trueが真で、Falseが偽。

MergeCellsは結合していたらTrueだけど、ここで使用するIf条件としては結合していなかった場合に中の処理に進みたいので、結果を反転させる必要があります。FalseをTrueに、TrueをFalseとして判断したいです。

        '必須チェックの対象かどうかを評価する
        If asteriskPoint > 0 And Not Cells(i, 1).MergeCells Then

そのために2つ目の条件式の前(Andの次のところ)に「Not」を付けています。これで、2つ目の条件式は結果が反転します。

以前、郵便番号の正規表現チェックでNotが出てきたときはNot()として括弧で対象の条件を囲んでいましたが、囲まなくてもOKです。


さて、これで動作確認をしてみましょう。今の状態としては項目名にアスタリスクがついていても、結合していたら必須チェックの対象外です。

要するに住所とメールアドレスを除いては正常に動作すればOKです。

ではまず、住所とメールアドレスに値が入っているパターン。

021_動作確認1

はい、正常動作です。この2項目は無視されているわけですから。

続いて、住所とメールアドレスに値が入っていないパターン。

022_動作確認2

はい、同じく、想定通りの動きですね。この2項目は無視されているので。

最後に、その他のチェック対象項目に値がないパターン。

023_動作確認3

はい、しっかりとチェックに引っ掛けてくれています。

動作確認としてはOKです。

この先もテストや動作確認の手法について、細かくお伝えすることはあまりないかもしれないのですが、ひとつ補足させてください。

今やった3つのパターンの動作確認。こんなことを思った方いませんか?

最初の2パターン、住所とメールアドレスに値が入っている/入っていないのケースは値が入っているパターンの検証だけでよくないかね。メールアドレスに値があるにもかかわらず誤動作した流れがあるんだから

いい疑問ですね。そうです、確かにメールアドレス項目に値があるのにエラーとして検出されてしまう、という事象を経て、住所項目の抱えるエラーを認識し、結合セルを必須チェックの対象外とする対策を講じました。

だから、最初に誤動作したケースにきちんと対応できているかを確認すればいいのではないか、と。

実はこれもルール、というか確立されたテスト手法に則ってやっているんです。


ブラックボックステスト


という言葉があります。これは機能に対してその内部構造やソースコードを見ることなく、仕様(想定)通りに動いているかを確認する方法です。

ブラックボックスは中身(内部構造)が見えない、という風に捉えてください。だから、ソースコードを知っている体ではテストしないのです。

中身を知らない体として、純粋に機能が仕様を満たしているかを確認します(逆にホワイトボックステストというものもあります)。

あとは単純に、とある修正が既存の正常動作に悪影響を及ぼしてしまう、ということもありえるので、修正後に元々の正常動作がきちんと動くかも確認するんです。

これを退行テスト回帰テストリグレッションテストといいます。

なにかを修正した結果、もともと正常動作していた別の場所が不具合を起こしてしまうことをデグレードと言います。品質が低下する、ということです。この言葉を使うときはだいたい「デグレ」と略して言いますね。


入力チェックを実装する ~中級編その4~

それでは、この実装方法が孕む問題を把握したところで、実装を進めていきましょう。

今から冗談みたいなソースを組んでいただきます。

これも次の学習内容の布石となるので、ツッコミは勘弁してください。


まず、今1列目の項目について必須チェックするために指定している値は・・・

024_列指定

この3つの数字です。1,2,1を指定していますね。上から

・項目名を取得するための列指定
・項目の入力値を取得するための列指定
・結合しているかどうかを確認するセルを取得するための列指定

です。

で、他の項目にも必須チェックを実施するために、同じ処理を他の列にも展開したいですと。

025_ほかの列指定

対象は2列目、6列目、9列目です。項目名がある列ですね。

これらの列にも同様にチェックを実施するために、先ほどのループ処理をこの3列分にも実施したいです。

ですから、ForからNextまでをまるっとコピーして、4回連続ループ処理を実施するようにしましょう。

026_コピーペースト説明

上図の①の範囲をコピーし、②のところに3回貼り付けてください。

ループが4回連続するわけですが、先ほど示した例の3つの列を指定する値を以下のようにします。

ループ1・・・1,2,1
ループ2・・・2,3,2
ループ3・・・6,7,6
ループ4・・・9,10,9

ループ箇所は以下のようになります。

    For i = 4 To 30
  
       '項目名を代入
       itemName = Cells(i, 1).Value
      
       '項目値を代入
       itemValue = Cells(i, 2).Value
  
       '項目名中のアスタリスクの出現位置を代入
       asteriskPoint = InStr(itemName, "*")
       
       '必須チェックの対象かどうかを評価する
       If asteriskPoint > 0 And Not Cells(i, 1).MergeCells Then
       
           '入力値があるかどうかを検証する
           If itemValue = "" Then
 
               'アスタリスクを削除
               itemName = Replace(itemName, "*", "")
 
               'エラーメッセージの設定
               message = message & itemName & "が入力されていません。" & vbCrLf

           End If
          
           Debug.Print i & "行目の項目:" & itemName & vbCrLf & _
                      " アスタリスクが登場するのは " & asteriskPoint & "番目です。"
         
       End If
     
   Next
   
   For i = 4 To 30
  
       '項目名を代入
       itemName = Cells(i, 2).Value
      
       '項目値を代入
       itemValue = Cells(i, 3).Value
  
       '項目名中のアスタリスクの出現位置を代入
       asteriskPoint = InStr(itemName, "*")
       
       '必須チェックの対象かどうかを評価する
       If asteriskPoint > 0 And Not Cells(i, 2).MergeCells Then
       
           '入力値があるかどうかを検証する
           If itemValue = "" Then
 
               'アスタリスクを削除
               itemName = Replace(itemName, "*", "")
 
               'エラーメッセージの設定
               message = message & itemName & "が入力されていません。" & vbCrLf

           End If
          
           Debug.Print i & "行目の項目:" & itemName & vbCrLf & _
                      " アスタリスクが登場するのは " & asteriskPoint & "番目です。"
         
       End If
     
   Next
   
   For i = 4 To 30
  
       '項目名を代入
       itemName = Cells(i, 6).Value
      
       '項目値を代入
       itemValue = Cells(i, 7).Value
  
       '項目名中のアスタリスクの出現位置を代入
       asteriskPoint = InStr(itemName, "*")
       
       '必須チェックの対象かどうかを評価する
       If asteriskPoint > 0 And Not Cells(i, 6).MergeCells Then
       
           '入力値があるかどうかを検証する
           If itemValue = "" Then
 
               'アスタリスクを削除
               itemName = Replace(itemName, "*", "")
 
               'エラーメッセージの設定
               message = message & itemName & "が入力されていません。" & vbCrLf

           End If
          
           Debug.Print i & "行目の項目:" & itemName & vbCrLf & _
                      " アスタリスクが登場するのは " & asteriskPoint & "番目です。"
         
       End If
     
   Next
   
   For i = 4 To 30
  
       '項目名を代入
       itemName = Cells(i, 9).Value
      
       '項目値を代入
       itemValue = Cells(i, 10).Value
  
       '項目名中のアスタリスクの出現位置を代入
       asteriskPoint = InStr(itemName, "*")
       
       '必須チェックの対象かどうかを評価する
       If asteriskPoint > 0 And Not Cells(i, 9).MergeCells Then
       
           '入力値があるかどうかを検証する
           If itemValue = "" Then
 
               'アスタリスクを削除
               itemName = Replace(itemName, "*", "")
 
               'エラーメッセージの設定
               message = message & itemName & "が入力されていません。" & vbCrLf

           End If
          
           Debug.Print i & "行目の項目:" & itemName & vbCrLf & _
                      " アスタリスクが登場するのは " & asteriskPoint & "番目です。"
         
       End If
     
   Next

いつもならソースコードの画像も貼り付けるところですが、長いので、以下にお手本ファイルをあげます。

不安な方は答え合わせしてください。


それでは、動作確認します。

まずは、各必須チェック対象項目に値がある状態。

027_動作確認1

はい、問題ありませんね。

次に、各必須チェック対象項目に値がない状態。

028_動作確認2

はい、こちらもここまでの実装内容を鑑みると想定通りの動作です。

「住所」項目、「児童との続柄」項目、「メールアドレス」項目がエラーメッセージの中に含まれていませんが、セルを結合している場合は対象外とするIf文を書いたのでその通りに動いています。

さて、このエラーメッセージを見て、項目の順序が気になったと思います。

ユーザの入力順序は一般的に考えて行の順ですが、エラーメッセージは列の順に項目を出していますからね。これは上級編の実装でやっていきます。


では、残りの必須項目だけどチェック対象外となっている3項目のチェックを実装して終わりにしましょう。


入力チェックを実装する ~中級編その5~

「住所」項目、「児童との続柄」項目、「メールアドレス」項目はどうやって実装するのか、と気になっているかもしれませんが、これを自動化しようとすると大変そうなので、地味な方法でいきます。

ソースの追加位置は・・・

029_ソースの追加位置

ここ!!

追加するソースは・・・

    '住所
    If Range("B7").Value = "" Then
        message = message & "住所が入力されていません。" & vbCrLf
    End If
  
    '児童との続柄
    If Cells(14, 10).Value = "" Then
        message = message & "児童との続柄が入力されていません。" & vbCrLf
    End If
  
    'メールアドレス
    If Cells(17, 3).Value = "" Then
        message = message & "メールアドレスが入力されていません。" & vbCrLf
    End If

これ!!

追加したソースコードは・・・

030_実装イメージ

こんな感じ!


はい、見覚えのあるソースを追加しましたよね。そうです、これは初級編で実装したソースコードそのままです。

動作確認をしてみると・・・

031_動作確認

スペースの都合でポップアップを少し右に寄せています。

赤枠で囲いました通り、例の3項目もチェックすることができました。


今回はここまでにしましょう。

入力チェックの第2弾としては完成という位置づけです。形式チェックに触れませんでしたが、実装するにしてもべた書きでやるだけなので今回はスルーです。

冗談みたいなソースを組んでもらいましたが、これは次回の初めての自作関数の説明に繋がります。


では、Ctrl + S で保存しておいてください。


あとがき・ふりかえり

今回もありがとうございました。

以下の2つのことを伝えます。

・コメントの書き方(内容)
・初心者のときの挫折しない心構え

--  --  --

・コメントの書き方(内容)

VBAでは先頭にシングルクォーテーションマークを付けるとその行はコメントになる、というのはここまでの実装でご存じのとおりですね。

コメントにどんなコメントを書くか?はプログラマの永遠のテーマというか、けっこう頭を悩ますところなんですよ。

私がこの業界に入ったころは

ソースの日本語訳を書くな。何のためにしている処理かを書け。

とよく言われました。

でも、最近はソースの日本語訳でもええやないか、と思っています。あんまり神経質になってもつらいんでね。

ソースの日本語訳がどんなのかというと、例えばここまでの実装で言うと

    '項目名中のアスタリスクの出現位置を代入
    asteriskPoint = InStr(itemName, "*")

これ。これなんかはソースの日本語訳ですね。処理内容をただ日本語で書いているだけ。でも初心者のうちってこういうコメントでも安心ですよね。

理解の助けになると思います。全然OK。


では、処理の目的を書いているコメントがどんなのかというと・・・

'必須チェックの対象かどうかを評価する
If asteriskPoint > 0 And Not Cells(i, 1).MergeCells Then

これです。ここにもしもコメントがなかったら、項目名中のアスタリスクの登場位置が0より大きい、かつそのセルはマージしていない・・・だからなんなの?となってしまいます。

そこに

'必須チェックの対象かどうかを評価する

と書いてあることで、あぁ・・・この条件に合致すれば必須チェックの対象なんだ、と理解することができます。

これがなんのためにしている処理かをコメントで説明している例ですね。

このあたりのどんなコメントが開発者にとってやさしいか?は経験によっても考え方が変化していくと思います。その時その時のご自身にとっての適切を選びとってください。

小話でした。


--  --  --

・初心者のときの挫折しない心構え

入力チェックの実装が始まってから今回で4回目でして、あなたにはプログラミングスキル獲得につながる階段をガッツリ上っていただいています。

で、やっぱり怖いのが途中で挫折してしまうことですよね。

プログラミング初心者がどの言語から始めるべきか?という話になったとき、「PHPは簡単」「まずはPHPから」「PHPはとっつきやすい」とよく聞くけど、それでもやっぱり難しいですよ、ガチ初心者からしたら。

そういう想いもあってVBAからチャレンジいただいているわけですからね。


で、初心者のときの挫折しない心構えとして、これまでにも言わせてもらっているんですけど、私としては

理解してなくても突き進むこと

かなぁと思っています。なので、何度かお伝えしてきていますが、今はまだ理解できないことがたくさんあっていいです。それよりも手を動かしましょう。

習うより慣れろの精神でやっていると、だんだんプログラミング構文や変数名のセンス、ロジックの閃きなど、いろんな必要な要素が身についてきます。


初心者だからこそ理解したいあなたに「理解しなくていい!」と言うのはなんだか矛盾してるような気もするのですが、どうしてこんなにその言葉を繰り返すかというと、私が初心者の頃にかけてほしかった言葉なんですよね。


理解できていないと前に進んでいない気がして、プログラミングスキルを獲得できていないような気になるんですけど、自分の指を動かして実装に取り組んでいる以上、間違いなく前に進んでいます。

どんなことでもそうですけど、軌道に乗るまでは燻ってるような感じになるんですよね。でも、習い事や新たなスキルの獲得っていうのは継続することである日突然わかるようになったり、できるようになったりします。

それはプログラミングも例外ではありません。

あ!あれってそういうことか!!

みたいに急に閃くことがあります。今までなんとな~く置き去りにしてきた知識が一気に自分に追いつく瞬間がありますから、もしも今はまだ面白くないとしても我慢して進めてもらえたらと思います。


引き続き、よろしくお願いしますね。


おわりに

おわりです!

今回で、ループを使ったパターンも一応は完成しましたが、フォーム形式の都合上、一部ベタ打ちで対応した項目がありました。・・・残念。

この中級編は「身長項目を追加したら台無しになるぜ?拡張性を意識した実装が必要なんじゃないのかい?」というところから始まったので、ベタ打ちの項目がある以上そこをクリアできていませんからね。

そのあたりも今後の実装で回収していきます。


はい、では終わりです!リフレッシュしてください。

ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?