2016-04-29 10 views
4

Microsoft Excel VBAでdo whileループを終了できないため、コーディングに何が問題なのかを知りたいと思います。次の行が空白の場合はループ中にこれを終了します。VBAでdo whileループを終了する方法

Do While Cells(RowName, 1) <> "" 
    Name = Cells(RowName, ColumnName) 
    MsgBox Name 
    RowName = RowName + 1 
Loop 

まだ私は初心者ですので教えてください。 MsgBoxはポップアウトしていて空白であっても終了しません。

+1

「Exit Do」や「Exit Sub」などのターミネータコマンドを使用する – ja72

+2

「空白」とはどういう意味ですか?空白は 'IsEmpty()' = trueを意味します。例えば空白の文字列を意味する。 = "";または一部のユーザーにとっては、セル内のスペースを意味することさえできます。 –

+0

ヒント: 'DoEntil IsEmpty(セル(RowName、1)) ' – PatricK

答えて

2

"Exit Do" - このコマンドは、ループを停止したい場所で使用できます。あなたが列1の行RowNameが空白になっているが、あなたのアールが列ColumnNameにから名前を拾って、列1 できない場合があるので、1列目は、(その中にデータを持っていることかどうかをチェックする

Sub ExitDoSample 
    Dim rowname As Integer 
    Dim ColumnName As Integer 
    rowname = 1 
    ColumnName = 1 


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

     Name = Cells(rowname, ColumnName).Value 
     If Name = "" Or IsEmpty(Name) Then 
      Exit Do 
     Else 
      MsgBox Name 
     End If 
     rowname = rowname + 1 
    Loop 
End Sub 
+0

ありがとうございます。私はコーディングを通してより理解しました。 – Linify

+0

ここに回答を投稿するときに、サブブロック全体を少なくとも1回インデントしてコードブロックをトリガーする必要があります。 –

+2

'Do While Cells(1,1)<> '''を 'Do While Cells(RowName、1)<> '" ' –

0

チェックは成功し、ループは続行されます)。 ColumnNameが空白なので、メッセージボックスに何も表示されないことがあります。 これが問題になりますか?

3

Sankar Balasubramanianの回答は非常に近いですが、いくつかの問題があります。ここで私はそれをやるでしょう。空でない場合はDo、空の文字列の場合はExit Doを行います。

Sub SampleEnding() 
    Dim ws As Worksheet: Set ws = ActiveSheet 
    Dim RowNum As Long: RowNum = 1 
    Dim ColNum As Long: ColNum = 3 
    Dim Name As String 

    Do While Not IsEmpty(ws.Cells(RowNum, 1)) 
     If Trim(ws.Cells(RowNum, 1).Value) <> "" Then 
      Name = ws.Cells(RowNum, ColNum) 
      MsgBox Name 
     Else 
      Exit Do 
     End If 
     RowNum = RowNum + 1 
    Loop 

End Sub 

ROWNUMは常にExcelが100万行以上を持っているとして、オーバーフローエラーを回避するために、ロングとして宣言する必要があります。

また、ワークシート変数を宣言して設定すると、より明確になります。非修飾範囲/セル参照は常に避けるべきです。

+0

コーディングの最初の文にExcelワークシートが複数ある場合は重要ですか? – Linify

+0

多くのワークシートを持つことができます。このコード(あなたと同じ)がアクティブシート上で動作します。しかしこれには、シートを指定できるという利点があります。それはアクティブである必要はありません。 –

+1

また、列名を文字列として宣言し、列文字を割り当てることもできます。それはCells()でうまく動作します。 'Dim ColumnName As String:ColumnName =" C ":Name = ws.Cells(RowNum、ColumnName)' C列の名前を取得します。 –

関連する問題