Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


52768 / 76735 ←次へ | 前へ→

【28797】Re:ユーザーフォームでデータ交換
発言  ichinose  - 05/9/14(水) 22:04 -

引用なし
パスワード
   ▼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


考え方は、最初の投稿と大きくは変わっていません。
確認してください
0 hits

【28692】ユーザーフォームでデータ交換 yuhmo 05/9/13(火) 1:26 質問
【28697】Re:ユーザーフォームでデータ交換 ichinose 05/9/13(火) 7:34 発言
【28795】Re:ユーザーフォームでデータ交換 yuhmo 05/9/14(水) 21:20 質問
【28797】Re:ユーザーフォームでデータ交換 ichinose 05/9/14(水) 22:04 発言
【28804】Re:ユーザーフォームでデータ交換 yuhmo 05/9/15(木) 0:59 お礼

52768 / 76735 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free