|
▼おじさん46 さん:
こんばんは。
> 膨大な資料をありがとうございます。
いえいえ、膨大ではないです。けれど、ぼくも冗長と感じます。
その原因は、前述のように、シートとUserForm1とで、同じような処理を
2度書いているからです。
UserFormのコントロール名を変えたりすると、今のままでは
修正を2か所にたいして実行しないといけない。これは面倒だし、
どこを修正しなければならないか、そのうち忘れてしまう恐れが
あります。
現行の流れが分かったところで、
> 次のステップ
として、共通処理をサブルーティンとして独立させてみましょう。
たとえば、
標準モジュールに、
>-------------------------------------------------------
' Target: 転記するシートのA列のセル
' Uf :転記先のユーザーフォーム
Sub UserFormに転記1(ByVal Target As Range, ByVal Uf As MSForms.UserForm)
Ufの Caption に Target の値を書き込む
1〜6番までループして
番号別に Target.Offset(, i).Value の値を
指定のコントロールに書き込む処理を
( Private Sub TextBox7_AfterUpdate() からコピー編集して)
ここに書き込む
End Sub
と、独立させておくと、
>-------------------------------------------------------
> Private Sub TextBox7_AfterUpdate()
のほうは、
Dim 行番号 As Long
Dim Target As Range
行番号 = Val(Me.TextBox7.Text)
Set Target = ActiveSheet.Cells(行番号, 1)
UserFormに転記 Target, Me '◆サブ呼び出し
Target.Select
End Sub
だけになり、
シートのほうも、
>-------------------------------------------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'A列セル選択右クリックでセルデータ収集後フォームを開く
If Target.Column <> 1 Then Exit Sub
If Target.Row = 1 Then Exit Sub
Cancel = True
Set Target = Target.Item(1)
UserForm1.Show vbModeless
UserFormに転記 Target, UserForm1 '◆サブ呼び出し
UserForm1.TextBox7.Text = Target.Row
End Sub
だけで済むことになります。そして、基本的には、メンテナンスは
呼び出し先の(標準モジュールに書いた)『UserFormに転記』を
編集すれば済むことになります。
たとえば、こんな風に、
'------------------------------------------------- 標準モジュール
Sub UserFormに転記(ByVal Target As Range, ByVal Uf As MSForms.UserForm)
Dim i As Long
Dim myValue As String
Dim ACtrl 'A列からのOffset番号に対応する書き込み先のControl名の配列
ACtrl = Array("", "TextBox1", "ComboBox1", "ComboBox2", _
"TextBox4", "TextBox5", "TextBox6")
Uf.Caption = Target.Value
For i = 1 To 6
Uf.Controls(ACtrl(i)).Text = Target.Offset(, i).Value
Next i
End Sub
|
|