- ベストアンサー
ExcelVBAで二つのセルに入力された時の判定
- ExcelVBAを使用して、セルA1とA2の両方に値が入力された場合に、セルA3に文字を入力するマクロを作成したいです。
- 現在のプログラムでは、最初のIF文で常にTrueになってしまいます。この条件を満たすマクロの作り方を教えてください。
- リリースするマクロのために、ExcelVBAを使ってセルA1とA2が入力された場合にセルA3に文字を入力する方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
このようなセルへの入力を制御するロジックは結構作りました。 質問に関して、必要なことを考えてみました。(不必要かも) (1)A1、A2セルの2つとも何らかの入力があれば、 A3に「入力済み」と表示(質問の主旨) (2)ユーザー(Excel操作者)がA3セルを操作できない。(私の考える追加機能) (3)A1、A2セルの2つともに何らかの入力をしA3に「入力済み」と表示 された後、A1またはA2セルを消去したら、A3セルの「入力済み」を クリアする。(私の考える追加機能) ※昔、検証者がこのようなことを指摘してくれました。善意の検証と悪意の検証ですね。悪意の方が何倍も助かりました。対象シートは「Sheet1」としています。 (2)への対応 対象シートのセルを全て選択し、 ・右クリック>セルの書式設定>保護タブ>ロックのチェックを外します。 ・A3セルを選択し、右クリック>セルの書式設定>保護タブ>ロックを チェックします。 ・校閲タブ>シートの保護を実行します。 これで、対象シートは、A3セルにユーザーからは入力できなくなります。 (1)への対応 「(2)への対応」を行ったので、質問にある 「Range("A3").Value = "入力済み"」ができなくなります。当然ですね。 これを回避するために、ProtectメソッドのUserinterfaceOnlyオプションを 使います。保護をユーザの手動シート操作に対してのみ有効にし、マクロ からは無効にしてくれます。マクロからは変更できるわけです。 ThisWorkbookのコードペインに次を貼り付けます。 Book起動時に有効になります。 Private Sub Workbook_Open() With Worksheets("Sheet1") .Unprotect '// シート保護を解除 .Protect UserInterfaceOnly:=True '// シート保護を設定(UIのみ) End With End Sub (3)への対応 質問のコードは、動いたとしても、「入力済み」と表示された後、A1、A2セルに変更(クリア)がある場合、何もしません。2セルともに入力されていない場合の処理を書くべきでしょう。 Private Sub Worksheet_Change(ByVal Target As Range) If Not (Intersect(Target, Range("A1,A2")) Is Nothing) Then If Range("A1").Value <> "" And Range("A2").Value <> "" Then Range("A3").Value = "入力済み" Else Range("A3").Value = "" End If End If End Sub
その他の回答 (3)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1 の追加です。 もし、セルが離れていた場合や沢山ある場合にはAndで繋ぐより If Intersect(Target, Range("A1,A2")) Is Nothing Then みたいにした方が見やすいですね。
お礼
そんな簡単なことで良かったのですね...。Intersectメソッドについてまだまだ勉強不足でした。 ご回答頂きありがとうございます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1の他に、連続している場合は If Intersect(Target, Range("A1:A2")) Is Nothing Then なども使えます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
If Intersect(Target, Range("A1")) Is Nothing And Intersect(Target, Range("A2")) Is Nothing Then にしてください。A1でもA2でもない場合。
お礼
ご丁寧にご解説して頂きありがとうございます。 とても参考になりました、記述して頂いたコードを使用させて頂きます。