728x90

이번 포스팅은 다른 글에서 특정값의 행전체를 삭제하는 소스의 문제점을 보완해서 코드를 작성했습니다.

우선 이 문제를 찾아주신 닉네임 '블루페일닷'님 감사합니다.

 

// 문제의 코드

Sub 특정_행_전체삭제()

    Dim r

    For Each r In Selection //선택한 값들을 각각 하나하나씩 r에 저장한다.
    
        If r = "목표" Then // 현재 위차한 r 즉, 셀값이 목표인 경우를 찾는다.

            r.EntireRow.Delete // 셀값이 목표이면 행전체를 삭제한다.
            
        End If
        
    Next r

End Sub

위 코드블럭의 코드는 '목표' 값을 찾았을 경우 삭제하면 행전체가 삭제되기 때문에 엑셀에서 주소 값이 하나가 줄어들게 됩니다.

 

이렇게 됐을 때 문제가 목표라는 값이 연속해서 존재할 경우 다음 '목표값'의 위치(주소 값)가 한 줄씩 밀리기 때문에 '선택 값'은 원래 계산해야 하는 값을 무시한 후 넘어가서 누락되는 현상이 있었습니다.

 

이를 보완해서 다시 만들었습니다.

 

// 문제점을 보완한 코드

Sub 특정_행_전체삭제_업그레이드_Ver()
    
    For i = 0 To Selection.Rows.Count - 1
        
        If ActiveCell.Offset(i, 0).Value <> "" Then
        
            If ActiveCell.Offset(i, 0).Value = "목표" Then
            
                ActiveCell.Offset(i, 0).EntireRow.Delete
                
                i = i - 1
                
            End If
            
        Else
        
            Exit For
            
        End If
        
    
    Next i
    

End Sub

위 코드블럭의 코드를 사용해주세요. 코드 설명은 아래를 소스를 이용해주세요.

 

// 문제점을 보완한 코드

Sub 특정_행_전체삭제_업그레이드_Ver()
    
    For i = 0 To Selection.Rows.Count - 1 // 0 ~ (선택한 행 개수 - 1)만큼 반복
        
        If ActiveCell.Offset(i, 0).Value <> "" Then // 공백인 경우 함수를 종료
        
            If ActiveCell.Offset(i, 0).Value = "목표" Then // 목표인 경우
            
                ActiveCell.Offset(i, 0).EntireRow.Delete //행 삭제
                
                i = i - 1 // 행을 삭제했으니 다시 원래 위치로 돌아감
                
            End If
            
        Else
        
            Exit For
            
        End If
        
    
    Next i
    

End Sub

※ 디테일 보충설명

 - ActiveCell은 현재 선택된 셀을 의미. 그리고 드래그를 했을 경우 가장 상단의 셀을 인식.

 - Offset 상대적 위치를 의미.

728x90
TOP