ここから本文です

エクセルのVBAについて質問させてください。 初心者です。 特定のセル範囲をクリ...

koh********さん

2019/12/108:33:36

エクセルのVBAについて質問させてください。
初心者です。
特定のセル範囲をクリックするとuser form1に紐づくように、下のVBAを入力しています。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'DI列を選択したとき、リストボックスを表示する。

Dim Sht As Worksheet
Dim Dat1 As String, Dat2 As String
Dim i As Long, j As Long, k As Long
Dim Rng As Range

Set Sht = Worksheets("Sheet2")

If Target.Column = 114 And Target.Row > 1 Then
Dat1 = Selection.Value
i = 0
j = 0
Do
i = InStr(i + 1, Dat1, ",")
If i = 0 Then
Exit Do
Else
Dat2 = Mid(Dat1, j + 1, i - j - 1)
Set Rng = Sht.Range("A:A").Find(Dat2)
If Not Rng Is Nothing Then k = Sht.Range("A:A").Find(Dat2).Row
UserForm1.ListBox1.Selected(k - 2) = True
j = i
End If
Loop

UserForm1.Show

End If

End Sub

追加で、別のセル範囲をクリックするとuser form2に紐づくように、マクロを追加したいと思っています。
なにぶん、初心者であり、別のマクロをつなげる方法がわかりません。

上のマクロの下に、下のマクロをそのままつなげてもうまくいきません。
やり方を教えていただけますでしょうか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'DJ列を選択したとき、リストボックスを表示する。

Dim Sht As Worksheet
Dim Dat1 As String, Dat2 As String
Dim i As Long, j As Long, k As Long
Dim Rng As Range

Set Sht = Worksheets("Sheet3")

If Target.Column = 115 And Target.Row > 1 Then
Dat1 = Selection.Value
i = 0
j = 0
Do
i = InStr(i + 1, Dat1, ",")
If i = 0 Then
Exit Do
Else
Dat2 = Mid(Dat1, j + 1, i - j - 1)
Set Rng = Sht.Range("A:A").Find(Dat2)
If Not Rng Is Nothing Then k = Sht.Range("A:A").Find(Dat2).Row
UserForm2.ListBox1.Selected(k - 2) = True
j = i
End If
Loop

UserForm2.Show

End If

End Sub

閲覧数:
46
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

taihenda****さん

2019/12/110:05:06

Column = 114でDJ列
Column = 115でDK列
ですから一つずつずれています。

Dim Dat1 As String
と配列でない変数にDat1 = Selection.Valueとすると例えばDJ1:DJ2を選択しただけでエラーになってしまいます。DJ1:DK1を選択してもエラーになります。
ここを何とかしないと・・・・

リストボックスのリストを選択するところの内容が不明ですが、

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Sht As Worksheet
Dim Dat1 As String, Dat2 As String
Dim i As Long, j As Long, k As Long
Dim Rng As Range
If Target.CountLarge > 1 Then Exit Sub
If Intersect(Rows("2:" & Rows.Count), Columns("DJ:DK"), Target) Is Nothing Then Exit Sub
Set Sht = Worksheets("Sheet2")
Dat1 = Selection.Value
i = 0
j = 0
Do
i = InStr(i + 1, Dat1, ",")
If i = 0 Then
Exit Do
Else
Dat2 = Mid(Dat1, j + 1, i - j - 1)
Set Rng = Sht.Range("A:A").Find(Dat2)
If Not Rng Is Nothing Then k = Sht.Range("A:A").Find(Dat2).Row
UserForm1.ListBox1.Selected(k - 2) = True
j = i
End If
Loop
UserForm1.Show
End Sub


とすればDJ2から下、またはDK2から下のセルをクリックしたときユーザーフォームが表示され、変数Dat1に選択したセルの値が入ります。

Dat1 = Selection.Value
i = 0
j = 0

のところの
i = 0
j = 0
はiもjも0なのは決まっているので不要だと思いますが、

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

だるまさん

2019/12/109:41:28

一つのイベントプロシージャの中で2つ以上の
種類の動作をさせたい、動作や機能を追加
したいという今回のような要望は結構あります。

こういう場合は、各機能・動作毎に別プロシージャ
にすることを、強くお勧めします。

一つのイベントプロシージャの中にどんどんと
プログラムを詰め込んでゆくと、加速度的に
複雑になり訳が分からなくなって、保守が
困難になって行きます。

(これは何もイベントプロシージャに限った話
ではありませんが。)

で、別プロシージャに分けるのは別に大変な
事ではありません。

各機能・動作毎の別プロシージャは分かり易い
名前を付けて(下記ではSubA, SubB)、()内
の引数は、イベントプロシージャの引数を
そのままコピペします。

それぞれの中身のコードは、イベントプロシージャ
の中にあったコードそのままです。

そして、メインとなるイベントプロシージャでは
その引数(Target, Cancelなど)を
各プロシージャへそのまま引数として渡します。

こうすることで、全体に読みやすく保守しやすい
プログラムになります。

次にまた別の機能・動作(文字の切り替えばかり
とは限りません)の追加が必要になったら、今度
はその機能・動作に関する別プロシージャだけに
集中して同じように追加して、メインのイベント
プロシージャには一行追加するだけです。

元からあった別プロシージャなどへの影響は
ほとんど考えなくて済みます。


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    SubA Target
    SubB Target
End Sub

Private Sub SubA(ByVal Target As Range)
    元のイベントプロシージャのコード1
End Sub

Private Sub SubB(ByVal Target As Range)
    元のイベントプロシージャのコード2
End Sub

hmm********さん

2019/12/109:34:15

>別のマクロをつなげる方法がわかりません。
イベントマクロ(Worksheet_SelectionChange)は
同一モジュールに複数作成出来ません

Application.IntersectメソッドでTargetが
範囲内に有るかを判定するとよいのでは?

またWorksheet_SelectionChangeは複数セル選択した場合に
Dat1 = Selection.Value
が起因するエラーとなる可能性が有ります

ダブルクリックで発生するイベント
Worksheet_BeforeDoubleClick
の方がよいど思うが?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる