プロが教える店舗&オフィスのセキュリティ対策術

VBAで、空白のセルがあり、ウォッチウインドウで見ても、""(string)
になっているのですが、次のようなコードのとき、うまくいきません。

i=1
Do untilcells(i+1,1)<>""
(処理)
i=i+1
loop

空白でないセルになっても、ループがとまってくれません。

どうしたらよいでしょうか?

ご回答をお願いいたします。

A 回答 (5件)

訂正


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

でした。
    • good
    • 0

こんばんは。



全体が、そのような内容でしたか。前の質問コーナーでも、パターンを書きましたが、まず、マクロの組み立てから言わないといけないかもしれません。何かを作るときに、スモール・サンプルで、実験してから実際のコードに入れたほうがよいです。

>データを会社から持ち帰れないので、曖昧な記憶なのですが、

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
    • good
    • 0

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

    • good
    • 0

空白があったら終了、ということなら、


 
  Do Until Cells(i, 1) = ""

とか

  Do While Cells(i, 1) <> ""

ですね。
 

この回答への補足

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

補足日時:2009/06/16 21:32
    • good
    • 0

こんばんは。



ご質問は、こちらがいろいろ考えて回答していますが、それをそのままにしてはいけません。新たに質問するなら、前のものを処理して締めてからにしてください。
http://oshiete1.goo.ne.jp/qa5036148.html

情報が多ければ多いほど解答に近くなります。前回を含めて、もう少し、全体の構造が分かるように書いてほしいです。そうでなければ、ワークシートが壊れているという回答にしか結びつかなくなります。

質問の種類は、初歩の初歩です。それが上手く行かない場合は、手順に自体に問題あるわけですが、本来、その種の回答は、したくないものです。

今回は、おそらく、どうやら、モジュールの間違いだと思います。
ひとつをみる、ウォッチウィンドウではなく、ローカルウィンドウで全体をみてください。すぐに間違いに気が付きます。ウォッチウィンドウは、もう少しレベルを上げてからでもよいと思います。

コードが書かれている場所は、標準モジュールか確認してください。

この回答への補足

度々ご迷惑をおかけして、申し訳ありません。
もう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

実際のコードとは違いますが、こんな感じでダメだったのですが、これでわかりますでしょうか?

補足日時:2009/06/16 21:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!