|
さて、今回は、シート【入力】からシート【名簿】への保存を考えてみようと思います。
実際どうするかといえば、スクロールバーを使う直前に、先に入力表のデータを
住所録に保存をかけ、その後に、前回したデータの読込みを行えば、いいということで
目的は達成するわけだよねぇ
ここで、ちょっと考えてみてください。
スクロールバーで番号を表示するのは、入力者の意志により決定されますね、
この番号では、保存はかけられません!!
つまり、保存をかけようとすれば、スクロールバーを動かす直前の番号が
必要不可欠です。直前の番号がわかれば、その番号で保存をかけ、
そして、前回行った処理(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!! 通常は、ちゃんとシート名を付けておこう!! 【戻る】 |
|