2017-12-04 12 views
1

複数回実行できる必要があるVBAのSubがあります。私はシートの最後の行を見つけるために、コードのこの部分を実行する:VBAコードはメッセージボックスで実行されますが、メッセージボックスでは実行されません。

Dim lastRow As Long 
With ActiveSheet 
lastRow = xlWs.Cells(.Rows.count, "A").End(xlUp).Row 
End With 

を私はそれを実行するとき

オブジェクト変数またはWithブロック変数が

を設定しないで取得します2回目ですが、変数セットの前にメッセージボックスを追加すると、次のようになります。

それは何度実行しても機能します。前にこの問題に遭遇した人はいますか? 2番目のセットで修正された最初のコードセットで何が問題になっていますか?

+2

EndLow = xlWs.Cells(.Rows.count、 "A")を変更します。(xlUp).Row'を 'lastRow = .Cells(.Rows.count、" A ")にします。End(xlUp).Row' –

+0

それは動作します!しかし、2つのコードブロックの違いは何ですか? (ありがとうございました!) –

+0

サブが実行されているときにxlWsがアクティブであるかどうかは依存しますか? – SJR

答えて

0

を定義しているコードブロック内でワークシートオブジェクトとしてxlWsを使用していますが、呼び出す前に定義した場所がわからないため、エラーが発生します。万が一、以前のコード実行でそのオブジェクトを設定していて、何とかそのワークシートがアクティブであれば、エラーメッセージは表示されません。コードを実行しているときや他のパラメータをどのように実行しているかについての情報はまだありませんが、ここでの最良の質問は、オブジェクトのクリーンで標準的な定義に従う方法と、良いコードライン。私は最後の行のための関数を記述し、ワークシートや列番号をオプションになります

Function LastRowInColumn(Optional sh As Worksheet, Optional colNumber As Long = 1) As Long 
    'Finds the last row in a particular column which has a value in it 
    If sh Is Nothing Then 
     Set sh = ActiveSheet 
    End If 
    LastRowInColumn = sh.Cells(sh.Rows.Count, colNumber).End(xlUp).row 
End Function 

この関数は、それは、あなたはシートオブジェクトを入力した場合、それはそれを使用します、あなたのための適切なシートを設定、管理、もしません。アクティブシートを使用します。任意の列番号を入力すると(たとえばcolNumber = 3は列Cになります)、その列の最後の行が検索されます。空白のままにすると、column A.

0

私はこれをテストしていませんが、これまでにこの問題がありました。

問題はあなたが.Rows.countを修飾していないことだと思います。 xlWs.Rows.countに変更してみてください。それがなければ、アクティブなワークシートの行数を取得しています。

それが修飾された細胞()文で、内部のだとしても付き文で定義されたオブジェクトへの前の物体点のない

ドット演算子。)

' Try This 
Dim lastRow As Long 
With ActiveSheet 
    lastRow = xlWs.Cells(xlWs.Rows.count, "A").End(xlUp).Row 
End With 

なぜ私はわかりません「アクティブシートあり」を使用しています。ワークシートxlWsの最後の行を取得しようとしているように見えますが、これはワークシートオブジェクトであると想定しています。

ので、コードは次のように簡略化することができます

' Better yet, try this 
Dim lastRow As Long 
lastRow = xlWs.Cells(xlWs.Rows.count, "A").End(xlUp).Row 

アクティブワークシートが.END(xlUp)を行うことによってxlWsに変更されたため、メッセージボックスがそれを修正理由がある

' This code changes the active worksheet to worksheet xlWs 
' by doing .End(xlUp) 
MsgBox xlWs.Cells(.Rows.count, "A").End(xlUp).Row 
関連する問題