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


VBA?第3回  実践で、実力UPしよう!!
 (【EXCEL2000】を使用して、説明しています!
シートとVBAの組合せ
今回の狙い目
●スクロールバーで名簿表のデータを表示してみよう!!
★入力表と名簿表のリンク作り!!
 ★さて、今回はスクロールバーを使って名簿の表を作成してみよう!!

スクロールバー選択1. さて、第1回でコントロールの配置を
  やってみたときに、左の図のようにデザイン
  モードにしてプロパティの設定をおこなった
  
2.つぎは、【デザインモード】の
  ←下にある【コードの表示】
  (右図参照)のアイコンを
  クリックしてみよう!!
   
  



 3. すると、次のように自動的にコードが表示されたはずだ!!
 

  このコードは、スクロールバーに何か変化があればイベントを
  起こせるマクロです。
  スピンボタンでもいいのだけれど、スピンボタンだと増加数が限定
  (まぁ、1づつってのが通常かな?)されるので、数を一気に替えたい!!
  そんなときは、これが有効なんです。
  

 4.入力表
  入力画面
  マクロをつくらなくても、VLOOKUP()関数を使って
  セルA1の値を見るようにして、名簿表のデータ範囲を指定しておけば
  スクロールバーを動かすことによって、表示を替えることができるのは
  知っているよね。(知らない人は、もう一度初級を勉強してね!!(^・^))

  ただ、個人的に、自分だけが使用する場合、確かにこれでいいと思う。
  でも、エクセルをあまり知らない人が誤って、その式を削除したとすれば
  どうだろう!! ワーン(T-T)ヾ(^^ )ヨシヨシ てなことになるだろう!!
  
  だから、今回は、「シートの関数式を使わないで、マクロで表示させてみよう!!」
  ってのが、狙い目なんです。
  名簿

5.さぁ、今回もいきなりコードを書いてください!!と言っても、無理でしょうから
  参考に書いてみますので参考にしてください
  'の後には、コメントがかけます
  (コードは、このままコピペして張付けてください、但しシート名は
   入力画面の方は 入力 、名簿 の方は 名簿 としてください)

Private Sub ScrollBar1_Change()
 Dim Sh1 As Worksheet   'Sh1はワークシートとして宣言します
 Dim Sh2 As Worksheet   'Sh2も同様です
 Dim i As Integer, n As Integer   'i,n は整数と宣言します

  Set Sh1 = Sheets("入力") 'Sh1がSheets("入力")です
  Set Sh2 = Sheets("名簿") 'Sh2がSheets("名簿")です

 With Sh1    'ピリオッド.をつけることによってSh1が省略できます。
  n = .Range("A1")
  For i = 1 To 12 Step 1
   .Cells(i + 2, 3) = Sh2.Cells(n + 1, i + 1) 'Cells( , )でセルの指定ができます。
  Next
 End With

 Set Sh1 = Nothing
 Set Sh2 = Nothing
End Sub


コードは↑のとおりです。少し詳しくみていきましょう!!
●Private Sub ScrollBar1_Change()
  スクロールバー1に変化があれば、以下のコードが実行されます
  必ず始めの Sub に 対して 終わりの End Sub で終わります 

●変数の宣言
  変数を宣言し、それを使用することによって、プログラムが柔軟になります。
  Dimは前にいいましたけれど適用範囲です。
  今回はこのSub内で宣言していますのでこの範囲内で有効ということです。
  ※ワークシートを変数として扱うには↓のようにします。
   ワークブックのときは Asの後に Workbook とすればいいのです
  Dim Sh1 As Worksheet   'Sh1はワークシートとして宣言します
  Dim Sh2 As Worksheet   'Sh2も同様です

  整数には、Byte(255までの正)、Integer(+-32768まで)、Long(21億ぐらいまで)
  実数にはSingle、Longがありますが、ボクは使ったことがありません。
  どちらにしても、最近のCPは速度が速いので、整数はLongでもいいと思います
  (詳しくいえば、Byteは1バイト、Integerは2バイト、Longは4バイト充てられます)

  Dim i As Integer, n As Integer   'i,n は整数と宣言します

●Setステートメント
  ステートメントという言葉はひとつの完結した命令のことをいいます。
  Set でオブジェクトへの参照を、変数またはプロパティに代入します。
  つまり、仮想シートを作ったと理解すればどうでしょうか!!
  これは大変よく使うステートメントですので覚えておきましょう!!
   Set Sh1 = Sheets("入力") 'Sh1がSheets("入力")です
   Set Sh2 = Sheets("名簿") 'Sh2がSheets("名簿")です
     Set Sh1 = Sheets("入力") :Set Sh2 = Sheets("名簿")
    :で区切ることもできます。このことをマルチステートメントといいます
  仮想シートを削除しておくには Nothingを使います。方法は上のSetと同じです。
  つまり
    Set Sh1 = Nothing  'Nothigでメモリを消去しておく
    Set Sh2 = Nothing
  とします。

●Withステートメント
   一度指定したオブジェクトやユーザー定義型に対してオブジェクト名の
   再指定を省略して、一連のステートメントを実行できます。
   With ステートメントを実行すると、プロシージャの実行速度が向上します。
   また、オブジェクトを繰り返し入力をする必要がありません。(ヘルプから引用)
   つまり、これを使うと、用語の省略ができるということです。使い方は次に示します
    End With で終わらなければなりません

   With Sh1  ' ピリオッド(ドット.をつけることによってSh1が省略できます。
    ・
    ・ 
    ・
  End With

●Range
  Rangeは領域、範囲をしめしますが、セルを指定することもできます。
  セルを指定するときは Range("A1") というようにセルのアドレスを
  2つのダブルクォーテーションで挟むようにして表示します。
  文字を示すときには、必ず " " で括ることを覚えておいてください
     n = .Range("A1")
      シート【入力】のセルA1を 変数 n に代入します
      Rangeの前にピリオッドがついていますのでSh1.が省略されていることに
      注意します。
      この変数nが名簿の行番号とリンクするようにします

●For ・・・Next ステートメント
     For i = 1 To 12 Step 1
       Forはフロー制御ステートメントです。
        指定した回数だけ、一連のステートメントを繰り返します
       Step は増加数で 1 の場合は省略できます
       つまり1から12まで繰り返すということです。
       最後はNextで終わらなければなりません
   ★Cells
     Cells( , )でセルの指定ができます。sが付いているのに注目してください
     Cellではダメです。
          ()内の 左が行 で、 右が列 の指定です
          Cells(1,2)の場合、セル B1 ということになりますね。

       .Cells(i + 2, 3) = Sh2.Cells(n + 1, i + 1)
          プログラムの = は、数学の = ではないことを
          理解しておかなくてはなりません。
          左=右 右の物を、左の入れ物に入れると理解してください
          たとえば
            A=10:B=5 となっているとき、
        これは A=Bにはならないよね、でもプログラムでは,これはOKなんです
           そして  A = B すれば
           結果は  A = 5になります。
        つまり、右のものは、左になってしまうのです。

        実際にはどのような動きをするかといえば
        (↑の式を見ながら考えてくださいネ!!)

       i = 1 のとき左の項は
       .Cells(1+2,3) ですので シート名 「入力」の3行目、3列目という
       ことですから セルC3の位置ということになります。

       右の項は nの変数が1、つまり番号が1の時には、
       Sh2.Cells(1+1,1+1) つまりシート「名簿」の2行目、2列目になります
       つまり、セルB2 の位置ということになります。

        Forの命令によって i が順番に増加されていきますから
        左の項は、シート「入力」のセルC3から下の行へ、
        右の項は、シート「名簿」のセルB2から列が左の方へと
        ひとつづつ移動、順次右の項の値が、左の項へ代入されていくわけです
       
     Next    Next i と書きますが、引数 i はこの場合、    
             For・・Nextが1つだけなのでiは省略できます
            NextからForへもどります。

 入力データと名簿データが連続して並んでいるので、
 コピペでもできるんだけど、今回はそれはパスします.
 方法として例えば
  sh2.Range(Cells(n+2,2),Cells(n+2,13)).Copy
  .Range("C3").PasteSpecial Paste:=xlValues,Transpose:=True
  てな具合になるとおもうんだけど、詳しくはヘルプにも書いてあるので
  調べてみてください。
   (ペーストは値だけ、TransposeをTrueにすれば、行と列を入れ替えてくれます)
 
今回は、結構難しいとおもうので、この辺でおしまい!!
是非、自分で試してみてください、では (^-^)/~~
  
  次回は、保存する場合、コマンドボタンを使って【保存】のイベントをすればいいのだけれど
  でも、ついスクロールボタンを押してしまって、折角入力したデータが失ったということになりかねない
  だから、スクロールボタンを押すことにより、保存ができる方法を考えてみたい!!
  次回を、お楽しみに!!

【BACK】  【HOME】 【NEXT】
03-03-10UP!!
03-03-14更新!!