Мне недавно передали файл Excel для форматирования - 100 строк. Изображение ниже показывает вам его состояние. Это может быть очень длинное упражнение, если я проработаю его вручную, поэтому я подумал, может ли макрос помочь.

Моя работа состоит в том, чтобы:

  1. Удалите строки, где Dot & Dot & Dash используются вместе. Затем;

  2. Просмотрите список еще раз и удалите оставшиеся символы точек и тире, не удаляя строки.

Я надеюсь, что после этого мой новый отформатированный список будет выровнен по левому краю.

В любом случае, если кто-то из вас подскажет мне правильные вещи, которые нужно вставить в подходящий макрос, тогда это будет очень полезно (и сэкономит мне часы работы, так как я чувствую, что это не единственный лист, отформатированный таким образом).

Этот файл имеет более 600 строк

3 ответа3

3

Когда вы удаляете строки в цикле, лучше всего цикл в обратном направлении. Таким образом, внутренний счетчик цикла не запутается. Всегда, всегда, всегда делайте резервную копию ваших данных, прежде чем запускать код из Интернета, который удаляет материал.

Sub DeleteRows()

    Dim i As Long
    Dim rng As Range

    Set rng = Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns(1))

    For i = rng.Count To 1 Step -1
        If rng.Cells(i).Value Like "..-*" Then
            rng.Cells(i).EntireRow.Delete
        ElseIf rng.Cells(i).Value Like ".-*" Then
            rng.Cells(i).Value = Replace(rng.Cells(i).Value, ".-", "", 1, 1)
        End If
    Next i

End Sub
1

Вместо макроса вы могли бы:

  1. использовать функцию сортировки
  2. убей свои ..- строки
  3. используйте «Найти / Заменить» на «.-» (без замены в качестве опции), а затем
  4. пересортируйте ваши данные.

Это немного сложнее, чем макрос, но в любом случае это альтернатива. Решение dkusleika выглядит так, как будто оно должно работать.

0

Вот как я справлюсь с этим:

For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 3) = "..-" Then
        Cell.EntireRow.Delete
    ElseIf Left(Cell.Value, 2) = ".-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 2))
    End If
Next

Единственная проблема заключается в том, что он не видит строку после удаления, поэтому может быть лучше сделать что-то вроде следующего:

For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 3) = "..-" Then
        Cell.EntireRow.Delete
    ElseIf Cell.Value = "" Then
        Exit For
    End If
Next
For Each Cell In ActiveSheet.Range("A:A")
    If Left(Cell.Value, 2) = ".-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 2))
    ElseIf Left(Cell.Value, 1) = "-" Then
        Cell.Value = Right(Cell.Value, (Len(Cell.Value) - 1))
    ElseIf Cell.Value = "" Then
        Exit For
    End If
Next

Вы заканчиваете тем, что перебираете пакет ячеек дважды, но это фактически ловит все ...

Если вам нужно выровнять определенный столбец, попробуйте

With ActiveSheet.Columns("A")
    .HorizontalAlignment = xlLeft
End With

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .