FC2ブログ

スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

イベント処理記述の変形 


先の記事「Excel ファイルのプレビュー」で、
コマンドボタン「btnC1」(標題:左)、「btnC2」(標題:右)のクリック時に 5列動かすために以下を記述していました。

Private Sub btnC1_Click()
  Dim i As Long

  i = iShowCol
  iShowCol = iShowCol - 5
  If (iShowCol < 0) Then iShowCol = 0
  If (i <> iShowCol) Then Call ExcelScreenShow(False)
End Sub

Private Sub btnC2_Click()
  Dim i As Long

  i = iShowCol
  iShowCol = iShowCol + 5
  If (iShowCol > UBound(vBuff, 2) - 10) Then iShowCol = UBound(vBuff, 2) - 10
  If (i <> iShowCol) Then Call ExcelScreenShow(False)
End Sub

何をやっているか・・・ チョッと説明してみると
iShowCol は、読み込んだ Excel データ vBuff(1 to 50, 1 to 50) を、
列方向にどの程度移動させた状態で 10 列表示させましょうか・・・ というもの
つまり、iShowCol の取りうる値の範囲は 0 ≦ iShowCol ≦ 40 となります。(10 列は表示するので)
で、btnC1 がクリックされたら -5 列、btnC2 がクリックされたら +5 列して・・・
範囲を外れたら限界値に設定して、前と同じ値だったら、移動させた表示は不要だから抜ける・・・

まっ、これはこれで動いているんですけど・・・ 動いているけど、この記述は・・・ ブーブー
Private Sub btnC1_Click()
  Dim i As Long

  i = iShowCol
  i = i - 5
  If (i < 0) Then i = 0
  If (iShowCol <> i) Then
    iShowCol = i
    Call ExcelScreenShow(False)
  End If
End Sub
少なくとも上記の様にするとか
Private Sub btnC1_Click()
  If (iShowCol = 0) Then Exit Sub
  iShowCol = iShowCol - 5
  Call ExcelScreenShow(False)
End Sub
の様にすれば良いんじゃ・・・ 異論はありません。
記述している環境・状況によって変化させていけば良いと思います。

今回は、書き方ではなく、考え方を変化・変形していきます。
 
まず、1段目の変形では
計算する部分・・・・ これ1つの関数に集約しておきましょう・・・ ということで
Private Sub fncColMove(iNum As Long)
  Dim i As Long

  i = iShowCol
  iShowCol = iShowCol + iNum
  If (iShowCol < 0) Then
    iShowCol = 0
  ElseIf (iShowCol > UBound(vBuff, 2) - 10) Then
    iShowCol = UBound(vBuff, 2) - 10
  End If
  If (i <> iShowCol) Then Call ExcelScreenShow(False)
End Sub

Private Sub btnC1_Click()
  Call fncColMove(-5)
End Sub

Private Sub btnC2_Click()
  Call fncColMove(5)
End Sub

書き方はともかく、各ボタンでの記述は1行になっちゃいましたね・・・・
また、引数(パラメータ)を見ると、-5 or 5 になっていて・・・ 
何かに対して 5 を増減させるのかな・・・・ 簡単なイメージはできるかと・・・

上記では、Sub 関数にしましたが、Function 関数にすると、また違うイベント設定が出来ますね。
Private Function fncColMove(iNum As Long)
  Dim i As Long

  i = iShowCol
  iShowCol = iShowCol + iNum
  If (iShowCol < 0) Then
    iShowCol = 0
  ElseIf (iShowCol > UBound(vBuff, 2) - 10) Then
    iShowCol = UBound(vBuff, 2) - 10
  End If
  If (i <> iShowCol) Then Call ExcelScreenShow(False)
End Function

Function に書き換えても、従来通り Call で呼び出す事も出来ます。
戻り値に意味がない・戻り値を解釈しません・・・ であれば上記に限らず Call は使えますね。
では、違うイベント設定ということで・・・

Private Sub btnC1_Click()
  Call fncColMove(-5)
End Sub

Private Sub btnC2_Click()
  Call fncColMove(5)
End Sub
この記述は残っていても、以下を記述することで動く事がなくなります。
後々面倒なので、ここは削除しておきます。

で、フォームの読み込み時にでも、以下設定します。
Private Sub Form_Load()
  Dim iRow As Long, iCol As Long

  Call DetailHidden
  For iRow = 1 To 20
    Me("labR" & iRow).OnClick = "=fncLabRClick(" & iRow & ")"
    For iCol = 1 To 10
      If (iRow = 1) Then Me("labC" & iCol).OnClick = "=fncLabCClick(" & iCol & ")"
      Me("R" & iRow & "C" & iCol).OnClick = "=fncRCClick(" & iRow & "," & iCol & ")"
    Next
  Next
  Me.btnC1.OnClick = "=fncColMove(-5)"
  Me.btnC2.OnClick = "=fncColMove(5)"

End Sub

この記述が出来るのは Function 関数にしたものだけなので、Sub 関数を指定したらエラーに・・・
今回のコマンドボタン「btnC1」「btnC2」の引数は固定した数字でしたが、いろいろ値を変えながら・・・
例えば、
    Me("labR" & iRow).OnClick = "=fncLabRClick(" & iRow & ")"
の様にすると、
 Me("labR1").OnClick = "=fncLabRClick(1)"
 Me("labR2").OnClick = "=fncLabRClick(2)"
・・・・
とする事が出来ます。
これは、各ラベルがクリックされたら、クリックされたのは何番です・・・ の何番を引数に・・・
まぁ、ラベルのクリックではフォーカスの移動が起きないので、ActiveControl は使えないし・・・

今回のは、コマンドボタン「btnC1」「btnC2」で、フォーカスの移動するよね・・・
せっかくなので、ActiveControl を使ってみる事に
Private Function fncColMove()
  Dim iNum As Long
  Dim i As Long

  iNum = 5
  If (Me.ActiveControl.Name = "btnC1") Then iNum = -5
  i = iShowCol
  iShowCol = iShowCol + iNum
  If (iShowCol < 0) Then
    iShowCol = 0
  ElseIf (iShowCol > UBound(vBuff, 2) - 10) Then
    iShowCol = UBound(vBuff, 2) - 10
  End If
  If (i <> iShowCol) Then Call ExcelScreenShow(False)
End Function

  If (Me.ActiveControl.Name = "btnC1") Then iNum = -5
部分は
  If (Me.ActiveControl Is Me.btnC1) Then iNum = -5
でも良いですね・・・
で、イベントを設定する時には
  Me.btnC1.OnClick = "=fncColMove()"
  Me.btnC2.OnClick = "=fncColMove()"



どの記述が良い・悪い・・・ は、
環境・状況・規則云々等が絡んでくると思うので・・・ いろいろな変形パターンを覚えていたら・・・


今回、サンプルファイルはありません。
関連記事

2013/09/19

Category: 解説か

TB: --  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。