Excel VBA質問箱 IV

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

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


5838 / 13646 ツリー ←次へ | 前へ→

【48624】リストボックスから選択、他セルへ転記 武蔵 07/4/26(木) 2:17 質問[未読]
【48625】Re:リストボックスから選択、他セルへ転記 武蔵 07/4/26(木) 2:25 発言[未読]
【48626】Re:リストボックスから選択、他セルへ転記 ウッシ 07/4/26(木) 9:20 発言[未読]
【48628】Re:リストボックスから選択、他セルへ転記 武蔵 07/4/26(木) 10:55 質問[未読]
【48629】Re:リストボックスから選択、他セルへ転記 ウッシ 07/4/26(木) 11:20 発言[未読]
【48630】Re:リストボックスから選択、他セルへ転記 武蔵 07/4/26(木) 14:54 質問[未読]
【48631】Re:リストボックスから選択、他セルへ転記 ウッシ 07/4/26(木) 17:20 発言[未読]
【48632】Re:リストボックスから選択、他セルへ転記 武蔵 07/4/26(木) 18:25 お礼[未読]

【48624】リストボックスから選択、他セルへ転記
質問  武蔵  - 07/4/26(木) 2:17 -

引用なし
パスワード
   下記のようなコードでD4セルにリストボックスから
データを入力しているのですが同時にE6・E7・E8・G6・G7・G8に
データを転記したいのですがコードの修正方法がわかりません。
よろしくお願いします。
データ範囲はAG列からAN列に記入済み
リストボックスからD4選択と同時に
E6に2番目のデータ[AH列]
E7に3番目のデータ[AI列]
E8に4番目のデータ[AJ列]
G6に5番目のデータ[AK列]
G7に6番目のデータ[AL列]
G8に7番目のデータ[AM列]
のデータをそれぞれ転記したいと考えています。

Option Explicit

Private Sub UserForm_Initialize()
  ListBox1.RowSource = Sheets("sheet1"). _
  Range(Range("AG2"), Range("AG2").End(xlDown)).Address
End Sub

Private Sub CommandButton2_Click()
 Unload Me
End Sub

Private Sub CommandButton1_Click()
  ActiveCell.Value = ListBox1.Value
 Unload Me
End Sub

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyReturn Then
    ListBox1.Enabled = False
    ListBox1.Enabled = True
    KeyCode = 0
  End If
End Sub

【48625】Re:リストボックスから選択、他セルへ転記
発言  武蔵  - 07/4/26(木) 2:25 -

引用なし
パスワード
   追加説明下記にてユーザーフォームを起動させています
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Cells.Count > 1 Then
 On Error Resume Next
 If Not Intersect(Target, Range("D4:F4")) Is Nothing Then
  UserForm1.Show vbModeless
 Else
  UserForm1.Hide
 End If
 End If
End Sub

【48626】Re:リストボックスから選択、他セルへ転記
発言  ウッシ  - 07/4/26(木) 9:20 -

引用なし
パスワード
   こんにちは

> If Target.Cells.Count > 1 Then
複数セル選択時ですか?

こういう事でしょうか?

Private Sub CommandButton1_Click()
  Dim r As Range
  Dim i As Long
  Dim s As Worksheet
  With ActiveCell
    Set s = .Parent
    Set r = s.Range(s.Range("AG2"), s.Range("AG2").End(xlDown))
    i = ListBox1.ListIndex + 1
    .Value = ListBox1.Value
    s.Range("E6").Value = r(i, 2)
    s.Range("E7").Value = r(i, 3)
    s.Range("E8").Value = r(i, 4)
    s.Range("G6").Value = r(i, 5)
    s.Range("G7").Value = r(i, 6)
    s.Range("G8").Value = r(i, 7)
  End With
  Set r = Nothing
  Set s = Nothing
  Unload Me
End Sub

【48628】Re:リストボックスから選択、他セルへ転記
質問  武蔵  - 07/4/26(木) 10:55 -

引用なし
パスワード
   ▼ウッシ さん:
バッチリ思い通りです
ありがとうございました。
ウッシさん少し解説いただけませんか
>
>> If Target.Cells.Count > 1 Then
>複数セル選択時ですか?
★複数セルと単独セル下記コードに変更が
必要ですか?
>
>こういう事でしょうか?
>
>Private Sub CommandButton1_Click()
>  Dim r As Range
>  Dim i As Long
>  Dim s As Worksheet
>  With ActiveCell
>    Set s = .Parent
★.Parentとはヘルプ見ましたがよくわかりません
>    Set r = s.Range(s.Range("AG2"), s.Range("AG2").End(xlDown))
                     ↑AM最終列でなくていいのですか
>    i = ListBox1.ListIndex + 1
>    .Value = ListBox1.Value
>    s.Range("E6").Value = r(i, 2)
>    s.Range("E7").Value = r(i, 3)
>    s.Range("E8").Value = r(i, 4)
>    s.Range("G6").Value = r(i, 5)
>    s.Range("G7").Value = r(i, 6)
>    s.Range("G8").Value = r(i, 7)
      ↑★この意味は
>  End With
>  Set r = Nothing
>  Set s = Nothing
>  Unload Me
>End Sub
よろしくお願いします。

【48629】Re:リストボックスから選択、他セルへ転記
発言  ウッシ  - 07/4/26(木) 11:20 -

引用なし
パスワード
   こんにちは

>>> If Target.Cells.Count > 1 Then
>>複数セル選択時ですか?
こちらが聞いてるのですが?
なぜ、複数セルにしてるのでしょうか?

