EXERCISE02: train0201   2007-1-8 by KOMPas  
 
  exercise02.xls  
 
  「はがき印刷インサツ」で紹介ショウカイした「転記テンキマクロ」を、スコしおさらいしておきます。    
     
  Sheet3.Cells(5, 5) = Sheet10.Cells(23, 12)    
  といったコードは、  
  右辺ウヘンを、左辺サヘン転記テンキするコードであることをここで確認カクニンしておきます。  
  つまり、上記ジョウキコードは、  
  右辺ウヘン Sheet10シートのセルL23 のデータを、  
  左辺サヘン Sheet3シートのセルE5 に転記テンキする  
  というコードだ、ということです。  
 
  抽象的チュウショウテキなものは説明セツメイするとややこしくなりがちですが、  
  変数ヘンスウX という、EXCELシートジョウにはない、仮想カソウのデータを使ツカって、シタのコードをみてみると、  
  X = Sheet10.Cells(23, 12)    
  このコードは、  
  右辺ウヘン Sheet10シートのセルL23 のデータを、  
  変数ヘンスウX に転記テンキする  
  という意味イミになります。  
  変数ヘンスウXは、EXCELシートにまれているわけではなく、  
  あなたが使っているコンピュータが「覚えている」のだと、カンガえてください。  
  オナじく、シタのコードは、  
  Sheet3.Cells(5, 5) = X    
  右辺ウヘン 変数ヘンスウX のデータを、  
  左辺サヘン Sheet3シートのセルE5 に転記テンキする  
  という意味イミになります。  
  2つをあわせて、  
  X = Sheet10.Cells(23, 12)    
  Sheet3.Cells(5, 5) = X    
  のようにくと、  
  Sheet3.Cells(5, 5) = Sheet10.Cells(23, 12)    
  オナ意味イミになります。  
 
  ツギのコードは、  
  X = X * 3 + 10    
  右辺ウヘン Xを3バイして10したカズを、  
  変数ヘンスウX に転記テンキする  
  という意味イミになります。  
  このコードがはしると、  
  変数ヘンスウXは、もとのXの3バイに 10したアタイにかわります。  
 
  もう1つ、  
   i = 23    
   j = 12    
  X = Sheet10.Cells(i, j)    
  というコードは、  
  X = Sheet10.Cells(23, 12)    
  オナじものであることをここで理解リカイしてください。  
 
  では、あなたのスケジューラをツクってみましょう。    
 
  カラのEXCELを、新規シンキ作成サクセイでつくってください。  
  「ファイル」−「名前ナマエけて保存ホゾン」で、適当テキトウ名前ナマエ(カレンダ.xlsトウ)で保存ホゾンします。  
 
  まず、「カレンダ」様式ヨウシキツクってみます。    
 
  様式ヨウシキをつくるときは、チイさなオナハバレツをたくさんツクっておいてはじめるのがコツです。  
  (「はがき印刷インサツ」ではがき様式ヨウシキをつくったときのように)  
  1週間シュウカンが7ニチで、6シュウブンあれば、スベてのツキのカレンダがこなせます。  
  めんどうくさいので、このEXCELの「カレンダ」シートをペイジコピーしてください。  
  この「カレンダ」様式ヨウシキは、カクブンハバは5レツとることにして、日付ヒヅケで1ギョウ、データに2ギョウとり、わせて3ギョウです。  
    (5レツではなく、13レツにするとか、データに8ギョウいるとか、あとで、おもいっきり変更ヘンコウしてください。あとで)  
     
  あなたのEXCELで、「カレンダ」様式ヨウシキをつくったシートがSheet1だとして説明セツメイツヅけます。  
 
  「カレンダ」様式ヨウシキツキ変更ヘンコウすると、カレンダをツクナオすマクロをいてみましょう。    
 
  「ツール」「マクロ」「Visual Basic Editor」のジュンヒラいて、  
  左側ヒダリガワの「プロジェクトエクスプローラ」で、Sheet1をダブルクリックします.。  
  ミギのコードランの、一番イチバンウエ左側ヒダリガワ「(general)」といてあるところを、「Worksheet」に変更ヘンコウします。  
  そのヨコが、(Declarations) から、「SelectionChange」にわったはずです。  
  ミギハシ下向シタム三角サンカク▼をクリックして、リストを表示ヒョウジさせ、  
  「Change」をエラんでください。  
  すると、シタのほうに、  
  Private Sub Worksheet_Change(ByVal Target As Range)    
     
  End Sub    
  表示ヒョウジされましたか?  
 
  ここに以下イカのコードを(根性コンジョウで)記述キジュツします。グリーンオヨダイダイ文字モジ/ギョウはコメントなので、省略ショウリャクしてください。  
    シロ文字モジだけが正味ショウミのコードです。(34ギョウです)  
    'Target はデータを書き換えた場所。rr はtarget左上セルの行番号、cc は左上セルの列番号。
   
  rr = Target.Row    
  cc = Target.Column    
  If rr = 2 And cc = 28 Then    
  '変更した場所が2行目 28列 (つまりAB2セル)なら、    
      'つまり、月を書き換えたら、    
      'マクロは仕事(カレンダーを設定しなおす)をはじめます。    
          yy = Sheet1.Cells(2, 23)    
          mm = Sheet1.Cells(2, 28)    
          dd1 = DateSerial(yy, mm, 1)    
          dd2 = DateSerial(yy, mm + 1, 0)    
          ddnn = Day(dd2)    
          '対象月の1日の曜日を調べます。    
          'weekday関数は、引数に日付を与えると、    
          '曜日番号(日=1、月=2、火=3、水=4、木=5、金=6、土=7)を返します。    
          wd1 = Weekday(dd1)    
          '魔法の定数mahoo を求めます。    
          mahoo = wd1 - 1    
              
      'カレンダの日付欄が、このシートでは、毎日5列右に移動し、    
      '週がかわると、3行下にとんで、B列に戻ることを確認してください。    
          For i = 0 To 5    
              For j = 0 To 6    
                    '繰り返し処理を使った「転記」コードです。    
                    '転記するのは、「■」というデータです。    
                    '下のコードは、(6+3*1)行、(2+5*j)列 のセルに「■」を埋め込みます。    
                    'i,j が増えていくにいたがって、42個のセルに順に「■」を埋め込みます。    
                  Sheet1.Cells(6 + 3 * i, 2 + 5 * j) = "■"    
                  '同時に日付欄の1つ下のセルを空白にします。    
                  Sheet1.Cells(6 + 3 * i + 1, 2 + 5 * j) = ""    
                  'ついでに日付欄の2つ下のセルを空白にします。    
                  Sheet1.Cells(6 + 3 * i + 2, 2 + 5 * j) = ""    
                      
              Next j    
          Next i    
      '上記でみたように、    
      'カレンダの日付欄が、このシートでは、毎日5列右に移動し、    
      '週がかわると、3行下にとんで、B列に戻ることを確認してください。    
      'uu は uu=0 で始まりますが、1つの日付欄を処理する時に、uuは、1増えます。    
      'uu は、42個の日付欄番号のようなもんだと思ってください。    
      'カレンダ様式への転記は、上記或いは下記のように、通常繰返し処理を使って行うと便利です。    
      '下方向へは i 、右方向へは j の値を1つずつ増やすことで、    
      '   Sheet1.Cells(6 + 3 * i, 2 + 5 * j)    
      'つまり、6 + 3 * i 行目 (6行目から始めて、i * 3 行ずつ下に移動した行)    
      '    2 + 5 * j 列  (2列目から始めて、j * 5 列ずつ右に移動した行)    
      'の日付欄にuu から計算できるデータを書き込みます。    
          uu = 0    
          For i = 0 To 5    
              For j = 0 To 6    
                  uu = uu + 1    
                  ddx = uu - mahoo    
                  'おやまぁ不思議。ここで求めたddxが、日付です。(あたりまえ)    
                  '(余韻)    
                  '日付ddxが、1 より小さいとき、    
                  '及び、当月の末日より大きいときは、日付ddxをかきこまない。    
                  If ddx < 1 Then    
                  ElseIf ddx > ddnn Then    
                  Else    
                  Sheet1.Cells(6 + 3 * i, 2 + 5 * j) = ddx    
                  End If    
              Next j    
          Next i    
      '「カレンダの基本」といいたものがあるかもしれませんが、僕は知りません。    
      'わかりやすいコードをと、思いましたが、    
      '「計算が理解できない」かもしれません。    
      '試してみて、うまくいくようなら、コピーしてお使いください。    
          
      '日付欄の埋め込みを2回に分けて行っていますが、    
      '勿論1回ですませてかまいません。    
          
      'カレンダを作り終わったら、お約束の印刷マクロを書き加えます。    
      www = MsgBox("印刷しますか", vbOKCancel)    
      If www = vbCancel Then    
      Else    
          Sheet1.Range("a1:ak24").PrintOut 1    
      End If    
          
  End If    
 
  つぎに、「予定ヨテイヒョウ」シートをツクります。    
 
  「はがき印刷インサツ」でもやったように、一覧イチランヒョウは「連結レンケツ」しないほうがなにかと便利ベンリです。  
  様式ヨウシキは「連結レンケツ」でつくったほうが便利ベンリで、一覧イチランヒョウはそうでないほうが便利ベンリです。  
  連結レンケツ」を使ツカうと、コードをくときにいらぬ手間テマがかかります。  
  また、EXCELの強力キョウリョクな「ナラえ」や、「コピー」するのがややこしくなってしまいます。  
 
  4行目ギョウメAレツからジュンに、ネンツキ曜日ヨウビ本文ホンブン種類シュルイ記録者キロクシャ の見出ミダランツクります。  
  5行目ギョウメ以下イカが、カレンダに表示ヒョウジする「予定ヨテイ」を記述キジュツする場所バショですが、  
  曜日ヨウビランにはEXCELシート関数カンスウで、下記カキんでみてください。  
  =IF(A5="","",MID("日月火水木金土",WEEKDAY(DATE(A5,B5,C5)),1))  
  (もっと簡単カンタンシキがあるのでしょうが、とりあえずつくってみました)  
  種類シュルイランは、「私用シヨウ,仕事シゴト,コヨミ」のリストにしてみます。(このEXCELではリスト以外イガイ入力ニュウリョク  
  リストのツクカタはここでは省略ショウリャクします。  
  (リスト以外も入力可にするには、  
  「データ」「入力ニュウリョク規則キソク」「エラーメッセージ」で、  
  無効ムコウなデータが入力ニュウリョクされたら云々ウンヌン・・・」のチェックをはずします。  
 
  あなたのEXCELで、「予定ヨテイヒョウ」をつくったシートがSheet2だとして説明セツメイツヅけます。    
     
  「カレンダ」をダブルクリックすると、「予定ヨテイヒョウ」シートからトウツキデータむマクロをツクります。    
 
  「ツール」「マクロ」「Visual Basic Editor」のジュンヒラいて、  
  左側ヒダリガワの「プロジェクトエクスプローラ」で、Sheet1をダブルクリックします.。  
  イマコードをもうとしているのは、「予定ヨテイヒョウ」ではなく「カレンダ」です。  
  ミギのコードランの、一番イチバンウエ左側ヒダリガワ「(general)」とあれば、「Worksheet」に変更ヘンコウします。  
  そのヨコには、「Change」トウ表示ヒョウジされています。  
  ミギハシ下向シタム三角サンカク▼をクリックして、リストを表示ヒョウジさせ、  
  「BeforeDoubleClick」をエラんでください。  
  すると、シタのほうに、  
  Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)    
     
  End Sub    
  表示ヒョウジされましたか?  
 
  ここに以下イカのコードを(根性コンジョウで)記述キジュツします。グリーンオヨダイダイ文字モジ/ギョウはコメントなので、省略ショウリャクしてください。  
    シロ文字モジだけが正味ショウミのコードです。(34ギョウです)  
  'まず、当月を求める    
      yy = Sheet1.Cells(2, 23)    
      mm = Sheet1.Cells(2, 28)    
      dd1 = DateSerial(yy, mm, 1)    
      dd2 = DateSerial(yy, mm + 1, 0)    
      ddnn = Day(dd2)    
      '対象月の1日の曜日を調べます。    
      'weekday関数は、引数に日付を与えると、    
      '曜日番号(日=1、月=2、火=3、水=4、木=5、金=6、土=7)を返します。    
      wd1 = Weekday(dd1)    
      '魔法の定数mahoo を求めます。    
      mahoo = wd1 - 2    
  'カレンダ表示するための検索条件を求めます。    
      key = Sheet1.Cells(2, 13)    
  'カレンダの内容表示の初期化    
          For i = 0 To 5    
              For j = 0 To 6    
                  '繰り返し処理を使った「転記」コードです。    
                  'i,j が増えていくにいたがって、42個の日付欄を日付はそのままで、内容欄だけ空白を埋め込みます。  
                  Sheet1.Cells(6 + 3 * i + 1, 2 + 5 * j) = ""    
                  Sheet1.Cells(6 + 3 * i + 2, 2 + 5 * j) = ""    
                      
              Next j    
          Next i    
  '予定表から検索して、該当したら、カレンダに書き込みます。    
      i = 5    
      Do Until Sheet2.Cells(i, 1) = ""    
      If Sheet2.Cells(i, 1) = yy And Sheet2.Cells(i, 2) = mm Then    
      '予定表データの年/月が、当月だったらBingo!    
          '予定表データがキーワードに該当するか否かをコード上で判断し、    
          '予定表データの日付から、カレンダのどの位置に表示すべきかを計算でもとめます。    
          '予定表    
          'ddx は予定表データの日付     注意チュウイ!  
          ddx = Sheet2.Cells(i, 3)     2007-2-4 下記カキバグってました。おずかしい。  
  バグ修正シュウセイ         '日付から、魔法の定数をプラスして求めた値uu は、カレンダの日付欄番号(但し始めは0番)となります。           '日付から、魔法の定数をマイナスして求めた値uu は、カレンダの日付欄番号(但し始めは0番)となります。
          uu = ddx + mahoo             uu = ddx - mahoo  
          'uu を 7で割った商は、カレンダの週番号tgti(0から始まる)。余りが曜日番号tgtj(0から始まる)に該当します。  
          tgti = Int(uu / 7)    
          tgtj = uu Mod 7    
          '下段は、予定本文と予定種類をあわせたデータでkeyをさがします。    
          '予定本文    
          caldata = Sheet2.Cells(i, 5)    
          '予定種類    
          shurui = Sheet2.Cells(i, 6)    
          If shurui = "暦" Then    
          '種類が暦のとき、本文を上段に転記します。    
              If Sheet1.Cells(6 + 3 * tgti + 1, 2 + 5 * tgtj) & "" = "" Then    
              Sheet1.Cells(6 + 3 * tgti + 1, 2 + 5 * tgtj) = caldata    
              Else    
              Sheet1.Cells(6 + 3 * tgti + 1, 2 + 5 * tgtj) = Sheet1.Cells(6 + 3 * tgti + 1, 2 + 5 * tgtj) & vbLf & caldata  
              End If    
          ElseIf key & "" = "" Then    
              'キーワードに何も指定がないとき、暦以外のデータ全てを下段に転記します。    
              If Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) & "" = "" Then    
              Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) = caldata    
              Else    
              Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) = Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) & vbLf & caldata  
              End If    
          ElseIf InStr(caldata & shurui, key) Then    
              '上段キーワードに指定した文字が、予定表本文または種類データに含まれるとき、転記します。  
              If Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) & "" = "" Then    
              Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) = caldata    
              Else    
              Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) = Sheet1.Cells(6 + 3 * tgti + 2, 2 + 5 * tgtj) & vbLf & caldata  
              End If    
          End If    
      End If    
      i = i + 1    
      Loop    
          
      'カレンダへの転記が終わったら、お約束の印刷マクロを書き加えます。    
      www = MsgBox("印刷しますか", vbOKCancel)    
      If www = vbCancel Then    
      Else    
          Sheet1.Range("a1:ak24").PrintOut 1, 1    
      End If    
        
  ここまでで、イチ仕事シゴト完了カンリョウです。    
 
  本来ホンライのお題目ダイモクである「データベースとのやりとり」マクロには、ここまでナニをつけていませんが、  
  予定ヨテイヒョウ」にんで、これを「カレンダ」に出力シュツリョクして印刷インサツする、  
  ということはできるわけです。  
  ここからサキは、train0202ペイジみます。  
  sampleとしては、ここまで同様ドウヨウ、このEXCEL「予定ヨテイヒョウ」「カレンダ」にコードをんでいます。  
  (このEXCELジョウのVBAコード本体ホンタイのほうでは、「カレンダ」は、Sheet3で処理ショリしていることに、ご注意チュウイ)  
 
  train0202  
 
 
 
 
KOMPas    
 
  TEL   0949-29-2334  
  FAX   0949-29-2332  
  携帯ケイタイ   090-6777-4241  
  email   kompas@enissi.com (返事ヘンジ期待キタイしないでください)