2017-05-04 10 views
1

IF条件を使用してスプレッドシート内の空白のセルを見つけ、不要な行の一部を削除して他のセルを上に移動しています。うまくいっていましたが、このデータベースを使用したときにコードはいくつかの行を削除しません。ファイルここでVBAは空白のセルを削除していません

Dim wb As Workbook 
Dim Disciplinas As Worksheet 
Set wb = ThisWorkbook 
Set Disciplinas = wb.Sheets("Disciplinas") 

Dim start_time As range 
Dim i As Integer, nLines As Integer 

nLines = Disciplinas.Cells(Rows.Count, 2).End(xlUp).Row 

Set start_time = Disciplinas.Rows(1).Find(what:="HR_INICIO", LookIn:=xlValues, lookat:=xlWhole) 

For i = 2 To nLines 
    If Disciplinas.Cells(i, start_time.Column) = "" Then 
     Disciplinas.Cells(i, 2).Resize(, 13).Delete Shift:=xlUp 
    End If 
Next 

されています:Spreadsheet(私はトラブルを抱えている細胞はE125にE105をしている他のものが既に持っている。ここで

はそれを見つけて、ラインの一部を削除し、次の部分であります初めてコードを実行したときに削除されました)。

If Disciplinas.Cells(i, start_time.Column) = "" Thenの代わりに、私はvbNullStringisEmpty() = TRUEを試しましたが、すべてが削除されませんでした。私はスプレッドシートに式=ISBLANK()を直接使用しました。その結果は真です。

私がコードを複数回実行すると、最終的にすべての行が削除されることに気付きました。なぜ私は最初の実行でそれをすべて削除しないのか自分に尋ねる?ありがとう。

+5

提案:ループを逆方向に実行してください: 'For i = nLines to 2 Step -1'。 – paulsm4

+3

説明は次のとおりです:10行(1から10までの番号が付けられています)と行2を削除し、3行目から10行目を1行上に移動して2行目から9行目(行3が行2になり、行4が行3になります) )。行の位置が変わります。 **しかし今は 'i'が増えて1行下がります**しかし、次の行はすでに*現在の行になっているので、この行を見逃してしまいます。あなたが終わりから始めるならば、私たちが上を歩くので、行が下に動くことは重要ではありません。 –

+0

@Pehまあ、あなたが説明した後、それはかなりシンプルに思えました。ありがとうございました! – jf8769

答えて

0

解決策は本当に簡単でしたが、paulsm4が示唆しているように、ループを逆方向に実行するだけでした。

For i = 2 To nLinesFor i = nLines to 2 Step -1に変更する必要がありました。

説明は、VBAが行を削除して上に移動すると、カウンタがインクリメントして1行下に移動し、いくつかの行が「不足しています」という説明があります。

関連する問題