[PR]テレビ番組表
今夜の番組チェック


VBA?第2回  実践で、実力UPしよう!!
 (【EXCEL2000】を使用して、説明しています!
シートとVBAの組合せ
今回の狙い目
●入力しやすい表を作ろう!!
★名簿表&ハガキ印刷&入力表を作成しよう!!
●実践編として、いろんなことに挑戦していくよ!!
 技術的にも、少しハイレベルになってくるので、
 しっかり、ガンバッテねぇ q(^◎^*)p
 
 まず、今回は3つのシートを作成する。
 下の図のような、名簿表シート、ハガキ印刷シート、それと入力表のシート!!を作成
 それぞれがシート同士関連をもつことになるんだけど
 順を追って、作っていくことにしよう!!
 レイアウトは↓のような感じで作成していきます!!φ(^・^)
  
 1.名簿表
 名簿表

 2.ハガキ印刷
 ハガキ印刷

 3.入力表
 入力表 
 

 まず、入力表と名簿表のリンクをスクロールバーを使ってみようと思う、
 で、方法はセルA1が鍵になる。
 前回作成したスクロールバーをここで使うことにしよう!!
 これでスクロールバーの配置はOK!!だよね

 データの内訳は、B3〜B14 役職から備考まで
 実際に入力するのはC3〜C14とします!!
 入力するのに便利な方法として、セルを選択したときに日本語入力
 (実際には、役職、氏名、名称、住所、備考欄)
 数字だけを入れたいとき、英語入力という風にしたいよね、
 そんなときには入力規則使えばいい!!
 
ここで是非これをマスターしたいものだ!!
 (そういえば、これって、まだ説明していなかったけ? φ(?。?)  )

 
入力規則
 まず、C3からC5までドラッグ、そしてC8とC12、C14はCTRLを押しながら
 クリック、一気に日本語入力欄を選択する。(セルが反転していればOK!!)
 【ファイルメニュー】から【データ】を選択しポップアップした【入力規則】を
 クリックする

 データの入力規則
 

 そうすると、入力規則の日本語入力を選択。
 ▼ボタン(コンボボックス)を押して、
【ひらがな】を選択しよう!!

 同じように、郵便番号、丁目、番、号、電話番号は【オフ(英語モード)】
 を選択しておこう!!
 ついでに、こういうこともできる。

 ●設定

 データの入力規則(設定)
 ↑ここでの条件は種類は整数で
  データは次の値の間を選択し
  最小値0 (または、100つまり3桁最小値)から
  最大値999までの数値、これ以外だとエラーメッセージをだすようにする
 
 ●入力時のメッセージは、必要がないので
 【セルの選択時にメッセージを表示する】にノーチェックしておこう!!

 ●エラーメッセージ

 
 ↑こんな風にエラーメッセージを入れてみた
 1000を入力してみるとアシスタントのイルカ君が出てきて

 ←こんなエラーメッセージがでたよ!!
  999まだ→999までに訂正!! 入力ミスじゃわい ヽ(∇⌒ヽ)

 と、まぁ、こんな具合に入力規則を決めれば
 シートでもかなり入力しやすい、あるいはデータ入力のミスがないように
 することができるわけだ!! 

 ●日本語入力IME2000を使って住所入力をする
  IME2000には再変換モードがある。辞書のプロパティで郵便番号辞書を
  チェックしておこう!!
  もし、この辞書が入っていなければ、IME2000のCDから取り込んでおく!!
  (方法については、ここではパスするよ、自分で調べてね (・.・;) )

 ●マクロで住所入力の作業を簡単に
  さぁ、ここで、一つ目のマクロを作ることにしよう!!
  つまり、郵便番号 例 上では 543 と 51(表示形式で0000にしてある)
  をマクロで組み合わせ、543−0051にして住所欄(C8)に、この文字を
  代入させるというものだ!!
  そうすれば、この文字は再変換で住所入力がいとも簡単にできるはずだ!!
  と考えた!!

  順だって考えよう!!

 1.シートのコード表示

 これは↓の図のように
シートタブ(名前は入力とした)を右クリック

コードの表示
そうするとシートタブのショートカットが
表示されるので
一番下の【コードの表示】
これをクリックする。






 2.ワークシートのイベント



 そうすると↑のうようなシートのコードが出てきただろう!!
 (General)の▼を押してみよう


 そうすると↑のようにうリスト表示されているWorksheetをクリックしてみよう
 自動的に
 
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
 End Sub
 という記述が入力されたはずだ!!
 こればワークシートのRange(セルのこと)が変化すれば
 マクロが動かせるイベント

 でも、これじゃ、自分で住所を入力したら、その後でイベントが始まってしまうことになる
 つまり折角住所を入力しても、その後に郵便番号が入力されてしまうわけだから
 このイベントは使えない。

 そこでWorksheetのイベントで他にはないかということで左のDeclarations
 がSelectionChangeに変わっているはずだ!!
 そこで右の▼をクリックしてみよう!!

 

 このなかで、ダブルクリックっていうのがあるよね!!
 今↑で選択している状態だよね!!
 これをクリックすれば、今度は
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub
 と表示されたはずだ!!
 これだと、ダブルクリックするときだけ、イベントがおきる。
 
 今回の場合、これを使うことにしよう。
  ※1ByVal・・・ )については、少し難しいので後述することにして、次に進むが
  大事なことでもあるので、是非見ておいてくだされ!!

 つまり、住所を入力するときに、郵便番号がわかっていれば
 そのセル(C8)でダブルクリック、郵便番号が入力というマクロを
 作成すればいいことになる
 これを、まだはじめたばかりの諸君には難しいので
 これは、ちょっと先輩のたこちゅーが作ってみたので参考にしてくだされ!!
 (まぁ、もっといい方法があるとおもうけど、結果よしということで御勘弁願う)

 コードは次のとおり
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim A As String
 Dim P1 As Integer
 Dim P2 As Integer

 If Target.Address(0, 0) <> "C8" Then Exit Sub

 On Error GoTo Myline
  P1 = Range("C6")
 On Error GoTo Myline
  P2 = Range("C7")

 If P2 < 10 Then
  Range("C8") = P1 & "-000" & A

 ElseIf  P2 > 9 And P2 < 100 Then
  A = Range("C7")
  Range("C8") = P1 & "-00" & A

 ElseIf  P2 > 99 And P2 < 1000 Then
  A = Range("C7")
  Range("C8") = P1 & "-0" & A

 ElseIf P2 > 999 Then
  A = Range("C7")
  Range("C8") = P1 & "-" & A
 End If


