Поиск / замена в одной колонке, влияющая на весь лист - PullRequest
0 голосов
/ 20 января 2019

В столбце L (только) я хочу заменить любой экземпляр данных на «True» независимо от того, что было изначально в любой из ячеек столбца L. Код, который я пробовал, был:

With ActiveSheet
  intLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

Let strSelectRange = "L2" & ":" & "L" & intLastRow
  Range(strSelectRange).Select

Cells.Replace What:="*", Replacement:="True", LookAt:=xlPart _
  , SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
  ReplaceFormat:=False

End With

Во-первых, я использовал .Rows.Count, "A", потому что в этом столбце у каждой строки есть данные, поэтому я знаю, сколько строк будет записано в столбце L. В столбце L многие ячейки будут пустыми.

Когда я запускаю это, каждая ячейка во всем рабочем листе, в которой есть что-либо, изменяется на True, а не только на данные в столбце L.

Другой метод, который я попробовал, был:

Range("L2:L1200").Select
Selection.Replace What:="*", Replacement:="True", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
Range("A1").Select

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

Что я действительно хотел бы знать, так это то, что я делаю неправильно в первом примере кода.

Спасибо за любую помощь, которую вы можете предложить !!!

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Поиск и замена в столбце

  • Всегда используйте Option Explicit, чтобы быстрее узнать о происходящем ошибки и вынуждены объявлять переменные.
  • Вы всегда должны объявлять свои строки как Long.
  • Когда вы используете оператор With, вы используете точки на всем, даже на .Range и .Cells и т. д. Код может работать в этом случае (ActiveSheet) в любом случае, но это неверно.
  • Избегайте использования ActiveSheet, используйте имя листа.
  • Избегайте использования выбора. Об этом много постов (статей).
  • Когда вы используете Клетки без чего-либо, это относится ко всем ячейки на листе.
  • Первым делом в функции замены (функция поиска) является диапазон где вы собираетесь заменить (найти, найти). Это может быть столбец, это может быть Ячейки или просто меньший диапазон.

Код

Sub SROneColumn()

    Const cVntLRColumn As Variant = "A"  ' Last Row Column Letter/Number
    Const cVntCriteria As Variant = "L"  ' Criteria Column Letter/Number
    Const cLngFirstRow As Long = 2       ' First Row Number
    Const cStrReplace As String = "True" ' Replace String

    Dim lngLastRow As Long        ' Last Row Number
    Dim strSelectRange As String  ' Select Range Address

    With ActiveSheet
        lngLastRow = .Cells(.Rows.Count, cVntLRColumn).End(xlUp).Row
        strSelectRange = .Range(.Cells(cLngFirstRow, cVntCriteria), _
                .Cells(lngLastRow, cVntCriteria)).Address
        .Range(strSelectRange).Replace What:="*", Replacement:=cStrReplace, _
                LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False
    End With

End Sub

Интересный способ использования рабочего листа без использования объектной переменной:

Sub SRSheet()

    Const cStrSheet As Variant = "Sheet1"   ' Worksheet Name/Index

    With ThisWorkbook.Worksheets(cStrSheet)


    End With

End Sub
0 голосов
/ 20 января 2019
Range(strSelectRange).Select

выбирает диапазон (хотя лучше всего избегать выбора ), но тогда ваш код ничего не делает с этим выбором, потому что Cells - это весь лист.

Возможно, вы захотите вместо этого:

  Range(strSelectRange).Replace What:="*", Replacement:="True", LookAt:=xlPart
...