|
▼yuhmo さん:
こんばんは。
>○フォーム上にリストボックスでsheet1分、sheet2分分けて表示させ、
>○それぞれ一つずつ名前を選択し、コマンドボタンで選んだものが
>入れ替わる、というものにしたかったのです。
では、
>それぞれのシートに一行目は項目名(見出し)とします。
>よって、実データは2行目から入力されているとします。
これは、前回と同じです。
ユーザーフォーム(Userform1)には、
リストボックス1---Listbox1-----Sheet1のA列を表示
リストボックス2---Listbox2-----Sheet2のA列を表示
コマンドボタン---Commandbutton1
を配置します。
仕様は、
Userform1のリストボックス1とリストボックス2から名前を選択し、
コマンドボタンをクリックすると
選択した名前のSheet1とSheet2のデータが交換される
というものです。
コードの変更は、
変更したuserform1のモジュールです。
'=============================================================
Private Sub CommandButton1_Click()
Dim r1row As Long
Dim s1wk As Variant
Dim s1csl As Long
Dim r2row As Long
Dim s2wk As Variant
Dim s2scl As Long
r1row = ListBox1.ListIndex + 2
r2row = ListBox2.ListIndex + 2
If r1row < 2 Or r2row < 2 Then Exit Sub
With Worksheets("sheet1")
s1wk = Application.Transpose(Application.Transpose(.Range(.Cells(r1row, 1), .Cells(r1row, .Columns.Count).End(xlToLeft))))
If TypeName(s1wk) <> "Variant()" Then
s1wk = Array(s1wk)
End If
s1scl = UBound(s1wk) - LBound(s1wk) + 1
End With
With Worksheets("sheet2")
s2wk = Application.Transpose(Application.Transpose(.Range(.Cells(r2row, 1), .Cells(r2row, .Columns.Count).End(xlToLeft))))
If TypeName(s2wk) <> "Variant()" Then
s2wk = Array(s2wk)
End If
s2scl = UBound(s2wk) - LBound(s2wk) + 1
End With
With Worksheets("sheet1")
.Range(.Cells(r1row, 1), .Cells(r1row, .Columns.Count).End(xlToLeft)).Value = ""
.Range(.Cells(r1row, 1), .Cells(r1row, s2scl)).Value = s2wk
End With
With Worksheets("sheet2")
.Range(.Cells(r2row, 1), .Cells(r2row, .Columns.Count).End(xlToLeft)).Value = ""
.Range(.Cells(r2row, 1), .Cells(r2row, s1scl)).Value = s1wk
End With
Call set_listbox_proc
ListBox1.ListIndex = r1row - 2
ListBox2.ListIndex = r2row - 2
End Sub
'====================================================================
Private Sub UserForm_Initialize()
Call set_listbox_proc
End Sub
'====================================================================
Sub set_listbox_proc()
Dim myarray As Variant
With Worksheets("sheet1")
If .Cells(.Rows.Count, 1).End(xlUp).Row > 1 Then
myarray = .Range("a2", .Cells(.Rows.Count, 1).End(xlUp)).Value
With ListBox1
.Clear
.List = myarray
End With
End If
End With
With Worksheets("sheet2")
If .Cells(.Rows.Count, 1).End(xlUp).Row > 1 Then
myarray = .Range("a2", .Cells(.Rows.Count, 1).End(xlUp)).Value
With ListBox2
.Clear
.List = myarray
End With
End If
End With
End Sub
考え方は、最初の投稿と大きくは変わっていません。
確認してください
|
|