Myline:
On Error GoTo 0
End Sub

  初心者の方は、↑のコードだけでまっ青になっているかもしれないよね〜 o(TヘTo)
  VBAをかじっている人には楽勝っていう人もいるだろう
  でも、ここは初心者のため・・・・であるから 
  やはりここは、じっくり説明しておこうね、
 
 3.Option Explicit(オプションステートメントのひとつ)

   これはおまじないみたいなもんである。
   (ちなみに、BBSに来てくださるoyajiさんに教えてもらったのじゃな )
   標準モジュールっていうのは、自動マクロを作ったときにできていただろう、
   シートにも、同じようにコードがかけるようになっている。
   シートモジュールって言うのかどうかは、
   ちょっとわからないけど(まぁ、そんなに深くかんがえないでください)

   そこで、これを一番上に宣言しておくと(書いておくと)
   変数(プログラム実行中に変化する値を入れておく入れ物のことですなぁ)
   を強制宣言するわけです。

   つまり、変数というのは最初に宣言するわけですが、
   今回のようにフロシージャ内で次の宣言をした
   例  Dim A As String
      Dim P1 As Integer
      Dim P2 As Integer
   そして、フロシージャ内で、これ以外の変数を使っていると、
   そんな変数は使ってまへんで!!
   と、教えてくれるのがこのおまじないというわけですなぁ
   (こんな説明でいいと思うのだけど
   違っていたら、教えてくださいませ、なにせ独学でございます故)

 4.変数の宣言 

   Dim は 難しい言葉でいえば変数の適用宣言なんですが、
   これは、プロシージャ、つまり↑のような
    Private Sub ・・・
     〇
     〇
    End Sub
   で一つのプログラムが構成されている。
   このようなものをフロシージャという(説明が前後無茶苦茶じゃが許されたし) 

   で、↑の場合、このプログラム内だけで有効っていうわけだ。
   もちろんこの Dim は モジュール内でも有効なので

   Optionの後と、プログラム前の間(プログラム外)に宣言しておけば
   そのモジュール(シートモジュール)内で有効というわけである。
   つまりその範囲内であればどこでも使えるというわけだが、
   この場合、気をつけなければならないのは、そのプログラムが
   終了しても、変数はひきづり他のプログラムに影響の恐れがある
   場合もあるので、記述する場合は注意しよう!!

 5.As

   これは、「は」と思えばいいだろう
   つまり
  Dim A As String の宣言は

  「適用範囲はこのフロシージャ(プログラム)内で
   A は String です」 という意味になる

 6. 変数

   ここで使った変数だけ紹介する
   Stringは「文字」ですよ
   Integerは「整数」ですよ って意味!!
   まぁ、これ以上話してもきりがないよね、前にすすまないので次に進むとしよう!!

 7.if文

  If Target.Address(0, 0) <> "C8" Then Exit Sub

  これはTargetのアドレス が セルC8以外は このプログラムから脱出せよ!!
  という意味、Exitは駅などで、出口なんて書いてあるから御存知ですよね!!

  If は 「もし・・・だったら」、Then は 「のときは」の意味

 8.On Error GoTo Myline

   P1 = Range("C6")でP1は整数なのに例えば整数以外の文字が入ってしまったら
   このプログラムはエラーになる。だから、そんなときは
   こんな時は、↑の構文を使って
   エラーがでたら Mylineに行ってね、って導いてやる方法がこれだ!!

   On Error GoTo 0 は エラー処理を無効にする構文
   入れなくてもいい場合が多いけど、入れておいたほうが無難かな?

   その他にはエラーを無視する
   On Error Resume Next もよく使う。
   これはエラーがでても、まったく無視することができるのだ。
   ここで覚えておこうね!!

 9.メインプログラムの意味(たいしたもんではないけど)

   If P2 < 10 Then 'P2つまりセルC7が10以下だったら
   Range("C8") = P1 & "-000" & A 
    文字は""の間に入れておけば文字として認識される、
    P1は実際は543そして-000と1桁の数字Aとの組合わせとなる
    ↑の場合、Aは51なので、ここは通過しないことになる

    ※「""」はエクセルの関数でも同じ意味だね、
      つまり -000 は文字として認識されることになる

    EElseIf  P2 > 9 And P2 < 100 Then
    P2は整数なので >9 は10以上、 <100 100未満つまり99の意味になる
    
     A = Range("C7")
     Range("C8") = P1 & "-00" & A
     10以上、100未満で、 P1と-00とA の組合わせということになるな!!
     ↑の場合、51はこの条件を満たすので
      結果として 543-0051 となるわけである

    以下同様に、3桁の数字のとき、4桁の数字のときの分岐条件である

  End If

   これは、 If に対して、ここで終わりという宣言をしておかなくてはならない
   結末文である。
   End ・・・で終わるものや Next(Next ・・・) で終わるもの
   宣言文に対しては、必ず結末文があるということを覚えておいてほしい
   これを抜くと必ずエラーになる
   つまり Ifに対しては End If で終わる
    If ・・・ Then ・・・・ で終わってしまえば、一行で完結しているので
   End If はいらない(こういう場合もある)
 
 10.最後に
  というわけで、セルC8をダブルクリックすれば
  この↑のマクロ(プログラム)が働いて
  セルC8に郵便番号が入力されることになる

  入力されたら、この文字を選択し、右クリックして再変換すれば住所が
  入力されるという按配じゃ!!
  まぁ、これで入力が、かなり楽になるはずじゃが
  お試しアレ!!

 これで第2回はおしまい。。。。次回続く・・・・


