|
★さて、今回はスクロールバーを使って名簿の表を作成してみよう!!
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にすれば、行と列を入れ替えてくれます)
今回は、結構難しいとおもうので、この辺でおしまい!!
是非、自分で試してみてください、では (^-^)/~~ |