Excel VBA質問箱 IV

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

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


52866 / 76736 ←次へ | 前へ→

【28697】Re:ユーザーフォームでデータ交換
発言  ichinose  - 05/9/13(火) 7:34 -

引用なし
パスワード
   ▼yuhmo さん:
おはようございます。
>
>Sheet1の1列目に20人分の名前データ、2列目以降に個人データがあります。
>Sheet2の1列目に20人分の名前データ、2列目以降に個人データがあります。
>Sheet1 Sheet2のデータの並び方は同じです。

それぞれのシートに一行目は項目名(見出し)とします。
よって、実データは2行目から入力されているとします。


>ユーザーフォーム上にSheet1とSheet2の名前データ一覧を表示させて、それぞれ
>1つずつ名前を選択すると、選択したデータが入れ替わる(Sheet1の選択したデータがSheet2に、Sheet2のデータがSheet1に、互いのデータがあった位置に入る)ようにしたいのですが、どのようにしたらよいかお教えください。

ユーザーフォーム(Userfom1)には、

   コンボボックス---Combobox1
   コマンドボタン---Commandbutton1

を配置します。

仕様は、

Userform1のコンボボックスから名前を選択し、
コマンドボタンをクリックすると
選択した名前のSheet1とSheet2のデータが交換される
というものです。


標準モジュールに
'============================================
Sub test()
  UserForm1.Show vbModeless
End Sub


userform1のモジュールに
'=============================================================
Private Sub CommandButton1_Click()
  Dim rrow As Long
  Dim s1wk As Variant
  Dim s1csl As Long
  Dim s2wk As Variant
  Dim s2scl As Long
  rrow = ComboBox1.ListIndex + 2
  With Worksheets("sheet1")
    s1wk = Application.Transpose(Application.Transpose(.Range(.Cells(rrow, 1), .Cells(rrow, .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(rrow, 1), .Cells(rrow, .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(rrow, 1), .Cells(rrow, .Columns.Count).End(xlToLeft)).Value = ""
    .Range(.Cells(rrow, 1), .Cells(rrow, s2scl)).Value = s2wk
    End With
  With Worksheets("sheet2")
    .Range(.Cells(rrow, 1), .Cells(rrow, .Columns.Count).End(xlToLeft)).Value = ""
    .Range(.Cells(rrow, 1), .Cells(rrow, s1scl)).Value = s1wk
    End With
End Sub
'====================================================================
Private Sub UserForm_Initialize()
  Dim myarray As Variant
  With Worksheets(1)
    If .Cells(.Rows.Count, 1).End(xlUp).Row > 1 Then
     myarray = .Range("a2", .Cells(.Rows.Count, 1).End(xlUp)).Value
     With ComboBox1
      .Style = fmStyleDropDownList
      .List = myarray
      .ListIndex = 0
      End With
     End If
    End With
End Sub


以上です。testを実行してみて下さい。
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 お礼

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