※1 ●引数
   (ByVal・・・ )内の説明はちょっと難しい!!
   しかし、引数(ひきすう)というのは、とっても大事なことなので、
   少しは理解しておいて欲しい。
   ということで、引数のことについて説明しておきます。

   関数でも、引数というのがあります。
   例えばVLOOKUP関数( )では
   VLOOKUP(検索値, 範囲, 列番号, 検索の型)で構成されています
   VLOOKUP関数も、ひとつのフロシジャーで構成されています。
   つまりプログラム関数だと理解してください。
   入力値に対して、そのプログラムを動かす要素と
   なるデータを呼び出すのが、引数なんですが、
   それが、ここでは範囲であり、列番号であり、検索の型なんです。

   なんか、わかったような、わからないような説明ですが。。。
   (感覚的に「引数」っていうものが、理解できればそれでいいです?)

    そこで、VBAでもフロシージャー(プログラム)からフロシージャへ
   
データを引き渡したり、渡されたりすることがあります。
   このことを
引数といいます
    そして、データの引数には、フロシージャーから別のフロシージャーへ
         (1)値をそのまま引渡す場合(値渡し)
         (2)値の格納されている変数のある場所を指定する(参照渡し)
    このふたとおりがあります。
    通常は(2)だと思っておいてください。

  しかし、今回の↑場合は ByValがついていましたので、これは値渡しですよ!!
  というキーワードになっている決まり文句なんです。
  (Valというのは、値で、By は 〜で つまり、「値で」ということになるのかな?
   英語でby bicycle(自転車で)なんて習ったでしょう!!
   それと同じ、結構、日本語より英語の方がわかりやすいかもしれませんねぇ〜)

  説明すると限(きり)がないので、ここらへんでおきますが、
    Private Sub Worksheet_BeforeDoubleClick
     (ByVal Target As Range, Cancel As Boolean)
   最後に、このフロシージャー内でつかう意味を訳しておきましょう!!

   Privateはフロシージャy-の適用範囲を示し、
   他のモジュールからのフロシージャーからの呼出しは不可ということです。
   そして、ワークシート(ここではワークシート"入力")をダブルクリックしたら
   プログラムは実行されますよ!!
   ()内は
   引数は値渡しで、TargetはRange、CancelはBoolen
   (Boolen はTrueかFalseを返す)で取り扱いますよ!!てなことかな。
   

   
