[[20220111165025]] 『2つのVBAを動かしたいとき』(SHIN) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『2つのVBAを動かしたいとき』(SHIN)

VBA初心者です。
EXCELで2つのVBAを何とか作成しましたが2つ同時に記載すると動きません。
1つづつのVBA単体ですとちゃんと動作するので内容は間違ってないと思うのですがどこがいけないのでしょうか

1.ファイルを閉じるとき必要な入力がされていない場合、アラートを
 だすVBA

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Dim cell1 As Range
 Dim msg As String
 Dim addStr As String
 msg = "未選択項目があります:"
 addStr = "を選択してください。"
 For Each cell1 In ActiveSheet.Range("必須項目")
 If cell1.Value = "選択してください" Then
 msg = msg & vbCrLf & cell1.Offset(, -1).MergeArea(1).Value & addStr
 End If
 Next
 If InStr(msg, addStr) Then
 MsgBox msg, vbInformation
 Cancel = True
 End If
 End Sub

2.特定のセルで入力を促すよう未入力の場合、文字が入力されているVBA

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Const myWd As String = "123"
 With Range("W51")
 If Not Intersect(Target, Range("W51")) Is Nothing Then
 If Target = myWd Then
 Target = ""
 .Font.ColorIndex = 0
 End If
 Else
 If .Value = "" Then
 .Value = myWd
 .Font.ColorIndex = 16
 End If
 End If
 End With
 End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


2つのVBA・・・?

(nn) 2022/01/11(火) 17:06


>2つ同時に記載すると動きません。

Workbook_BeforeClose はThisWorkbookに、
Worksheet_SelectionChange は該当のWorkSheetに
記載してあるで正しいですか?
(tkit) 2022/01/11(火) 17:07


多分プロシージャ名が適当、記載する箇所も適当なのでしょう?
Workbook_BeforeClose では、Select操作はしていないですし、
Worksheet_SelectionChange では、ブックを閉じることはしていない。
(tkit) 2022/01/11(火) 17:12

両方ともThisWorkbookに記載しております。
(SHIN) 2022/01/11(火) 17:13

Worksheet_SelectionChangeはThisWorkbookに書いても働きません。
(参考) 2022/01/11(火) 17:41

 >多分プロシージャ名が適当、記載する箇所も適当なのでしょう?
 その通りですね。
(・・・) 2022/01/11(火) 17:45

Worksheet_SelectionChangeのコードですが、
インデントをつけていれば避けられるであろう大きなミスがあるように見えます。
インデントの練習のつもりで確認してみてください。
(参考) 2022/01/11(火) 17:56

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Const myWd As String = "123"
  With Range("W51")

   If Not Intersect(Target, Range("W51")) Is Nothing Then

    If Target = myWd Then
     Target = ""
     .Font.ColorIndex = 0
    End If

   Else

    If .Value = "" Then
     .Value = myWd
     .Font.ColorIndex = 16
    End If

   End If

  End With
 End Sub

インデントの方法もわからないかもしれない、と思いこちらでつけました。
何か気づきませんか

(参考) 2022/01/11(火) 18:03


If Target = myWd Thenで型が違うと出てしまいます
(SHIN) 2022/01/12(水) 09:40

W51セルのみの処理ならTargetを.Valueに変えれば良いです。
少し下にあるコードもそうなっているでしょう。
(参考) 2022/01/12(水) 10:45

勉強足らずですみません。
複数セル(例えばA1、B1、W51)それぞれに適用する場合は
どのように記載すればよろしいのでしょうか
(SHIN) 2022/01/12(水) 12:01

複数セルへの適用の前に、まず1つのセルで必要十分な機能を満足させることが先です。
現状のコードではまだそれはできていないように思います。
(参考) 2022/01/12(水) 12:31

1つのセルの場合は、これでエラーなく動きました

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        Const myWd As String = "承認日"
        With Range("W51")
            If Not Intersect(Target, Range("W51")) Is Nothing Then
                If .Value = myWd Then
                    .Value = ""
                    .Font.ColorIndex = 0
                End If
            Else
                If .Value = "" Then
                    .Value = myWd
                    .Font.ColorIndex = 16
                End If
            End If
        End With
    End Sub
(SHIN) 2022/01/12(水) 14:49

>複数セル(例えばA1、B1、W51)それぞれに適用する場合は

単純に、3つ書けばよろしいかと思います。
(With ・・・ から End With までを3つ)

それでは芸が無いということであれば、
「Range("W51")」と指定してあるところを変数で指定するようにして、
変数を変更しながらループすればよろしいかと思います。
(わからん) 2022/01/12(水) 15:09


既に次の問題に向かったようですが、
以下は解決しましたか?

>2つ同時に記載すると動きません。
>1つづつのVBA単体ですとちゃんと動作する

一度状況を整理されてはどうでしょう?

(tkit) 2022/01/12(水) 15:33


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.