• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:IF = 0 Then 空欄と認識してくれない)

エクセルマクロの条件設定について

このQ&Aのポイント
  • エクセルのマクロ実行条件について質問があります。
  • 特定の範囲のセルが全て空欄の場合にマクロを実行しないようにしたいのですが、うまく設定できません。
  • 他の方法でマクロの実行有無を判断する方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>0 Thenが不適切なのでしょうか。 マクロ以前に、シートのどこかのセルに =COUNTA(B4:B28) と記入してみると、ゼロじゃなくてしっかり25と計算結果が出ます。COUNTA関数じゃ「””」を無視できない事が判りますね。 というワケで。 他に何を調べたら、マクロ1を「実行して良い」条件が成立したと判断できるか、アタマを柔らかくして考えてみます。 実際には、あなたのワークシートが実際にどーなってるのか次第ですけど。 >マクロを実行したい時は、$B4:$B28のセルの一部、または全てのセルに4桁の数字が表示された時だけ 「4ケタ」にどれだけのイミがあるのかイマイチ不明ですが、たとえば =COUNT(B4:B28) が1以上になっていれば、少なくとも一部または全部に「数値が存在している」ことが判ります。 例: if application.count(worksheets("一覧").range("B4:B28")) > 0 then マクロ1 end if 他にも例えばCOUNTBLANKとかも利用できます。

ricercar6
質問者

お礼

ありがとうございます! 多用するので簡略でとても助かりました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • classical
  • ベストアンサー率29% (14/47)
回答No.4

対象セルに関数が入っているということですので、 セル内の関数を扱うプロパティ(formula)を使用します。 If Application.WorksheetFunction. _ CountA(Sheets("一覧").Range("$B4:$B28").formula) = 0 Then

ricercar6
質問者

お礼

ありがとうございます! また違った方法も勉強になります!

全文を見る
すると、全ての回答が全文表示されます。
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

セル範囲$B4:$B28をセル単位に調べる必要があります。下は例です。 Sub マクロ0()   Dim rg As Range       'セル   Dim InputCheck As Boolean  'チェック結果      '一カ所でも入力があればTrue   For Each rg In Sheets("一覧").Range("$B4:$B28")     If rg.Value <> "" Then       InputCheck = True: Exit For     End If   Next      '終了   If InputCheck = False Then     MsgBox "終了wwwwwwwwwwwwwwwwwwww"     Exit Sub   End If   'マクロ実行   MsgBox "Macro実行" End Sub 質問を読むと、書いてあるマクロは、求める内容と少し違うのかもしれません。 条件:セル範囲$B4:$B28には最低一カ所4桁数値の入力がある。  チェックする内容は、   1.セル範囲$B4:$B28   2.最低一カ所の入力   3.入力値は数値   4.数値は4桁限定    下に書いてみました。 Sub マクロ1()   Dim rg As Range       'セル   Dim Check As Boolean    'チェック結果   Dim DataCount As Integer  '正当なデータ個数   Check = True   For Each rg In Sheets("一覧").Range("$B4:$B28")     If rg.Value <> "" Then       If IsNumeric(rg.Value) Then         '数字の入力の場合         If 1000 <= rg.Value And rg.Value <= 9999 Then           '4桁の場合は可           DataCount = DataCount + 1         Else           '4桁ではない場合は不可           Check = False: Exit For         End If       Else         '数字以外は不可         Check = False: Exit For       End If     End If   Next      '終了   If DataCount = 0 Or Check = False Then     MsgBox "終了wwwwwwwwwwwwwwwwwwww"     Exit Sub   End If   'マクロ実行   MsgBox "Macro実行" End Sub

ricercar6
質問者

お礼

ありがとうございます! また違った方法も勉強になります!

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

>セルの一部、または全てのセルに4桁の数字が表示された時だけです。 4桁以上の数値でいいなら If Application.WorksheetFunction.CountIf(Sheets("一覧").Range("$B4:$B28"), ">999") = 0 Then とすればいいのでは?

ricercar6
質問者

お礼

