2017-05-04 1 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

제안 : 'i = nLines to 2 Step -1'이면 루프를 뒤로 실행하십시오. – paulsm4

+3

설명은 다음과 같습니다. 10 개의 행 (1에서 10까지의 번호가 매겨진)이 있고 2 행을 삭제 한 다음 3 행에서 10 행으로 이동하여 2 행에서 9 행이된다고 가정합니다 (행 3은 행 2가되고 행 4는 행 3이됩니다 ...).). 그래서 행의 위치가 바뀝니다. **하지만 이제는'i'가 증가하고 한 줄 아래로 내려갑니다 **하지만 다음 줄이 이미 * 현재 줄이되어서 그 줄을 놓치는 이유가 아닙니다. 끝에서부터 시작한다면 우리는 위쪽으로 걸어 가기 때문에 행이 아래쪽으로 움직이는 것은 중요하지 않습니다. –

+0

@ Peh 글쎄, 당신이 설명하면 그것은 아주 단순 해 보였다. 고맙습니다! – jf8769

답변

0

솔루션은 실제로 매우 간단했습니다. paulsm4가 제안했듯이 루프를 뒤로 돌리는 것이 필요했습니다.

For i = nLines to 2 Step -1에 대해 For i = 2 To nLines을 변경해야했습니다.

설명은 VBA가 줄을 삭제하고 위로 이동하면 카운터가 증가하고 한 줄 아래로 이동하여 일부 줄이 사라지는 현상을 설명합니다.

관련 문제