• 締切済み

VBA ""が認識されないのはなぜですか?

VBAで、空白のセルがあり、ウォッチウインドウで見ても、""(string) になっているのですが、次のようなコードのとき、うまくいきません。 i=1 Do untilcells(i+1,1)<>"" (処理) i=i+1 loop 空白でないセルになっても、ループがとまってくれません。 どうしたらよいでしょうか? ご回答をお願いいたします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

訂正 ×採取は練習用コードです。 最初は練習用…… でした。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 全体が、そのような内容でしたか。前の質問コーナーでも、パターンを書きましたが、まず、マクロの組み立てから言わないといけないかもしれません。何かを作るときに、スモール・サンプルで、実験してから実際のコードに入れたほうがよいです。 >データを会社から持ち帰れないので、曖昧な記憶なのですが、 VBAもひとつの言語表現です。自分が何かしたいと思うことは、コンピュータに分かる言語に置き換えることです。未だ、表現が未熟な場合は、とてもコンピュータにも人にも通じません。表現が思ったように出来ない場合は、代わりに日本語で伝えないといけません。私は、本来は語学が専門です。一種の翻訳と同じことだと思います。 ・何が誤りなのか、意味が分かりません。 ・何をもって該当する種別がありません、とするか分かりません。 一般的には、このような方法では、Select Case の、セルのValue プロパティでは、取れません。理由はあるのですが、小さな積み重ねの経験で覚えるしかありません。 Select Case cells(i,2) Case "001" Do until cells(i+1,1) <> "" If cells(i,3) <> i then Msgbox "データが誤りです"          End If i=i+1 Loop もう少し基本的なVBAの表現を使いこなせたほうがよいのではないかと思います。ただ、会社でそういうコードを書くことが許されるなら、OJT をしていけばよいと思います。 練習マクロと実践マクロは、まったく違います。 まず、基本的な話からです。 >「次の行の項目番号が空白でなくなるまで」としようとしたのですが、実際実行してみたら、次の項目番号以降まで進んでしまいました。 採取は練習用コードです。 '------------------------- Sub renTest1() '練習用 Dim i As Long i = 1 Do While i <= 10   If Cells(i, 1).Value = "" Then     MsgBox Cells(i, 1).Address & "は空白です。", vbInformation   End If   i = i + 1 Loop End Sub '------------------------- '実践のコード(練習用とは、このように違います) Sub jituTest1()   Dim rng As Range   Dim c As Variant   Dim i As Long   With ActiveSheet.UsedRange.Columns(1)     .Value = .Value ' "" を削除     Set rng = .SpecialCells(xlCellTypeConstants, 23)   End With   'rng.Select ''セレクトされた内容を確認   For Each c In rng     If IsNumeric(c.Value) Then      'サブルーチンに飛ぶ     End If   Next c   Set rng = Nothing End Sub

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

VBEで、[F8]キーによるステップ実行で確認してみてはいかがでしょうか?

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

空白があったら終了、ということなら、     Do Until Cells(i, 1) = "" とか   Do While Cells(i, 1) <> "" ですね。  

gleam_07
質問者

補足

わかりづらくてすみません。 項目の始めだけ文字が入っていて、次の項目までは空白なんです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 ご質問は、こちらがいろいろ考えて回答していますが、それをそのままにしてはいけません。新たに質問するなら、前のものを処理して締めてからにしてください。 http://oshiete1.goo.ne.jp/qa5036148.html 情報が多ければ多いほど解答に近くなります。前回を含めて、もう少し、全体の構造が分かるように書いてほしいです。そうでなければ、ワークシートが壊れているという回答にしか結びつかなくなります。 質問の種類は、初歩の初歩です。それが上手く行かない場合は、手順に自体に問題あるわけですが、本来、その種の回答は、したくないものです。 今回は、おそらく、どうやら、モジュールの間違いだと思います。 ひとつをみる、ウォッチウィンドウではなく、ローカルウィンドウで全体をみてください。すぐに間違いに気が付きます。ウォッチウィンドウは、もう少しレベルを上げてからでもよいと思います。 コードが書かれている場所は、標準モジュールか確認してください。

gleam_07
質問者

補足

度々ご迷惑をおかけして、申し訳ありません。 もう1つの質問とは別のマクロなのですが、こちらはスペースや改行が原因ではないのかと思い、質問させていただきました。 もし、同じ原因でしたら、申し訳ありません。 データを会社から持ち帰れないので、曖昧な記憶なのですが、 やりたいこととしては、次のようになります。 ある列に項目番号があり、同じ項目が数行ある場合は、次の項目まで、項目番号は記入されていません。 同じ項目がどこまでかを判断させるのに、「次の行の項目番号が空白でなくなるまで」としようとしたのですが、実際実行してみたら、次の項目番号以降まで進んでしまいました。 項目番号   種別  1      001     1                   2                   3  2     005     5                  10  3      010     10              20 例えば、 Do until i<50(データ範囲) Select Case cells(i,2) Case "001" Do until cells(i+1,1) <> "" If cells(i,3) <> i then Msgbox "データが誤りです"          End If i=i+1 Loop Case "005" Do until cells(i+1,1) <> "" If cells(i,3) <> i*10 Msgbox "データが誤りです"          End If i=i+1 Loop Case "010" Do until cells(i+1,1) <> "" If cells(i,3) <> i*5 Msgbox "データが誤りです"          End If i=i+1 Loop    Case Else Msgbox "該当する種別がありません"      i=i+1 End Select Loop 実際のコードとは違いますが、こんな感じでダメだったのですが、これでわかりますでしょうか?

関連するQ&A