Section C 生年月日の表記変更(日付、文字列関数)

   生年月日の表記変更を例に日付と文字列の扱いについて解説します。最初に関数を
 用いた「一般操作」と「マクロの記録」を用いた操作を併記し、最後にそれらをまとめた
 VBAマクロプログラムとその解説文を掲げています。
   また、マクロのボタン登録マクロのデバッグ方法マクロの整理方法についても簡単
 に述べています。セクション末尾のサンプルシートも参照して下さい。

C-1 日付の操作
   先ず、事前の準備として次のことをしましょう。
   1)添付のCDから「マスターテーブル.xls」を各自の練習用ブックのシート名 「名簿」に
     コピーして下さい。なお、以下の点に注意して下さい。
     マスターテーブルの表全体のセル範囲が「マスターテーブル」の名前で正しく登録され
     ているか確認して下さい。登録名は名前ボックス欄からはみ出る場合もあるので,
       挿入/名前/定義  で確認します。正しい名前の後ろに空白があって、末尾に
     文字列が挿入されている場合には、一旦登録を削除し、再登録をして下さい。
   2)別シートにシート名を「Sheet1」とした空のシートを準備して下さい。

  日付の表示スタイル
   「Sheet1」に表C-1と同じものを以下の指示に従い、作成して下さい。
   ・ B2セルを表の左上隅として見出し行を設定し、マスターテーブルの上段5人分の氏名、
     生年月日を表の左端2列に貼り付けて下さい。
   ・ 生年月日数値style-1を数値style-2〜シリアル値迄の欄に全てコピーして下さい。
     Style-2欄 : 右クリック/セルの書式設定 にて表示形式タブを選ぶと、
                 分類:「ユーザー定義」、種類:「[$-411]ge.m.d」
              となっています。これを 分類「日付」、種類「*2001/3/14」 に変更すると、
              D列は表C-1の表記と同じになります。
     以下同様に、次に示す様変更します。
     style-3欄 : 分類「ユーザー定義」、種類「yyyy"年"m"月"d"日"」
     style-4欄 : 分類「ユーザー定義」、種類「[$-411]ggge"年"m"月"d"日"」
     シリアル値欄 : 分類「標準」、種類の欄は無し
   注) 数値style-1〜style-4の見掛けは違いますが、夫々のセルを選択して数式バー欄
     を見ると、いずれもstyle-2の表記に同じとなっています。

                         表 C-1 日付の表示(各種スタイル)
 
     分類→  ユーザー定義   日付    ユーザー定義    ユーザー定義      標準
     種類→   [$-411]ge.m.d  *2001/3/14  yyyy"年"m"月"d"日" [$-411]ggge"年"m"月"d"日"

  シリアル値
     シリアル値は表C-1に示されたG列を一見しても意味不明で分かりませんが、表C-2
   に示す様に明治33年1月0日を0に設定し、翌日から順に1,2,3・・・・と付番した値です。
   Excelでは、シリアル値で日付が管理され、日付の演算が可能となっています。



                    表 C-2 シリアル値
                

C-2 文字列の操作
  