複数セル「A1:D4」を選択すると処理が続行されて、
>Intersect(Target, Range("D4:F4"))
を通過して、「ActiveCell」=「A1」に「ListBox1.Value」がセットされちゃいます。
それでいいのでしょうか?

選択した複数セルそれぞれに別処理するなら勿論コード変更は必要ですし、
>Intersect(Target, Range("D4:F4"))
で取得出来る、「D4:F4」に属するセルだけを処理対象にするコードも必要です。

>★.Parentとはヘルプ見ましたがよくわかりません
親オブジェクトで、「ActiveCell」のあるシートの事です。
もし、別シートのセルに値をセットするなら、

>Set s = .Parent

>Set s = WorkSheets("Sheet1")
のようにします。

>>    Set r = s.Range(s.Range("AG2"), s.Range("AG2").End(xlDown))
>                     ↑AM最終列でなくていいのですか
リストにセットしたデータで行位置を取得するだけです。

>>    i = ListBox1.ListIndex + 1
リストの一番目が選択されてると「ListIndex」は「0」なのでプラス1します。

>>    s.Range("E6").Value = r(i, 2)
>>    s.Range("E7").Value = r(i, 3)
>>    s.Range("E8").Value = r(i, 4)
>>    s.Range("G6").Value = r(i, 5)
>>    s.Range("G7").Value = r(i, 6)
>>    s.Range("G8").Value = r(i, 7)
>      ↑★この意味は
rはリストにセットしたデータなので、それの「i」番目(行目)で、横に「2〜7」列目
のデータっていう意味です。

【48630】Re:リストボックスから選択、他セルへ転記
質問  武蔵  - 07/4/26(木) 14:54 -

引用なし
パスワード
   ▼ウッシ さん:
返事ありがとうございます。
もう少しお付き合いお願いします。
>>>> If Target.Cells.Count > 1 Then
     ↑これがまずいですか
>>>複数セル選択時ですか?
はい複数セルの選択で"D4:F4"です。

>なぜ、複数セルにしてるのでしょうか?
セル幅の関係からなのですが
>
>複数セル「A1:D4」を選択すると処理が続行されて、
      ↑"A1:D4"ではなく→"D4:F4"です
      この意味がよくわからないのですが
      "A1:D4"の結合セルだと問題があるということでしょうか?
>>Intersect(Target, Range("D4:F4"))
>を通過して、「ActiveCell」=「A1」に「ListBox1.Value」がセットされちゃいます。下記コードで良くないですか。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Cells.Count > 1 Then
 On Error Resume Next
 If Not Intersect(Target, Range("D4:F4")) Is Nothing Then
  UserForm1.Show vbModeless
 Else
  UserForm1.Hide
 End If
 End If
End Sub
理解してないようですみません
>それでいいのでしょうか?
>
>選択した複数セルそれぞれに別処理するなら勿論コード変更は必要ですし、
>>Intersect(Target, Range("D4:F4"))
>で取得出来る、「D4:F4」に属するセルだけを処理対象にするコードも必要です。
>
>>★.Parentとはヘルプ見ましたがよくわかりません
>親オブジェクトで、「ActiveCell」のあるシートの事です。
>もし、別シートのセルに値をセットするなら、
>
>>Set s = .Parent
>を
>>Set s = WorkSheets("Sheet1")
>のようにします。
↑これはよく解りましたありがとうございました。
>
>>>    Set r = s.Range(s.Range("AG2"), s.Range("AG2").End(xlDown))
>>                     ↑AM最終列でなくていいのですか
>リストにセットしたデータで行位置を取得するだけです。
>
>>>    i = ListBox1.ListIndex + 1
>リストの一番目が選択されてると「ListIndex」は「0」なのでプラス1します。
>
>>>    s.Range("E6").Value = r(i, 2)
>>>    s.Range("E7").Value = r(i, 3)
>>>    s.Range("E8").Value = r(i, 4)
>>>    s.Range("G6").Value = r(i, 5)
>>>    s.Range("G7").Value = r(i, 6)
>>>    s.Range("G8").Value = r(i, 7)
>>      ↑★この意味は
>rはリストにセットしたデータなので、それの「i」番目(行目)で、横に「2〜7」列目
>のデータっていう意味です。
↑ココもわかりました。

【48631】Re:リストボックスから選択、他セルへ転記
発言  ウッシ  - 07/4/26(木) 17:20 -

引用なし
パスワード
   こんにちは

"D4:F4"が結合セルという事ですね。
結合セルはVBAと相性が悪いので、重要な情報です。

>>>Intersect(Target, Range("D4:F4"))
>>を通過して、「ActiveCell」=「A1」に「ListBox1.Value」がセットされちゃいます。

今のコードのまま、セルA1からF4までをドラッグして選択してみて下さい。
意味が分かるはずです。

もし、"D4:F4"が結合セルならば、

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'  If Target.Count > 1 Then
  If Target.MergeCells = True Then
    On Error Resume Next
    If Not Intersect(Target, Range("D4:F4")) Is Nothing Then
      UserForm1.Show vbModeless
    Else
      UserForm1.Hide
    End If
  End If
End Sub

に変更して下さい。

【48632】Re:リストボックスから選択、他セルへ転記
お礼  武蔵  - 07/4/26(木) 18:25 -

引用なし
パスワード
   ▼ウッシ さん:
ありがとうございました。
確かに「ActiveCell」=「A1」に「ListBox1.Value」
"A1"にセットされました。知りませんでした?

>
>"D4:F4"が結合セルという事ですね。
>結合セルはVBAと相性が悪いので、重要な情報です。
  ↑結合は避けた方がよいということですね
   今後に生かしたいと思います。
詳しい説明本当にありがとうございました。
また解らないときはよろしくお願いします。

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