• 締切済み

【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文のところで一度止まってしまうのかわかりません。

みんなの回答

  • SePapa
  • ベストアンサー率50% (47/94)
回答No.3

こんにちは。 失礼かもしれませんが、一応確認します。 該当のステップでブレークポイントを 設定しているということはないでしょうか。 実行してない状態でマクロのソース見て頂いて、 もし該当行の右端に茶色の●印がついて行全体が茶色で 反転表示されてるのであればブレークポイントとなってますので 実行すると必ずそのステップで実行停止します。 もしそうだったのであれば●印をクリックして 表示を消して保存すればブレークポイントは はずれます。 よろしくお願いします。

emson100
質問者

お礼

ブレークポイントは設定してません。 ご指摘いただいたとおり、 コード上は問題が無いようですね。 コードに間違いが無いということがわかったので助かりました。 誠にありがとうございました。 試行錯誤して、原因を見つけてみます。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

撒く路上にはへんなところが無いので、エラーになっていないのであれば、その部分にストップポイントを設定しているのでは?

emson100
質問者

お礼

コードに間違いは無いことが確認できました。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>変数1はRange("C1")がエラー表示なので「True」 そのような決まりはありません。 エラー値はエラーとして取得するので、書かれたような真偽の判定はできません。 ISERROR関数等を使ってエラーを検出する事になります。 http://excel.onushi.com/function/iserror.htm

emson100
質問者

補足

ご返答誠にありがとうございます。 申し訳ございません。 『変数1はRange("C1")がエラー表示なので「True」』のところですが、 誤記でした。 Range("C1")が空白だった場合、Trueです。 セルが空白かどうかを判断するため、IsEmpty(Range("C1"))を使用しました。