一般操作とマクロの記録
    下記の手順に従い、順に表C-3と同じ表を作成しましょう。
                   表 C-3 表記変更作業表
     8       E           F          G
    15 

  ・ 氏名を「Sheet1」のE9セルに、生年月日をE10セルに入力して下さい。
  ・ E10セルの生年月日をF10セルに文字列として数値style-3のように入力します。
    一般操作では、文字列としての入力を指示する’を打ち込んでから、1991年9月6日
    と入力します。
     
  マクロの記録の開始と終了
     上記手作業がスムーズにできたら、適当なマクロ名を付けてF10セルを選択して
    生年月日を入力する操作に関するマクロの記録をとりましょう。
    ・  表示/ツールバーを選択し、Visual Basicにチェックマークを入れ、Visual Basicの
     ツールバーをシート上に表示します。
                       図 C-1 Visual Basicのツールバー
                       
      
    ・ ツールバー左から2番目青を押し、適当なマクロ名を付けると、マクロの記録開始
      です。 なお、このときマクロの保存先は「作業中のブック」としておきましょう。
    ・ 上記と同じ一般操作を終えたら、青に形が変わっている「マクロの記録終了」
      ボタンを押します。
  マクロの記録:プログラムコードの表示
    ・ Visual Basicのツールバーの左端青三角を押すと、次のようなマクロ選択画面が表示
      されます。



                   図 C-2 マクロ選択画面
      

   ・ マクロ名の中から、上記でマクロを記録したときのマクロ名を選択し、「編集」ボタン
     を押すと、次に示すようなコードが表示されます(ただし、下図では、コードの先頭
     に記入されるマクロ名とマクロの記録日に関する注釈行を削除しています)。

             図 C-3 生年月日入力操作のマクロコード
  

   ・ マクロプログラムの修正は、図C-3に示す編集画面で行います。
     このとき、1行目Subの次にあるマクロ名(上例ではMacro3)も自由に変更できます。   

                マクロ名の与え方
 先頭文字    〜英字か日本語で始めます。先頭文字に数字は使えません。
 第2文字目以降 〜英字、日本語、数字、半角、全角のアンダーバーが使えます。

     マクロ編集画面をExcelのシート表示に戻すには
         Excelのアイコンを押す、または、ファイル/終了してMicrosoft Excelに戻る
     を選択します。

 マクロの記録実行
    ・ F10セルの内容をクリアーしてから、マクロの記録を実行してみましょう。
      Visual Basicのツールバーの左端青三角を押し、図C-2に示したようなマクロ選択
      画面を表示します。実行したいマクロ名を選択して実行ボタンを押します。
    ・ F10セルに正しい結果が表示されましたか?

 TEXT関数(文字列のテキスト化)
   一般操作
    ・ F10セルを選択して、関数の挿入アイコンfxを押し、文字列操作関数の中からTEXT
      を選択します。下図のように入力すると、先と同様の結果が得られます。ただし、
      表示形式欄の"   "は半角であることに注意して下さい。

                 図 C-4 TEXT関数の引数設定例
  

   マクロの記録
    ・ 上記と同じ操作についてマクロの記録をとりましょう。得られるコードは次の図のよう
      になりましたか? このやり方の方が、手作業で文字列を入力する必要が無いので、
      作業を自動化するのに適しており、コード行数も短く簡潔です。

               図 C-5 TEXT関数のコード例
  

      先の図C-3より、スマートになっていることを確認しましょう。
      なお、コードの説明は次の通りです。
          コード2行目〜F10セルを選択しなさい
          コード3行目〜選択セルF10に対して相対的にRC[-1]の位置にあるセル
                   (即ち、左隣セル)の表示を"yyyy年m月d日"として、
                   それを文字列に変換し、F10セルに表示しなさい
      RC[-1]〜選択されたセルに対する相対的なセル位置を表わす表現で、R1C1形式
            呼ばれています。Rは行(row)、Cは列(column)を意味し、[ ] の中は選択
            されているセルに対する相対的な行番号または列番号の増減を表します。
            同じ行あるいは列ならば、[ ]を省略するか[0]とします。
      A1形式〜コード2行目のようにセル位置を"F10"として表す形式を云います。因みに、
            コード3行目のTEXT関数の引数として、A1形式を使えません。

 LEFT関数(文字列の左端から指定文字数の取り出し)
    G10セルにF10セルから西暦年1991の4文字を取り出しましょう。一般操作、マクロの記録
  は次のようになります。
 一般操作
    G10セルを選択してから、関数の挿入アイコンで文字列操作関数のLEFT関数を選びます。
  「関数の引数」入力画面が表示されるので、下の例のように入力して下さい。



             図 C-6 LEFT関数の引数設定例
  

 マクロの記録
             図 C-7 LEFT関数のコード例
  

     コード3行目〜選択されているアクティブセルに、左隣のセルの文字列左端から
               4文字(西暦年は常に4文字と仮定)を取り出し、表示しなさい

 コードを用いた文字列の直接入力(表C-3の3段目見出し)
   ここでは、直接入力するためのコードを掲げます。Sub 〜 End Sub は省略しています。
         Range("E11")="FIND年の位置"
         Range("F11")="FIND月の位置"
         Range("G11")="FIND日の位置"
     コード1行目〜E11セルに文字列「FIND年の位置」を表示しなさい

 FIND関数(特定文字位置の抽出)
   表C-3の4段目には、背景色を紫で示したF10セルの文字列を対象として、文字「年」、
  「月」、「日」が夫々左端から何番目にあるかをFIND関数を使って求めます。これは、何月
  何日なのかを表す数値を取り出すための準備です。
  一般操作
     E12セルを選択してから、FIND関数の引数設定画面を表示します。














                図 C-8 FIND関数の引数設定例
  

  マクロの記録
                図 C-9 FIND関数のコード例
  
  
      コード3行目〜選択されているアクティブセルに対して、2行上に、1列右にずれた
                セルの文字列から「年」の文字が、左端から何番目にあるのかを
                アクティブセルE12に表示しなさい

 If 〜 End If 文(西暦年から元号年への変換)
   If 文で始まりEnd If 文で終わるひとかたまりのコードは、条件に応じて実行されるコード
  が異なる(即ち、条件分岐)制御文です。このIf 文を用いて、生年月日のシリアル値から
  明治、大正、昭和、平成の元号を決定します。
   先ず、If 文の解釈の仕方について説明します。
      If 条件式A then
         条件式Aが満足されたとき実行するコード  ← コードは複数行でもOK
      ElseIf 条件式B then
         条件式Bが満足されたとき実行するコード
      ElseIf 条件式C then
         条件式Cが満足されたとき実行するコード
      Else
         条件式A、B、Cのいずれも満足しないとき実行するコード
      End If

   西暦年を元号年に変換する例を下に示します。ただし、下のコードではあらかじめ
   変数名birth_dayに、生年月日のシリアル値が代入されているものとします。
   元号の変わり目については、表C-2に掲げたシリアル値を参照して下さい。

       If birth_day < 4595 Then
         gengo = "明治"        '変数名gengoに文字列「明治」を代入しなさい
         nen = Range("G10") - 1867 ' 元号年に変換するための調整
      ElseIf birth_day >= 4595 And birth_day < 9856 Then
         gengo = "大正"
         nen = Range("G10") - 1911
      ElseIf birth_day >= 9856 And birth_day < 32516 Then
         gengo = "昭和"
         nen = Range("G10") - 1925
      Else  'birth_day >= 32516
         gengo = "平成"
         nen = Range("G10") - 1988
      End If

  漢数字変換
   E15,F15,G15セルでは、すぐ上の行にある数値或いは文字として認識されている数字
  を漢数字に変換して表示します。
 一般操作
   E15セルを選択してから、TEXT関数の引数設定画面を表示します。

          図 C-10 TEXT関数漢数字変換の引数設定例
  

 マクロの記録
           図 C-11 TEXT関数漢数字変換のコード例
  

 MID関数(文字列の指定位置から指定数文字の取り出し)
   FIND関数で求めた「年」の位置5と「月」の位置7を用いて、MID関数の引数設定画面の
  開始位置欄、文字数欄を定め、何月なのかを求めます。
 一般操作
    F14セルを選択し、MID関数の引数設定画面を表示します。










                図 C-12 MID関数の引数設定例
  

 マクロの記録
               図 C-13 MID関数のコード例
  
     3行目コード〜F14セルに対する相対セルR[-4]Cに入力されている文字列に関して
              R[-2]C[-1]+1で与えられる開始位置から、R[-2]C-R[-2]C[-1]-1に
              相当する文字数を取り出しなさい
 
   以上で、表C-3に示す下段の漢数字全てが準備されました。最後に文字列を結合して、
  縦書き表記に直します。

 文字列の結合
   文字列を結合するには、CONCATENATE関数が用意されています。しかし、&を用いた
  方が簡単です。
 一般操作
    先ず、結果を表示するセルを選択してから、=を入力して、文字は半角の" "で囲み、
   文字列が入力されているセルはA1形式で指定し、&で繋ぎます。&の前後に半角
   スペースを挿入してもしなくても、どちらでもOKです。

           図 C-14 文字列結合の記入例
  

 マクロの記録
               図 C-15 文字列結合のコード例
  

    コード3行目〜末尾の半角ブランク _ は、この行と次の行が継続している印です。横長に
             なり過ぎて1行に納まらないときに、この継続行の印を使います。
    コード4行目〜R1C1形式の相対セルで指定されていることに注意して下さい。



 文字列の縦書き変換
  一般操作
   縦書きに変更するセルを選択し、
       右クリック/セルの書式設定 配置タブを開いて、方向を縦書き
   とすることで、変換できます。
   
 マクロの記録
    上記と同様操作のマクロの記録は図C-16のようになりますが、縦書きに直接関係して
  いるコードは、.Orientation = xlVertical です。
    もっと簡潔に記述すると、次のようになります。
       Cells(25,5).Orientation = xlVertical
   コードの解釈〜(25行、5列)セルの方向(Orientation)を縦(Vertical)にしなさい
  
         図 C-16 文字列縦書き変換マクロ例 〜 下記マクロでは使用せず
   

 C-3 VBAマクロプログラム 
     個々の「マクロの記録」を作業の手順に従い連結すると、マクロプログラムの骨格が
   ほぼ完成です。ただし、単に連結するだけでは不十分で、若干コードを追加する必要
   があります。それがプログラムの先頭に置かれる変数の型宣言文(Dim文)です。より
   スマートなプログラムとするためには、改良すべき所も一部出てくるでしょう。
    また、プログラムの作成には、デバッグ作業(エラーをつぶす虫取り作業のこと)も必要
   となります。
    以下に、「生年月日の表記変更」に関するマクロプログラムの見本を示し、解説を付記
   します。

          「生年月日の表記変更」マクロプログラムの例
  VBAマクロプログラムには、行番号(各行の左端の数字)はありませんが、解説の都合上
 下のコード例には記入してあります。

