2011-09-14 2 views
1

Excel 2007 VB 매크로에서 쉼표로 구분 된 문자열을 사용하여 분할 한 다음 줄여서 연속 된 값을 중복 제거하려고합니다. 따라서 "2,2,2,1,1"은 "2,1"이되거나 "3,3,3,2,3,3,3"은 "3,2,3"이됩니다.Excel에서 CSV에서 연속 된 중복 값 제거 Visual Basic

작동하는 것처럼 보이지만 "currentVal.equals (prevVal) = False Then"에 도달하면 런타임 오류 424, 'Object required'가 표시됩니다.

저는 VB를 한 이후로 영원했습니다. VP6이었습니다.

Sheets("Sheet1").Select 
Range("I1").Select 

Dim data() As String 
Dim currentVal, prevVal As String 
Dim output As String 
Dim temp As Boolean 

Do Until Selection.Value = "" 
     data = Split(Selection, ",") 
     output = "" 
     prevVal = "" 
     For Each elem In data 
      currentVal = CStr(elem) 
      If currentVal.equals(prevVal) = False Then 
      output = output + elem + "," 
      End If 
     Next elem 
     Selection.Value = output 
     Selection.Offset(1, 0).Select 
Loop 

답변

3

몇 가지 문제가 있습니다. ...

Dim currentVal as String, prevVal as String 

당신이 할 수없는 VBA에서 바로 가기 유형 불행히도 :

Dim currentVal, prevVal As String 

당신은 사용해야합니다 :

Dim currentVal as String 
Dim prevVal As String 

또는 첫째, 당신은 사용할 수 없습니다. 둘째, 문자열은 VBA의 개체가 아니므로 .equals (또는 다른 방법)가 없습니다. 당신이 원하는 :

If currentVal <> prevVal Then 

는 마지막으로, 당신은 당신의 루프 또는 예상대로 작동하지 않습니다 코드의 끝 부분에 PREVVAL을 설정해야합니다.

Dim data() As String 
Dim currentVal As String, prevVal As String 
Dim output As String 
Dim temp As Boolean 

Do Until Selection.Value = "" 
     data = Split(Selection, ",") 
     output = "" 
     prevVal = "" 
     For Each elem In data 
      currentVal = CStr(elem) 
      If currentVal <> prevVal Then 
       output = output + elem + "," 
      End If 
      prevVal = currentVal 
     Next elem 
     Selection.Value = output 
     Selection.Offset(1, 0).Select 
Loop 
+0

예, 마지막 지점을 깨닫고 고쳐주었습니다. 또한 IRC chan에서 currentVal = prevVal을 얻었습니다. 감사합니다. 그러나 String은 Object 여야하며 (.) 메서드가 있어야합니다. http://msdn.microsoft.com/en-us/library/system.string.equals%28v=vs.80 % 29.aspx 물론 VB.NET이 아닌 VBA이므로 모든면에서 차이가있을 수 있습니다. – Drizzt321

+0

아, 그래도 모든 차이가 있습니다. VBA는 VB6을 기반으로하며 작은 구문 유사성을 제외하고는 VB.NET과 거의 관련이 없습니다. string, boolean, integer, long 등과 같은 데이터 유형은 VBA의 객체가 아니라 메모리의 실제 데이터 값을 보유하므로 관련 속성이나 메서드가 없으며 직접 비교하고 조작 할 수 있습니다. String.equals()는 실제 값을 유지하는 대신 변수가 메모리 주소를 가리키는 것처럼 문자열이 객체 인 언어에서 필요합니다. – Banjoe

2

나는 당신의 접근 방식의 효율성과 속도를 극대화하기 위해 정규 표현식으로 변형 배열을 사용하는 것이 좋습니다 것 :

편집는 여기에 몇 가지 작업 코드입니다. 이

업데이트 비슷해 : 내 자신의 조언을 따기는 다른 코드는 지금 당신이 이동 특히 이후 사전 개체를 사용할 수있는 변형 배열을

Sub Clear() 
    Dim ws As Worksheet 
    Dim rng1 As Range 
    Dim X 
    Dim lngRow As Long 
    Dim objRegex 
    Set objRegex = CreateObject("vbscript.regexp") 
    Set ws = Sheets("Sheet1") 
    Set rng1 = ws.Range(ws.[i1], ws.Cells(Rows.Count, "I").End(xlUp)) 
    With objRegex 
     .Global = True 
     .Pattern = "(\d)(,(\1))+" 
     If rng1.Cells.Count > 1 Then 
      X = rng1 
      For lngRow = 1 To UBound(X) 
       X(lngRow, 1) = .Replace(X(lngRow, 1), "$1") 
      Next lngRow 
      rng1 = X 
     Else 
      rng1.Value = .Replace(rng1.Value, "$1") 
     End If 
    End With 
End Sub 
+1

+1, 더 나은 접근 방식. – Reafidy

1

을 적용하기 전에 1 개 이상의 셀에 대한 테스트 텍스트 파일의 번호는 숫자 자체로 취급되지 않는다고 중요하지 않습니다. this question

+0

그래, 사전을 사용하고 두 번째 시트에 집계 된 데이터를 출력하는 코드를 수정했다. 나는 실제로 그것을 단지 4-5 시간 만에 끝내기위한 나 자신을 꽤 자랑스럽게 생각한다! VBA 처음. – Drizzt321

+0

차가움. 그래, 그 사전 개체는 꽤 편리합니다. 잘 했어! – Brad