ありがとうございます! また違った方法も勉強になります!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルでセルに文字が入力されたらマクロを実行

    前回どなたかが質問されて回答を見せてもらったら私のやりたいことと同じだったので実行してみましたが出来なかったのでもう一度質問をさせてください。 1.実行したのですが、なにも実行されません。 2.実行したらメッセジBOXだけは実行するのですが、後のコマンドが実行されずにエラーになります。 もう一度詳しく教えてください。 マクロ初心者ですよろしくお願いします。 1.【シートモジュールで条件判定し、マクロを起動する】 通常はこちらの方法が使われます。 Private Sub Worksheet_Change(ByVal Target As Range)   '変化のあったセルがA1セルか?   If Target.Address = "$A$1" Then      '条件判定:A1セルの値は 1 か?     If Target.Value = 1 Then       MsgBox "A1セルは条件を満たしました"     End If   End If End Sub 2.【ワークシート上で条件判定し、マクロを起動する】 処理内容にもよっては不向きな場合もありますが、こんな方法も あります。 マクロを Sub ではなく、Function 、、つまり関数にしてしまいます。 Function TestMacro() '<-- Sub を Function に替える   MsgBox "A1セルは条件を満たしました"   TestMacro = "" '戻り値はなし End Function そして、ワークシートの B1 セルに次の式を入力します。()は必須 です。  =IF(A1=1,TestMacro(),"")

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • 【ExcelVBA】IF条件を満たしているのに、IF条件のところで止まってしまう

    Sub test1() 変数1 = IsEmpty(Range("C1")) If Range("A1") > 0 And Range("B1") = 0 And 変数1 = True Then   test2 End If End Sub 止まったときのデバッグでの表示は Range("A1")は「100」(セルの中身) Range("B1")は「0」(セルの中身) 変数1はRange("C1")がエラー表示なので「True」 すべての条件を満たしているのですが、 IF条件のところで止まってしまいます。 (IF条件のところの1行が黄色くハイライトになっている状態) 止まったデバッグの後に、F5を押して実行させると、 IF条件の続きから実行されて、test2が実行されて処理が終了します。 何で、IF文のところで一度止まってしまうのかわかりません。

  • エクセル・マクロでIf Thenの使い方

    このような質問は、ルール(エチケット、マナー)違反になるでしょうか? もしそうならお許し下さい。 名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。 Private Sub CommandButton1_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = False Next End Sub Private Sub CommandButton2_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = True Next End Sub これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。   If Names.Visible = False Then   If ThisWorkbook.Names.Visible = False Then If ThisWorkbook.tname.Visible = False Then Private Sub CommandButton3_Click() Dim tname As Name If Names.Visible = False Then 'これでは駄目 For Each tname In ThisWorkbook.Names tname.Visible = False Next Else For Each tname In ThisWorkbook.Names tname.Visible = True Next End If End Sub 苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。 Private Sub CommandButton3_Click() Dim tname As Name If Range("g1").Value = " " Then   For Each tname In ThisWorkbook.Names   tname.Visible = False   Next Range("g1").Value = "1" Else   For Each tname In ThisWorkbook.Names   tname.Visible = True   Next Range("g1").Value = " " End If End Sub ど素人ですがよろしくご教導ください。

  • EXCELでセルの値が変化したときだけにマクロ実行

    教えてください。 EXCELのA1セルの値が1→0に変化したときにMacro1を実行、0→1に変化したときにMacro2を実行したいと思い、以下のマクロを「シート名タブ右クリック」→「コードの表示」で開く画面に打ちました。 そうしたところキーボードからA1セルに1や0を打ち込むとMacro1・Macro2を実行するのですが。A1セルに関数式を入れ自動で1→0・0→1に変化してもMacro1・Macro2が実行されません。この場合どう修正すればMacroが実行されるようになりますか? ※ちなみにA1セルの関数式はある条件を満たしたら1、そうでない時0という式です。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Target.Value = 0 Then Macro1 End If If Target.Address = "$A$1" And Target.Value = 1 Then Macro2 End If End Sub

  • Excelのマクロで質問です

    セルに関数で文字が入った時にマクロを実行させる方法を教えて下さい。 今回行いたいのは、C9~C19セルにNGと表示された場合にメッセ―ジを表示したいです。 Private Sub Worksheet_Change(ByVal Target As Range) '変化のあったセルがA1セルか? If Intersect(Target, Range("C9:C19")) Is Nothing Then Exit Sub '条件判定:A1セルの値は 1 か? If Target.Value = "NG" Then MsgBox "NGです" End If End Sub このような場合C9~C19セルにNGと打ち込めばメッセ―ジが表示されるのですが あらかじめ、関数で =IF(M9="","",IF(Q9<M9,"OK","NG")) というような式がそれぞれのC9、C10、C11・・・・セルに入ってしまっています。 これだと、例えばC9セルにNGと表示されてもマクロは起動せず、メッセージが表示されません。 関数をマクロに盛り込むか、このままでもマクロが起動できるような書き方があるか 教えてください。 すみません。補足でQ9セルには =IF(I9="","",I9+"07:01")のような関数が 入力されています。

  • エクセルVBAのIf ~ Thenステートメントで

    予約フォームの作成に挑戦しています。 予約日が2022年8月1日の時のみ、シート4に結果を記入して行きたいのですが、 Private Sub CommandButton1_Click() If ListBox1.Text = "44774" Then Sheet4.Select Range("C2").End(xlDown).Offset(1, 0).Select ActiveCell.Value = Reservationform.ListBox2.Value ActiveCell.Offset(0, 1).Value = Reservationform.ListBox3.Value ActiveCell.Offset(0, 2).Value = Reservationform.ListBox4.Value ActiveCell.Offset(0, 2).NumberFormat = Range("C2").NumberFormat Exit Sub End If End Sub で、とりあえず成功しています。 "44774" の部分を、"Sheet6のA2"だった時のみ結果を記入するようにしたいです。 " "の中身をそのまま変えて、 If ListBox1.Text = "sheet6.Range("A2")" Then や If ListBox1.Text = "sheet6.Cells(2, 1).Value" Then に変えてみましたがうまく行きませんでした。 どのようにしたら良いでしょうか?

  • プロシージャが実行されたかの有無の判断

    Sub test() ・・・・・ IF ・・・・ then Call マクロ1 End If ・・・・・ ・・・・・ If testと言う名のプロシージャーの中でマクロ1と言うプロシージャーが実行されたなら Then MsgBox "マクロ1は実行されました" End If End Sub ということを実行したいのですがどうすればいいのでしょうか? マクロ1の実行条件自体が複雑でIf ~Thenの中に書ききれないので 実行の有無を値で返したりすることは不可能でしょうか? よろしくお願い致します。

  • IF VBA 1つの条件で複数の処理

    IF関数で、1つの条件(セルに特定の文字があったら) セルA1=B1+C1 セルB1=D1+E1 のように2つの処理を行ないたい場合、どんな構文を作成 したらいいでしょうか。 IF~Then ElseIf~Then End If というのが基本構文ですが、条件が複数あるのではなく 条件1つで処理は2つというのが分かりません。

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

専門家に質問してみよう