1   Sub 生年月日表記変更()
2   Dim masterTbl As Range, masterFld As Integer
3   Dim gengo As String, nen As Integer
4   Dim student_no As Integer, student_name As String, ic As Integer
5   '
6   Worksheets("Sheet1").Activate 'シート名「Sheet1」をアクティブシートにする
7      Range("E11") = "FIND年の位置" '見出しの表示
8      Range("F11") = "FIND月の位置"
9      Range("G11") = "FIND日の位置"
10     Range("E13") = "西暦年→元号年"
11     Range("F13") = "月の抽出"
12     Range("G13") = "日の抽出"
13     Cells(24, 5) = "生徒番号→"
14  '
15  Worksheets("名簿").Activate 'シート名「名簿」をアクティブシートにする
16  Set masterTbl = Range("マスターテーブル")
17            'マスターテーブルと名付けた表のセル範囲をmasterTblにセット
18  masterFld = 3 '生徒番号フィールドのmasterTbl内での相対的な列番号
19  ic = 0
20  For i = 2 To masterTbl.Rows.Count '見出しを除く2行目から最終行までの繰り返し
21                        'iはmasterTbl内での相対的な行番号
22    If masterTbl.Cells(i, masterFld).Interior.ColorIndex = 3 _
23         And masterTbl.Cells(i, masterFld).Interior.Pattern = xlSolid Then
24       student_no = masterTbl.Cells(i, masterFld) '変換したい生徒番号
25       student_name = masterTbl.Cells(i, masterFld + 1) '変換したい生徒氏名
26       birth_day = masterTbl.Cells(i, masterFld + 3) '生年月日
27       '生徒氏名縦書き変換
28       Sheets("Sheet1").Select
29       Range("E9") = student_name
30       Cells(24, 6 + 2 * ic) = student_no
31       Cells(25, 6 + 2 * ic) = student_name 'Cells(25,6)=Range("F25")
32       Cells(25, 6 + 2 * ic).Orientation = xlVertical
33       '生年月日を漢数字に変換
34       Range("E10") = birth_day
35      'Range("E10").Activate 'E10セルをシリアル値表示するなら、本行と次行の'をはずす
36       'ActiveCell.NumberFormatLocal = "G/標準" '..../../..をシリアル値に変換
37       Range("F10").Activate
38       ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""yyyy年m月d日"")"
                                      'R1C1形式相対アドレス
