2016-10-12 3 views
2

나는 만들려고하는 새 프로그램이 있습니다. CSV 파일을 가져 오니 데이터 정리가 필요합니다. 첫 번째 행에는 올바른 표제가 있지만 열 레이블에 할당해야하는 것과는 일부 불일치가 있습니다.중첩 루프 Excel VBA - Shiftleft

: 정확한 행 같아야

A   B  C  D 
bxxxxxxx1 1994 7890 main 

잘못된 행 (들) :

bxxxxxxx1 bxxxxxxx2 1994 1995 7890 7891 main main 
bxxxxxxx1 bxxxxxxx2 bxxxxxxx3 bxxxxxxx4 1994 1995 1996 1997 7890 7891 7890 7891 main main main main 
bxxxxxxx1 bxxxxxxx2 bxxxxxxx3 1994 1995 1996 7890 7891 7892 main main main 
bxxxxxxx1....bxxxxxxxn 1994....yearn...7890...789n...main1....mainn 

그래서 잘못된 행 각 이어 b 값을 여러 번 제공 값은 여러 b 값을 갖는 모든 행을 상쇄합니다. 그래서

코드 (열 머리글로 정렬 왼쪽으로 이동 모두)을 bxxxxxxx2, 1995, 7891, 2 주, 나머지를 유지를 제거하려면 내가 현재 가지고 :

Sub bibcheck() 
    Dim Cel As Range 
    Dim n As Integer 
    bibfound = 0 

    For i = 3 To 9 
     n = 0 
     For j = 2 To 9 
      Set Cel = Cells(i, j) 

      If Cel Like "b*#" Or Cel Like "b*?" Then 
       n = n + 1 
       ' MsgBox n :'to verify record is found 
       Cel = "" 'Clear the bib record found 


      'Insert new code 
      'Use each n created per row to create a new loop for shifting to the left 
      'skip a value, then use n again to delete that many cells to the right, continuously shifting blanks to the left. 

      Else 
      End If 
     Next 
    Next 
End Sub 
+0

얼마나 많은 열이 *가 있어야한다? 귀하의 예에서는 4 개이지만 코드는 9를 기대하는 것처럼 보입니다. 항상 그렇습니다. 9 개 열이 맞습니까? –

+0

I = 3에서 0, j = 2에서 9까지 사용하는 예제는 각 행과 열을 테스트하는 임의의 값으로, MsgBox를 사용하면 예상 한 값을 출력합니다 (나는 훌륭한 프로그래밍이 아니다). 실제로는 bxxxxxx를 비롯하여 약 10,000 행의 데이터가 포함될 최대 7 개의 열이 있습니다. –

답변

3

이 할 것 당신은 무엇을 요구 :

Sub bibcheck() 
Dim ws As Worksheet 
Dim lastrow As Long 
Dim lastclm As Long 
Dim i As Long 
Dim j As Long 
Dim oArr(1 To 4) As Variant 
Dim t As Integer 

Set ws = ThisWorkbook.ActiveSheet 

With ws 
    lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row 
    For i = 3 To lastrow 
     lastclm = .Cells(i, .Columns.Count).End(xlToLeft).Column 
     j = Application.WorksheetFunction.CountIf(.Range(.Cells(i, 1), .Cells(i, lastclm)), "b*") 
     t = 1 
     For j = 1 To lastclm Step j 
      oArr(t) = .Cells(i, j).Value 
      t = t + 1 
     Next j 
     .Range(.Cells(i, 1), .Cells(i, lastclm)).ClearContents 
     .Range(.Cells(i, 1), .Cells(i, 4)).Value = oArr 
    Next i 
End With 

End Sub 

하기 전에 :

enter image description here

후 0

: 데이터 *의

enter image description here

+0

첫 번째 행이 반복되어 두 번째 행과 섞여있는 것처럼 보입니다. –

+0

데이터의 세 번째 세트를 포함하도록 데이터를 확장하는 것을 보았을 때까지 나는 당신의 예제에 대해 혼란스러워했습니다. 나는 이것이 당신이 여분의 줄을 만들어야하는 경우라면 그렇게 생각할 것이다. 어쨌든 그것은 OP의 데이터 세트에서 작동합니다. +1 –

+0

위의 내용을 4로 나누지 않도록 수정할 수 있습니까? 4로 나눌 수있는 것이 없으면 어떻게 될까요? "b"값과 clearcontents를 찾기 위해 루프를 수정하는 간단한 방법이 있습니까? 또한 발견 된 b 값의 수에 따라 이동하고 해당 데이터 셀을 제거 할 수 있습니까? –