【戻る】


※ 条件分岐 Select Case を使用した場合
Select Case P2
 Case Is < 10
  Range("C8") = P1 & "-000" & A
 Case Is >= 1000
  Range("C8") = P1 & "-" & A
 Case Is >= 100
  Range("C8") = P1 & "-0" & A
 Case Is >= 10
  Range("C8") = P1 & "-00" & A
End Select

 Selectもよく使うのでここで補足ながら説明しておこう
 条件が多いときには、この方がわかりやすい場合が多い
 でも、セレクトの場合上から順に領域を探していくので
 最初に該当があれば、該当したCaseキーワードの実行が
 行われるので分岐条件は、少し考えないといけない

 今回の場合も
  10未満の場合
  1000以上の場合
  100以上の場合
  10以上の場合
 とすれば、それぞれの桁数で区分できる

  1000以上の場合
  100以上の場合
  10以上の場合
  10未満の場合
 でも、もちろんOKだよね!! (この方がわかりやすいかもね)

 あるいは
  10未満の場合
  100未満の場合
  1000未満の場合
  10000未満の場合
  式にすると
 Select Case P2
  Case Is < 10
   Range("C8") = P1 & "-000" & A
  Case Is < 100
   Range("C8") = P1 & "-00" & A
  Case Is < 1000
   Range("C8") = P1 & "-0" & A
  Case Is < 10000
   Range("C8") = P1 & "-" & A
 End Select
 としてもいいだろう
 
 悪い例
 Select Case P2
  Case Is < 10
   Range("C8") = P1 & "-000" & A
  Case Is >= 10 and P2 < 100
   Range("C8") = P1 & "-00" & A
  Case Is = 100 and P2 < 1000
   Range("C8") = P1 & "-0" & A
  Case Is >= 1000
   Range("C8") = P1 & "-" & A
 End Select

 式で条件がうまく別れているようだが、うまくいかない
 これは10以下のときはOK
 でも10以上のときは2つめの式
 Case Is >= 10 Or P2 < 100
 の条件 >=10 で 通過してしまうので
 それ以下の式にはいかなくなるので × ですね

別のやりかた
Select Case P2
 Case Is < 10
  Range("C8") = P1 & "-000" & A
 Case 10 To 99
  Range("C8") = P1 & "-00" & A
 Case 100 To 999
  Range("C8") = P1 & "-00" & A
 Case Is > 1000
  Range("C8") = P1 & "-" & A
End Select

 これは 〇〜to〜△ を使いました。
  (〇から△まで)
 これだと、視覚的にわかりやすいかもしれませんね
 よく使う手は、Caseの後の数値に変数をあてて、
 繰り返し処理を使ったりしますが 今回はその説明はパスします。

 値が決まっていれば
 Case 10 
   ・・・・
 というような使い方をします。



【あとがき】
  う〜ん、今回は急に難しくなり過ぎたかなぁ、という感じはするんだけど。。。
 皆さんは、どうだったでしょう?ついてこれたかなぁ〜
 まぁ、実際に同じようなものを作ってみて、試してみてくださいネ、
 そして、VBAでこんなことができるということがわかればいいんでないかなぁ?

 次回はねぇ、スクロールバーで名簿表の入力と読込みをやってみたいと思います。
 でも、ボチボチですから、気長にお待ちくださいませ  (∩_∩)ゞ

 ※P.S
  え〜と、プログラムは、個人個人によって、やり方、方法はいろいろあるんだよねぇ
  だから、これが正しいっていうのは、ないと思う
  コツとしては、

  ・条件に対して処理の方法をよく考えること
   条件が複雑になるとフロチャートを作成するのも一案

  ・エラーがでたらどう回避するかを考えること
   プログラムを作成すると、必ずエラーがでるもの。
   実際作成している場合は、そのときには、気づかないものだ

  ・失敗はつきもの
   大抵は、完成したと思っても、エラーがでて、動かないことがおおい
   だから、その都度、作り直し、その繰り返し!!
   特に、最初はそうなるものだから、気にしなくていい、
   どんどん、失敗しよう!!

  ・テクニックによって、処理の早い方法なんてのは、たくさんあるしね、
   真似をすることが大事だと思う、それから、いろんな人の技術を盗むといいよ!!
   そして、自分でもよく考えてみることが大事だな!!

  ・ VBA Q&A ここでは、たくさんの人が問題を一緒に考えるので、
    スキルアップに役立つだろう
  
では、みなさん、ガンバッテネ!! ♪(゚・^*)ノ⌒☆
【BACK】  【HOME】 【NEXT】
03-03-02UP!!
03-03-10更新(文字等修正)
03-03-15更新(引数について説明補足)