39       Range("G10").Activate
40       ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],4)" '西暦年の抽出
41       '
42       Range("E12").Select
43       ActiveCell.FormulaR1C1 = "=FIND(""年"",R[-2]C[1])" '年の文字列の位置抽出
44       Range("F12").Select
45       ActiveCell.FormulaR1C1 = "=FIND(""月"",R[-2]C[0])" '月の文字列の位置抽出
46       Range("G12").Select
47       ActiveCell.FormulaR1C1 = "=FIND(""日"",R[-2]C[-1])" '日の文字列の位置抽出
48       If birth_day < 4595 Then
49         gengo = "明治"
50         nen = Range("G10") - 1867            '元号年に変換するための調整
51       ElseIf birth_day >= 4595 And birth_day < 9856 Then
52         gengo = "大正"
53         nen = Range("G10") - 1911
54       ElseIf birth_day >= 9856 And birth_day < 32516 Then
55         gengo = "昭和"
56         nen = Range("G10") - 1925
57       Else 'birth_day >= 32516
58         gengo = "平成"
59         nen = Range("G10") - 1988
60       End If
61       Range("E14") = nen
62       Range("E15").Select
63       ActiveCell.FormulaR1C1 = "=TEXT(R[-1]C,""[DBNum1]"")"
64       Range("F14").Select
65       ActiveCell.FormulaR1C1 = "=MID(R[-4]C,R[-2]C[-1]+1,R[-2]C-R[-2]C[-1]-1)"
66       Range("F15").Select
67       ActiveCell.FormulaR1C1 = "=TEXT(R[-1]C,""[DBNum1]"")"
68       Range("G14").Select
69       ActiveCell.FormulaR1C1 = "=MID(R[-4]C[-1],R[-2]C[-1]+1,R[-2]C-R[-2]C[-1]-1)"
70       Range("G15").Select
71       ActiveCell.FormulaR1C1 = "=TEXT(R[-1]C,""[DBNum1]"")"
72       Cells(25, 5 + 2 * ic) = gengo & Range("E15") & "年" & Range("F15") & "月" _
73                     & Range("G15") & "日" 'Cells(25,5)=Range("E25")
74       Cells(25, 5 + 2 * ic).Orientation = xlVertical
75       ic = ic + 1
76    End If
77  Next
78  Set masterTbl = Nothing         'オブジェクトの開放
79  End Sub

   「生年月日の表記変更」マクロプログラムの解説
  1行目と79行目:プログラムは、Sub マクロ名()で始まり、End Sub で終わります。
            マクロ名の先頭文字は、英字または日本語などで数字は使えません。
  2〜4行目   :Dim文と云います。型宣言文配列宣言の機能を持っています。
            2行目は、変数masterTblを領域変数(Range)として、変数masterFldを
                  整数型変数(Integer)として使用しなさいと宣言しています。
                  複数の変数を並べて宣言するときには、カンマで区切ります。
            3行目は、変数gengoを文字型変数(String)、nenを整数型変数として宣言
                  しています。文字型変数とは、数値ではなく文字を扱う変数の
                  意味です。
            なお、gengo,nen,masterTblなど変数に付けた名前のことを変数名と云い
            ます。記憶場所(メモリ)は個々の変数名に割り当てられ、区別されます。
  5行目     : ' は「注釈(コメント)」の印で、プログラムの実行時には読み飛ばされて
            何も影響を与えません。文の先頭や文の途中に置かれ、プログラムを見易
            くしたり、簡単な説明を入れるために注釈を用います。注釈については入力
            を終えてEnterキーを押すと、自動的に緑色の表示になります。
  6行目     :「Sheet1」という名前のシートをアクティブにしなさい。即ち、クリックして選択
            した状態にしなさい。
  7〜13行目  :「Sheet1」上におけるRange或いはCellsの( )で指定されたセルに右辺の
           " "で囲まれた文字列を代入、表示しなさいの意味。
           2通りの方法で表示できること、Rangeの場合は()内は" "で囲ったA1形式で、
           Cellsの場合は(行番号、列番号)で記述されることに注意して下さい。
  16行目    :シート名「名簿」にある「マスターテーブル」という名前で登録された表を
           領域変数masterTblにセットしなさい。
  18行目    :整数型変数masterFldに数値3を代入して保存しなさい。
            変数名=数値(または式、変数)のような文を算術代入文と云います。
            これは、「左辺と右辺が等しい」の意味ではなく、右辺の数値あるいは
            変数に保存されている数値、式の計算結果を左辺の変数名の記憶場所
            に代入して保存しなさいの意味です。
            同様に、19行目は「数値0を整数型変数icに代入しなさい」の意味です。
  20、77行目  :For〜Next文と云い、間に挟まれている21行目〜76行目までの文を指定
            された回数繰り返して実行します。For の後ろは、一般形で記述すると、
               ループ変数=初期値 To 最終値 Step 増分値
            であり、この例では i がループ変数(繰り返し回数を制御する変数)であり,
            初期値は2、最終値はTbl.Rows.Count(これはmasterTblにセットされた
            表の最終行までの意味)、Step以降が省略されているとデフォルトの増分
            値1となります。即ちi=2,3,4,5,......,表の最終行まで繰り返されます。
            i=1が無いのは、マスターテーブルの名で登録した表の1行目が見出し行
            で、表記を変更する生年月日は2行目から記入されているからです。
  22、23〜76行目:If 〜End If 文の固まりです。これはIf文のバリエーションのひとつで、
             先に説明したElseIf文やElse文が無い構造となっています。
       

  If 条件式 Then
     条件式が満足されたとき実行するコード(24〜75行目)
  End If

          この例では条件式が長く22、23行の2行にまたがって記述されています。
         22行目の末尾が 半角ブランク _ となっていますが、これは継続行の印です。
         条件文の解釈は次の通りです。  

 もし
   masterTblにセットされた表(この例ではマスターテーブル)のセル
   (i行、masterFld列)のインテリア・カラーインデックスが3(即ち、赤)に等しく
              且つ  (条件文23行目の先頭のAND)
   同一セル(i行、masterFld列)のインテリア・パターンが塗りつぶし(xlSolid)
 ならば

      ()内の行番号 i はループ変数と同じなので2,3,4,....,表の最終行まで順に変わり、
      列番号は18行目でmasterFldに3が代入されているので、3列目に固定されます。
      結局、表の(i行、3列)セルが赤く塗りつぶされている場合に限り、条件式が満足
      されることになります。
        このマクロでは、シート名「名簿」において3列目の生徒番号欄のセルが赤く
      塗りつぶされている生徒について、生年月日を表記変更する仕様としています。

  24行目   :masterTblにセットされた表のセル(i行、3列)内容を変数student_noに
          代入しなさいの意味。25、26行目も同様ですが、列番号がずれている
          ことに注意して下さい。
  28行目   :シート名「Sheet1」を選択しなさい。
  29行目   :先に掲げた7〜12行目に同じです。この文では右辺が変数名になっています
          が、この変数にはあらかじめ25行目で生徒氏名が代入されています。
  30,31行目 :13行目と同じです。右辺は生徒番号、生徒氏名です。ここでCellsを用いた
          のは、表記変更する生徒が複数名の場合、列を順にずらして変更結果を記述
          するのに都合がよいからです。
          最初の1人目の生徒番号を(24行、6列)に、生徒氏名を(25、6)に記述し、
          2人目からは、列番号の定義に使用されている変数icが1,2,3と増え(75行目
          参照)それを2倍して6に加えているので、8列、10列、12列目...に名前が記入
          されます。
  32行目   :31行目で記入した生徒氏名を「縦書き」に変更しなさい。
  37行目   :セルF10をアクティブにしなさい。
  38行目   :F10セルに対してRC[-1]にあるセル(即ち、同一行で列がひとつ手前:左隣)
          内容を表示形式"yyyy年m月d日"に変更し、更に文字列に置き換えてアクティブ
          セルF10に表示しなさい。
  40行目   :アクティブセルG10の左隣セルF10にある文字列の先頭から4文字を取り出し、
          G10に表示しなさい。
  43〜47行目:先に掲げたFIND関数の「マクロの記録」を参照して下さい。
  48〜60行目:西暦年を元号年に変換するIf文で、先に掲げたコードと同じです。
          変数nenには、G10セルの内容である西暦年から元号年に変換するための
          調整数値を引いた値が代入されます。
  61行目   :変数nenに保存されている値をE14セルに表示しなさい。
  63,67,71行目:数値或いは文字列としての数字を漢数字に変え、アクティブセルに表示しな
           さい。先に掲げた「漢数字変換」のマクロの記録を参照のこと。
  72行目   :&を用いて文字列を結合し、変更された生年月日の表記をまとめています。
           変数gengoには、49,52,55,58行のいずれかで元号が代入されています。
           E15,F15,G15のセル内容は、漢数字に変換された文字列です。
           最初の1人目は(25行,5列)で名前の左隣に、2人目以降は2列おきに横に
           ずれて表示されます。この段階では横書きです。
  74行目   :「横書き」から「縦書き」に変更されます。
  75行目   :変数icの値に 1 が加算され、改めてicに代入されます。即ち、この文を実行
          する度にicが1ずつ増えます。これは列の調整に使用しています。
  77行目   :Next文は、ループ変数が最終値になっていなければ、対応するFor文(20行目)
          に戻りなさいの意味です。戻ったらループ変数は増分値だけ加算された値となり、
          再び間に挟まれた21〜76行目を実行します。
  78行目   :masterTblにセットされた領域を開放しなさい。領域変数はメモリを消費するので、
          使い終わったらこまめにメモリを開放し、他の用途に使えるようにします。

   本マクロプログラムの実行結果については、セクション末尾のサンプルシートの「Sheet1」
  を参照して下さい。

  賞状の作成
   表記変更した氏名、生年月日をMS_Wordに受け渡して、賞状などを作成するには、次の
  ようにします。
   ・ あらかじめ固定されている文章は全て入力して準備済とする。
   ・ Excelを開き、表記変更した名前、生年月日をコピーする。
   ・ MS_Wordを開き、それをペーストする。
   ・ 適宜、フォントやサイズを変更しバランスをとる。
  なお、サンプルはセクション末尾にあります。

 C-4 マクロのボタン登録 
    個々のマクロを実行するには、これまで図C−1に示したVisual Basic のツールバーの
   左端マクロの実行ボタンを押して、図C−2に示したマクロ選択画面から、その都度実行
   していました。頻繁に使うマクロについては、ボタン登録することによりマクロの実行を素
   早く行なえます。
  
  ボタン登録の手順
   1) 表示/ツールバーを選択し、フォームにチェックマークを付けて下さい。
      シート上に「フォーム」ツールバーが表示されます(図C−17参照)。  
   2) ツールバー右上2段目四角形のボタンをクリックすると、マウスの形状が十字に
     変わります。十字カーソルを移し、クリック&ドラッグしてボタンを配置します。
   3) 図C−18に示すような「マクロの登録」画面が自動的に現れ、このボタンに関連付ける
     マクロを選択し、OKボタンを押します。即ち、ボタン登録はマクロ作成後可能です。
   4) シート上に配置されたボタン名をデフォルトから適切な名前に変更します。
   5) ボタンを左クリックすると、マクロの実行です。なお、3)の関連付けを行なった後で
      マクロ名を変更したら、このボタンを押しても「マクロが見当たりません」のエラー
      がでます。一旦、このボタンを削除してから新規に関連付けをして下さい。
   6)  ボタンを右クリックすると、このボタンを編集(移動、コピー、削除、変形など)できます。








  図 C−17 フォームツールバー            図 C−18  マクロの登録画面
                


 C-5 マクロプログラムのデバッグ方法
    マクロプログラムを作成している段階では、コンパイルエラーや実行時エラーなど様々な
   エラーに遭遇します。このとき、エラーメッセージ表示画面の「ヘルプ」或いは「デバッグ」
   ボタンを押してもヘルプ画面に何も表示されない場合には、以下の対応に従います。

  エラー時対応
   1) エラーメッセージ表示画面の「OK」或いは「終了ボタン」を押します。
   2) エラーメッセージをたよりに該当部分を捜し当て、プログラムを修正します。
   3) この段階ではプログラムが中断された状態なので、実行/リセット を押して、
      中断の状態を解除します。
                       図 C−19 実行リセット
                  
        
   4) 再度、プログラムを実行します。必要ならば、デバッグモードでブレイクポイントなどを
      設定してから実行します。
   5) 上記1)〜4)を繰り返し、エラーをつぶしていきます。













                      図 C−20 デバッグメニュー
              


 C-6 モジュールの整理
    マクロの記録やマクロプログラムを作成していると、Excelを起動する毎に別のモジュールに
   それらが記録され、いつの間にかモジュールが沢山増えて、整理する必要にせまられます。
   特に、Public宣言をして変数を共有する場合には、同一モジュールに存在するマクロ間の
   共有となるので、注意が必要です。以下に整理方法について説明します。

  モジュールの整理方法
   1) マクロ編集画面を開き、「プロジェクトエクスプローラ」のアイコンを押します。

        
                  ↑
                プロジェクトエクスプローラ

   2) 画面左側にプロジェクトエクスプローラの画面が表示されます。
       
         図 C−21 プロジェクトエクスプローラ画面
       

   3) 上の画面で標準モジュールの下位にあるModuleの左に表示されているアイコンを
      ダブルクリックすると、該当モジュール内のマクロプログラムが全て表示されます。
      これを適宜、カット&ペーストで整理して残したい他のモジュールへ移動整理します。
   4) 移動して整理した結果、中が空のモジュールが生じたならば、そのモジュールを開放
      (削除)します。「削除する前にエクスポートしますか?」の問いに「いいえ」で答えると
      削除されます。

            図 C−22 モジュール開放画面
        

 C-7 生年月日の表記変更サンプルシート

   「生年月日表記変更Readme」シート

  








   「名簿」シート



   「Sheet1」シート






  賞状サンプル

  

索引
ページの先頭へ戻る
目次へ戻る