Удаление последовательных повторяющихся значений из CSV в Excel Visual Basic - PullRequest
1 голос
/ 15 сентября 2011

В макросе Excel 2007 VB я пытаюсь сделать запятую отдельную строку, разделить ее, а затем уменьшить ее, удалив дублирующиеся последовательные значения.Таким образом, «2,2,2,1,1» станет «2,1» или «3,3,3,2,3,3,3» станет «3,2,3».

Похоже, что это должно работать, но когда он достигает «If currentVal.equals (prevVal) = False Then», это его ошибка времени выполнения 424, «Требуется объект».

Это было вечно с тех пор, как я сделал 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 ]

3 голосов
/ 15 сентября 2011

Есть несколько проблем. Во-первых, вы не можете использовать:

Dim currentVal, prevVal As String

Вы должны использовать:

Dim currentVal as String
Dim prevVal As String

или

Dim currentVal as String, prevVal as String

... так как вы, к сожалению, не можете использовать быстрые типы в VBA. Во-вторых, строки не являются объектами в 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
2 голосов
/ 15 сентября 2011

Я бы предложил использовать массив вариантов с регулярным выражением, чтобы максимизировать эффективность и скорость вашего подхода. Как то так

Обновление: Собираю по собственному совету в другом месте код, теперь проверяю более 1 ячейки перед применением варианта массива

   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 голос
/ 15 сентября 2011

Вы можете использовать объект словаря, тем более что вы перемещаете числа в текстовый файл, и не имеет значения, что они не рассматриваются как числа как таковые. См этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...