関連するQ&A

  • ExcelVBA 二つのセルに入力された時の判定

    セルA1とA2両方に値が入力された時、セルA3に文字を入力するマクロを作りたいです。 下記プログラムで試しているのですが、ステップインで見ると最初のIFでTrue判定されてしまいます。 どうすればこの条件を満たすマクロになるのか、教えて頂けないでしょうか。 以上、宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Or Intersect(Target, Range("A2")) Is Nothing Then Exit Sub Else If Range("A1").Value <> "" And Range("A2").Value <> "" Then Range("A3").Value = "入力済み" End If End If End Sub

  • IF文の作り方

    エクセル VBA 超入門のものなんですけど、質問させてください。 A1のセルに 1を入力したら、セルD1に正解を表示させ、 それ以外なら不正解を表示させたいのですが、  以下の文でつくると 実行した最初しか起動してないような気がするのですが、教えてください。どうすればセルA1を入力するたびに、 正解、不正解をD1に表示させれるでしょうか? Sub テスト() If Range("A1") = "1" Then Range("D1").Value = "正解" Else Range("D1").Value = "不正解" End If End Sub

  • ExcelVBAの変数を使うコツ

    matyuといいます。よろしくお願い致します。 基本的な部分の質問です。 VBAでプログラムを考える際に変数を使うタイミングは非常に多いと思いますが、 どういうタイミングでどういう部分を変数として扱えばいいか分からなくて困っています。 添付したファイルのような問題があったとします。 この問題では、日給の部分を"kyuyo"として宣言していますが、 私が考えると曜日も平日と休日で変化するし、時給も1000円と1200円、勤務時間も何が入るか分からないな・・・となってしまい、いくつもいくつも変数にしようとして結果答えと違ってしまいます。 どこに着目して必要最小限の変数宣言ですっきりしたプロシージャーを書くようにしたらよいのでしょうか? 私が考えるに、最終的に導きだされなくてはならないのは"日給(kyuyo)"だからという考え方でいいのでしょうか 【問題】 セル【C16】に曜日として「平日」「休日」を、【D16】に勤務時間を入力してプロシージャを実行すると、日給をセル【E16】に表示する「練習1」プロシージャを作成しましょう。 また、勤務時間が空欄の場合はセル【E16】に「休み」と表示されるようにします。 【この問題の回答】 Sub 練習1() Dim kyuyo As Currency If Range("D16").Value = "" Then Range("E16").Value = "休み" Else If Range("C16").Value = "平日" Then kyuyo = 1000 * Range("D16").Value Range("E16").Value = kyuyo ElseIf Range("C16").Value = "休日" Then kyuyo = 1200 * Range("D16").Value Range("E16").Value = kyuyo End If End If End Sub

  • エクセルVBAでセル範囲の表記方法

    このサイトで、セル範囲を表記するのに [B10:C11] のような書き方をはじめて見ました。 以下のように試してみました。 Sub test01() Range("B10:C11").Select End Sub Sub test02() [B10:C11].Select End Sub まったく同じように働きます。 これは、Range("B10:C11") と、[B10:C11] は同じ意味だということでしょうか? 同じなら、この方が文字数も少なく書きやすいと思うのですが、あまり見かけないのはなぜでしょうか? また、変数を使おうと Sub test03() X = 11 Range("B10:C" & X).Select End Sub を次のように書き換えましたところ、「オブジェクトが必要です」という実行時エラーになってしまいました。 Sub test04() X = 11 [B10:C & x].Select End Sub この書き方は変数は組み合わせられないのでしょうか?

  • 手動計算時の条件付書式判定

    excel2010 条件付き書式の判定に制約あるのでしょうか? A1,B1,C1セルに数値を設定し、 C2セルに=SUM(A1:C1)と設定します。 C2セルの条件付書式は、セルの値 次の値より大きい =500 上記条件で文字色を赤 としています。 計算方法の設定は手動。 また、マクロで下記を設定しています Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Row = 1) And (Target.Column >= 1 And _ Target.Column <= 3) Then 'セルの値に変更があったときに実行したい処理を記述 Calculate End If End Sub C2セルが500より大きくなったら、数値が赤になるはずですが、変わりません。 計算は実施しているのになぜ赤色にならないのでしょう? 下記の様にマクロを変更し、計算方法の設定を自動にすると正しく判定されます。 Private Sub Worksheet_Change(ByVal Target As Range) Application.Calculation = xlCalculationAutomatic '自動 xlCalculationManual If (Target.Row = 1) And (Target.Column >= 1 And _ Target.Column <= 3) Then 'セルの値に変更があったときに実行したい処理を記述 Calculate End If Application.Calculation = xlCalculationManual End Sub 上記で、とりあえずいけたのですが、計算はしているのに条件判定されないのが??? です。

  • 【VBA】改行されたセルの条件

    VBAにてA1のセルが画像のように改行されたセルであっても条件式で処理を行うようにしたいのですがうまくできません。 ↓式のように作成はしてみました どうしたら改行されたセルでも処理が行えるのでしょうか? Sub test() If Range("A1") = (行1行2の場合) Then 処理 End If End Sub

  • [ExcelVBA] Module1で定義した変数の(代入した)値を、Module2でも使う方法

    基本中の基本のことで誠に申し訳ございません。 ある標準Moduleで宣言した変数に値を代入します。 その後、別のModuleでその変数を使用しますが、 その変数の中の値が消えてしまいます。 たとえば下記のように、プログラムを書きます。 test1を実行すると、続いてtest2も実行されます。 この場合、変数の値が0になってしまいます。 このような場合どうやったらいいのでしょうか? Hensuu1の値をセルに一度出力させて、 別のModuleで、セルの値をもう一度変数に代入させて使用する という方法で何とかしていたのですが、大変で困っています。 Module1に記載------------ dim Hensuu1 as integer sub test1() Hensuu1 = 100 test2 end sub ------------------------- Module2に記載------------- sub test2 range("A1") = Hensuu1 end sub --------------------------

  • 【VBA】if文中のinstrの条件2つ

     質問させていただきます。どうぞよろしくお願いいたします。 環境:Excel2010でございます。  If InStr(.Cells(line, 10), "test1") > 0 And InStr(.Cells(line, 10), "test2") > 0 Then'(1) だとIf文の中に入ってきてくれる状況でございます。  If InStr(.Cells(line, 10), "test1") Then'(2)  If InStr(.Cells(line, 10), "test2") Then'(3) の場合は両者ともIf文の中に入ってくるのに、何故  If InStr(.Cells(line, 10), "test1") And InStr(.Cells(line, 10), "test2") Then'(4) だとIf文の中に入ってきてくれないのでしょうか? 自分の考えでは、おそらく(2)も(3)もTrueを返してくれているので (4)の場合は True and Trueで条件に合致するのでは、と思うのでございますが 条件を複数にすると(1)のように数字の比較にしてやらねばいけなくなるのかがよく分かっておりません。 (時々これに気づかずに(4)のようにコーディングしてしまってデバッグしなければいけなくなり手間がかかりますので、できれば理解しておきたい次第でございます。)  もしお詳しい方がいらっしゃいましたら、どうぞよろしくお願いいたします。

  • エクセルのマクロ 複数条件について質問です

    Findで複数条件の検索をする時について質問です。 現在下記のようなマクロがあります。 C3セルに検索したい文字などを入力した時 C11からC1000までのセルに当てはまるものがあればそのセルを 赤で塗りつぶします。 今回行いたいのは、これに追加してD3セルに入力された内容を D11からD1000の中で検索、また E3セルに入力された内容を E11からE1000の中で検索し C3、D3、E3に入力されている文字と同じであれば C3と照らし合わせているC11からC1000の当てはまったセルを赤く塗りつぶしたいです。 C3セルだけや、D3とE3を合ってるけどC3が当てはまっていない場合など どこかひとつでも当てはまっていなければ塗りつぶしはいりません。 また現在のマクロだとC3に文字が入力された時にマクロが実行されますが C3、D3、E3の3つ全てのセルに入力されたらマクロが実行されるようにしてもらいたいです。 D3とE3はデータ入力規則のリストでセルに入力を行います。 Private Sub SubProc1(ByVal Target As Range) Dim c As Range On Error Resume Next Set xCur = Selection If Application.Intersect(Target, Range("C3")) Is Nothing Then Exit Sub If Range("C3") = "" Then Range("C11:C1000").Interior.ColorIndex = 0: Exit Sub Application.ScreenUpdating = False '転記元のブックを開いて逆順で検索する Set c = Range("C11:C1000").Find(what:=Range("C3").Value, lookat:=xlPart, searchdirection:=xlPrevious, _ MatchCase:=True, MatchByte:=True, SearchFormat:=True) '見つけた(一番下の)セルを基準に転記する If Not c Is Nothing Then c.Interior.ColorIndex = 3 Application.Goto Reference:=c.Offset(0, -1), Scroll:=True End If End Sub

  • エクセルvba IFについて(複数条件)

    エクセルvbaでのifの構成について教えてください。 (1)*あいうえお   →あいうえお (2)あいうえお*   →あいうえお (3)*あいうえお*   →あいうえお     に変換させたいです。 以下のマクロを作りました。 Sub test() Dim c As Range For Each c In Selection.Cells If InStr(c, "*") = 1 Then c = Mid(c, InStr(c, "*") + 1) ElseIf InStrRev(c, "*") > 0 Then c = Left(c, InStrRev(c, "*") - 1) End If Next End Sub これだと(1)(2)はできるのですが、(3)は2回実行しないと全ての*が削除できないです。 1回の実行で「あいうえお」ができるようにするにはどうしたらよいのでしょうか。 本当は、 ****あいうえお**  →あいうえお のように、*(半角)や*(全角)が文字の前後についている場合、すべての*(半角)と*(全角)削除したいのですが(できれば1回の実行で)、そのようなことは可能なのでしょうか。 midやleftの作り方も間違っていれば、それもご教授ください。 よろしくお願いします。

専門家に質問してみよう