GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBA超入門

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBA超入門−9ステップで"Hello World!"からオブジェクト指向まで!
  構造化プログラミングに挑戦しよう!
 
■ 構造化の第一歩
 
VBAはその兄弟であるVisualBasic6.0と同様に手続き型言語です。と同時にオブジェクト指向型言語としての側面も持っています。
プログラミングの黎明期、初期のBASICやCOBOL等で書かれていたプログラムは非構造化プログラムでした。
これはコードが基本的に逐次実行型で構成されており、処理の分岐は指定された行ラベルにジャンプして行うなど、コードの可読性を低め保守性の悪いプログラムを生産する原因となっていました。

プログラムの規模が大きくなるにつれ、非構造化プログラミングは限界をむかえ、新たなるパラダイムとして生まれたのが構造化プログラミングです。
VBAは言語仕様そのものが既に構造化されており、意識しなくても構造化プログラムを記述することが可能です。
しかし意識して構造化することにより、さらなるプログラミングの省力化や再利用を高めることが可能になるでしょう。

構造化の第一歩はまとめることです。簡単にいえば同じコードをできるだけ2度書かないようにすることです。さて、test.xlsを開いてください。

今回は、前回のコードにチェック機能を追加することにしましょう。
チェックする項目は社員IDが「数値型であること、指定した桁数であること」にしましょう。
早速、プログラミングしてみます。

Public Sub test()
Dim i As Long
Dim WrkRange As Variant
  If ChkNumber(Range("syain_id"), 4) Then
    WrkRange = Sheets("SyainMST").UsedRange
    For i = 1 To UBound(WrkRange)
      If WrkRange(i, 1) = Range("syain_id") Then
        Range("syain_id").Offset(1, 0) = WrkRange(i, 2)
        Range("syain_id").Offset(2, 0) = WrkRange(i, 3)
        Range("syain_id").Offset(3, 0) = WrkRange(i, 4)
        Range("syain_id").Offset(4, 0) = WrkRange(i, 5)
        Exit For
      End If
      Range("hyoji_all").ClearContents
    Next i
  Else
    MsgBox "社員IDが有効ではありません", vbCritical
  End If
End Sub

Private Function ChkNumber(ByVal pNumber As String, ByVal pKeta As Long) As Boolean
  If IsNumeric(pNumber) Then
    If Len(pNumber) = pKeta Then
      ChkNumber = True
      Exit Function
    End If
  End If
  ChkNumber = False
End Function

こんな感じになります。ずいぶんコードが増えちゃいましたね。
まず、社員IDの有効チェックですが4行目の、
If ChkNumber(Range("syain_id"), 4) Then
のところで行っています。このChkNumberという関数は、私が勝手に作ったものですのでVBAのヘルプには当然載ってませんよ。念のため。

ChkNumberの文字中のどこでもいいですからカーソルを持ってきて、Shift+F2を押してください。
Function ChkNumber…のところに移動しましたね。VBEのどこでも、Shift+F2を押すことで関数のある場所にとんでいきます。戻るときはShift+Ctrl+F2を押せば戻ってきます。これはよく使うショートカットなので覚えておいてくださいね。

このとんでいった先のコードが社員IDのチェックを行っている関数ChkNumberです。
ChkNumberの(ByVal pNumber As String, ByVal pKeta As Long)の部分はどういう意味なんでしょう?この部分はChkNumber関数に必要な引数を定義しています。
それでは引数っていったい何?

チェックを行うために最低限必要なものはチェックする数値と桁数です。
ですのでこの2つのデータは必ずChkNumberに渡してやる必要があります。このとき渡すデータが引数です。
引数pNumberはチェックする数値そのものを指します(数値でない場合もあるので文字列型で渡しています)、引数pKetaはチェックする桁数を整数型で渡しています。
ChkNumberの頭にある Function と最後の As Boolean はどんな意味があるんでしょう?
Functionは返り値をもつプロシージャを意味します、As Booleanはその返り値の型を表しています。
関数には返り値を「もつ」もの(Functionプロシージャ)と「もたない」もの(Subプロシージャ)があるのです。

返り値ってなにかって?それは関数のコードを実行した結果を元の(呼び出した側の)コードに返す値です。
※引数、返り値の詳しい解説はこちらを参照してください
  引数の参照方法(値渡し・参照渡し)を明示しよう

ChkNumberは指定桁数の有効な数値であるかどうかさえ分かればいいので、返り値でほしいのは"TRUE"(真)、"FALSE"(偽)のどちらかでいいわけです。
IsNumeric()関数で数値かどうかのチェックをしています。数値でなければここではじかれるのでChkNumberの返り値はFALSEです。
次のIf Len(pNumber) = pKeta Thenの部分はLen()関数でpNumberの桁数を調べます。その値がpKeta指定された桁数と異なればやはりはじかれてChkNumberの返り値はFALSEになります。そうでない場合、つまり数値チェックを通り、桁数も等しい場合だけ返り値にTRUEをセットされExit Functionで処理を終えます。

ですので呼び出し元のIf文でChkNumber(Range("syain_id"), 4)が"TRUE"ならば従来の処理が行われ、"FALSE"のときは社員IDが違うとメッセージが表示されます。
ちなみに呼び出し元のSub test()は返り値がありません。このプロシージャは実行してそれでおしまいなので返り値は必要ありませんね。
だからSubを使っているのです。(Subプロシージャでも引数を設定することは可能です。その場合は他のプロシージャより呼び出す必要があります)
 
 
 
ところであなた、構造化しているのにずいぶんコードが増えて複雑になったと思っていませんか?
この部分だけで見ればそうですが、今回作ったChkNumber関数。これは他のプロシージャからでも使うことができます。
たとえば郵便番号のチェックだとか電話番号のチェックなどにも使えます。
つまり再利用が可能なコードということです。

ということはChkNumber関数は一度書けば、二度と書く必要のないコードということになります。
立派に構造化されています。
このChkNumber関数を改編したい場合が生じても、この部分だけを直すことで全てのChkNumberを使用しているプロシージャに変更を反映できます。
もしこの部分を関数化せずにすべてのプロシージャ内で記述していたとしたら…当然改編時にはすべてのプロシージャの該当部分を変更する必要があります。
でもそれはナンセンスですし、修正漏れや改編ミスによるバグを引き起こす原因になります。

構造化プログラミングの第一歩は、できる限りコードの再利用化率を高め、保守性の良いプログラムを作りだすことにあります。

そのためにも汎用的な処理は関数化し、他コードからいつでも参照・利用できるように心がけてプログラミングしましょう。

 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,