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


VBA?第4回  実践で、実力UPしよう!!
 (【EXCEL2000】を使用して、説明しています!!
シートとVBAの組合せ
今回の狙い目
●スクロールバーで名簿表のデータを保存してみよう!!
●WorkBook_Openイベントを使おう!!
★データ保存
 さて、今回は、シート【入力】からシート【名簿】への保存を考えてみようと思います。
 実際どうするかといえば、スクロールバーを使う直前に、先に入力表のデータを
 住所録に保存をかけ、その後に、前回したデータの読込みを行えば、いいということで
 目的は達成するわけだよねぇ
 
 ここで、ちょっと考えてみてください。
 スクロールバーで番号を表示するのは、入力者の意志により決定されますね、
 この番号では、保存はかけられません!!
 つまり、保存をかけようとすれば、スクロールバーを動かす直前の番号が
 必要不可欠です。直前の番号がわかれば、その番号で保存をかけ、
 そして、前回行った処理(VBA)で表示をかければ、一連の動作が完結という
 ことになります。

 たこちゅーは2通りの方法を考えてみましたので、参考にしてみてください。

 ●スクロールバーのリンクセルをそのまま使う方法
   前回の方法では、スクロールバーとセルA1とはリンクしている設定でした。
  それを元にマクロを作成したわけです。
  


  追加として、シートの別の場所に(例えば、使っていない場所、例はセルA2)、
  表示を終えた直後のスクロールバーの番号一旦そこに保存します。↑図参照

  前回の式はこうでしたねぇ
Private Sub ScrollBar1_Change()
 Dim Sh1 As Worksheet  
 Dim Sh2 As Worksheet  
 Dim i As Integer, n As Integer  

  Set Sh1 = Sheets("入力")
  Set Sh2 = Sheets("名簿")

 With Sh1 
  n = .Range("A1")
  For i = 1 To 12 Step 1
   .Cells(i + 2, 3) = Sh2.Cells(n + 1, i + 1)
  Next
 End With

 Set Sh1 = Nothing
 Set Sh2 = Nothing
End Sub

   
   一旦保存の式は End Withの前にこの式を入れておけばOKです。
   .Range("A2") = .Range("A1")

 保存は、読込みの逆をすればいいわけですから右辺と左辺を逆にして
 次式がなりたちます

    n = .Range("A2")
    For i = 1 To 12 Step 1
      Sh2.Cells(n + 1, i + 1) = .Cells(i + 2, 3)
    Next

Private Sub ScrollBar1_Change()
 Dim Sh1 As Worksheet  
 Dim Sh2 As Worksheet  
 Dim i As Integer, n As Integer  

  Set Sh1 = Sheets("入力")
  Set Sh2 = Sheets("名簿")

 With Sh1 

  n = .Range("A2")
  For i = 1 To 12 Step 1
   Sh2.Cells(n + 1, i + 1) = .Cells(i + 2, 3)
  Next


  n = .Range("A1")
  For i = 1 To 12 Step 1
   .Cells(i + 2, 3) = Sh2.Cells(n + 1, i + 1)
  Next
  .Range("A2") = .Range("A1")
 End With

 Set Sh1 = Nothing
 Set Sh2 = Nothing
End Sub

★WorkBook_Openイベントを使おう
  もし、シート【入力】のセルA2に空白、もしくは数字が入力されていたら
  どうだろう!!
  スクロールバーを動かした時点で、シート【名簿】のとんでもない位置に
  保存されてしまうという恐れがある。
  セルA1は、スクロールバーでリンクされているので、イタズラで
  入力しないかぎり変な数字は入らないので、一応安心な領域ともいえる。
  例え、数字以外の文字でも、スクロールバーを動かすことで修正される
  ただし、A2はスクロールバーを動かした後でしか、リンクされないので
  要注意なのだ!!

  そこで、安全に安全を考えて、エクセルのファイルを立ち上げた時点
  (読込んだときに)で、セルA1のデータがセルA2の値を代入する。
  そのような設定をしておくことで、安全度を高めるのだ。

  そこで、このファイルを立ち上げたらおこるイベントを紹介する!!
  それが、
   Private Sub Workbook_Open()
  というイベントだ!!(↓下図参照)


  これは、※1プロジェクトエクスプローラで表示されている
  ThisWorkBookを右クリックして【コードの表示】をクリックしよう!!
  ブックモジュールシート(と呼ばないかもしれないが?とりあえず
  (ThisWorkBook(コード)の場所のこと)が開かれる。
  そして(General)と書いてあるコマンドボックスの▼ボタンを選択して
  Workbookを選択!!
  右のコマンドボックスの▼ボタンを押してOpenを選択すると、自動的に

   Private Sub Workbook_Open()
   End Sub


   というコードが自動的に入力されたはずだ!!
   このイベントコードの中に
   つまりA1のセルをB1のセルに代入する式 

   With Worksheets("入力")
     .Range("A2") = .Range("A1")
   End With


   を記述する

  これだけの記述で、安全度パワーアップ!! q(^◎^*)p
  WorkbookOpenのイベントは、よく使用するので、
  ここで是非、覚えておいて欲しい!!


  ※せんだって、oyajiさんに教えていただきました
   標準モージュールに以下のコードを記述する。
  Sub Auto_Open()
  ・
  ・
  End Sub
   
   この方法でも、ファイルを開くと自動的にここで書かれたマクロが実行される
   ということだ!!これも併せて覚えておこう!!

 ●スクロールバーでリンクを解除させて、行う方法
  
  この場合、【入力】セルA2には、スクロール番号をマクロから制御させて行います。
   ※この、方法だと、このシートモジュールで、
     Sub 表示( ) と Sub 保存() を分けて記述する方が便利だ!!
     (標準モジュールだと、スクロールバーの記述が少し面倒だし
      スクロールバーがあるシートモジュールで記述する方が経験上、、
      エラーも出難いので、ここはシートモジュールで書いておこう!!)

  ワークブックのオープンには、
   Private Sub Workbook_Open()
    表示
   End Sub
  
    とさせて、スクロールバーチェンジのイベントには
  Private Sub ScrollBar1_Change()
    保存
    表示
  End Sub
   となるようにしておこう

  Sub 表示( ) 
   n=ScrollBar1.Value
   ・
   ・
   ・
  End Sub

  Sub 保存( ) 
    Dim n as Long
    
    n=Range("A1") '※2
   ・
   ・
   ・
  End Sub
    
  
  え〜と、この方法については、コードは記述しないので
  自分で考えてみましょう!!q(^◎^*)p
    

 
 よ〜し、今回は少し少なめだけど、ここまで・・・
 保存方法とWorkbookOpenイベント、理解できたかな?

 え〜、VBAには、たくさんのイベントが山ほどあるんだけど
 (安心なされ!!たこちゅーも、ほんの一部しかしらんのじゃわい!! (∩_∩)ゞ )
 全部しることなんて、絶対できないし、覚える必要もないと思う。

 でも、たこちゅーがやっていることは、基本的なことしか書いていません。
 ほんのかいつまみの部分なので、是非、マスターしてくださいね、

 そして、マクロ(VBA)を使って、エクセルをもっと便利に使いましょう!!


※1
  表示していなければ
【メニューバー】【表示】の中にある、
  クリックしてプロジェクトエクスプローラを表示させておこう!! 
【戻る】 
※2
  シートモジュール内の場合、そのシートを選択している状態になっている
  ので、わざわざSheets("入力").・・・としなくても、RangeやCells( )だけで
  OK!! 通常は、ちゃんとシート名を付けておこう!!  
【戻る】



 P.S
   難しいコードのマクロが使えなくても、シートを作業用として一旦保存することで、
 うまくマクロが回ってくれる。是非、応用してくださいね。

 また、今回使用した入力シートのセルA2の数字を見せたくなければ、文字をバックの色と
 同じ色にし、隠し文字としておけばいいだろうし、あるいは、その上にスクロールバーを
 置いて、そのセルを隠してしまえば、より安全になるだろう!!
 作り手としては、たとえVBAが完全なものでないにしても、ちょっとした工夫をすることで、
 かなり、いいものができるのではないかなぁ、

  さて、次回は、ハガキ用印刷を使うのに、番地等を漢数字を使いたいので、その変換マクロを、
  そして、自分の関数(ユーザー定義関数)を作ってみたいという人のために、
  その作成方法について紹介してみたいと思います
  では、お楽しみに ♪(゚・^*)ノ⌒☆ See You!!
 

【BACK】  【HOME】 【NEXT】
 03-03-14UP!!