Вопрос по excel, search, vba, string – Найти строку в ячейке с помощью VBA

4

Я сводил меня с ума этим целый день, искал все выше и ниже, и, вероятно, я пытаюсь быть слишком милым, поэтому я полностью застрял.

Я пытаюсь запустить простой, если тогда

Если ячейка содержит «%» Мне бы хотелось сделать одно, а если нет, то другое. По причинам, которые я не понимаю, я не могу заставить его работать. Я явно взял пару идей из других мест, но все еще не могу заставить их работать.

Сложные факторы - я не хочу запускать это для всего столбца, только для таблицы, поэтому он встроен в большую подпрограмму с использованием лотов или относительных ActiveCells. Я никогда не знаю, где в столбце «А» я столкнусь с & quot;% Change & quot; поэтому диапазон всегда должен быть переменным. Я хочу, чтобы VBA / VBE делал что-то другое, когда сталкивался с ячейкой с & quot;% & quot; в этом. ТАК

Вот как выглядят необработанные данные

Initial Value (6/30/06)

Value (12/31/06)

Net Additions (9/30/07)

Withdrawal (12/07)

Value (12/31/07)

Withdrawal (2008)

Value (12/31/08)

Addition (8/26/09)

Value (12/31/09)

Value (12/31/10)

Value (12/30/11)

Value (3/31/12)

% Change 1st Quarter

% Change Since Inception

Но когда я запускаю следующее, он застревает в плохом цикле, где он должен был вытолкнуть в «Если тогда» в отличие от «остального» часть саб.

Sub IfTest()
 'This should split the information in a table up into cells
 Dim Splitter() As String
 Dim LenValue As Integer     'Gives the number of characters in date string
 Dim LeftValue As Integer    'One less than the LenValue to drop the ")"
 Dim rng As Range, cell As Range
 Set rng = ActiveCell

Do While ActiveCell.Value <> Empty
    If InStr(rng, "%") = True Then
        ActiveCell.Offset(0, 0).Select
        Splitter = Split(ActiveCell.Value, "% Change")
        ActiveCell.Offset(0, 10).Select
        ActiveCell.Value = Splitter(1)
        ActiveCell.Offset(0, -1).Select
        ActiveCell.Value = "% Change"
        ActiveCell.Offset(1, -9).Select
    Else
        ActiveCell.Offset(0, 0).Select
        Splitter = Split(ActiveCell.Value, "(")
        ActiveCell.Offset(0, 9).Select
        ActiveCell.Value = Splitter(0)
        ActiveCell.Offset(0, 1).Select
        LenValue = Len(Splitter(1))
        LeftValue = LenValue - 1
        ActiveCell.Value = Left(Splitter(1), LeftValue)
        ActiveCell.Offset(1, -10).Select
    End If
Loop
End Sub

Спасибо за помощь, спасибо!

Ваш Ответ

3   ответа
0

Find, AutoFilter или вариантный массив подходит. Циклы дальности обычно слишком медленные, еще хуже, если они используютSelect

Приведенный ниже код будет искать переменную strText в выбранном пользователем диапазоне, а затем добавляет любые совпадения в переменную диапазона.rng2 который вы можете затем обработать

Option Explicit

Const strText As String = "%"

Sub ColSearch_DelRows()
    Dim rng1 As Range
    Dim rng2 As Range
    Dim rng3 As Range
    Dim cel1 As Range
    Dim cel2 As Range
    Dim strFirstAddress As String
    Dim lAppCalc As Long


    'Get working range from user
    On Error Resume Next
    Set rng1 = Application.InputBox("Please select range to search for " & strText, "User range selection", Selection.Address(0, 0), , , , , 8)
    On Error GoTo 0
    If rng1 Is Nothing Then Exit Sub

    With Application
        lAppCalc = .Calculation
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    Set cel1 = rng1.Find(strText, , xlValues, xlPart, xlByRows, , False)

    'A range variable - rng2 - is used to store the range of cells that contain the string being searched for
    If Not cel1 Is Nothing Then
        Set rng2 = cel1
        strFirstAddress = cel1.Address
        Do
            Set cel1 = rng1.FindNext(cel1)
            Set rng2 = Union(rng2, cel1)
        Loop While strFirstAddress <> cel1.Address
    End If

    If Not rng2 Is Nothing Then
        For Each cel2 In rng2
            Debug.Print cel2.Address & " contained " & strText
        Next
    Else
        MsgBox "No " & strText
    End If

    With Application
        .ScreenUpdating = True
        .Calculation = lAppCalc
    End With

End Sub
Это будет очень полезно для меня в будущем, спасибо! Tommy Z
0

rng поэтому он всегда указывает на начальную ячейку

скопироватьSet rng = rng.Offset(1, 0) на новую строку перед циклом

Кроме того, вашInStr тест всегда провалится
True -1, но возврат изInStr будет больше 0, когда строка найдена. изменить тест, чтобы удалить = True

новый код:

Sub IfTest()
 'This should split the information in a table up into cells
 Dim Splitter() As String
 Dim LenValue As Integer     'Gives the number of characters in date string
 Dim LeftValue As Integer    'One less than the LenValue to drop the ")"
 Dim rng As Range, cell As Range
 Set rng = ActiveCell

Do While ActiveCell.Value <> Empty
    If InStr(rng, "%") Then
        ActiveCell.Offset(0, 0).Select
        Splitter = Split(ActiveCell.Value, "% Change")
        ActiveCell.Offset(0, 10).Select
        ActiveCell.Value = Splitter(1)
        ActiveCell.Offset(0, -1).Select
        ActiveCell.Value = "% Change"
        ActiveCell.Offset(1, -9).Select
    Else
        ActiveCell.Offset(0, 0).Select
        Splitter = Split(ActiveCell.Value, "(")
        ActiveCell.Offset(0, 9).Select
        ActiveCell.Value = Splitter(0)
        ActiveCell.Offset(0, 1).Select
        LenValue = Len(Splitter(1))
        LeftValue = LenValue - 1
        ActiveCell.Value = Left(Splitter(1), LeftValue)
        ActiveCell.Offset(1, -10).Select
    End If
Set rng = rng.Offset(1, 0)
Loop

End Sub
Очень хорошо, спасибо за объяснение теста inStr! Это очень полезно! Tommy Z
4

% & quot; находясь в камере. Как только вы это сделаете, вы можете добавить оставшуюся часть кода.

Попробуй это:

Option Explicit


Sub DoIHavePercentSymbol()
   Dim rng As Range

   Set rng = ActiveCell

   Do While rng.Value <> Empty
        If InStr(rng.Value, "%") = 0 Then
            MsgBox "I know nothing about percentages!"
            Set rng = rng.Offset(1)
            rng.Select
        Else
            MsgBox "I contain a % symbol!"
            Set rng = rng.Offset(1)
            rng.Select
        End If
   Loop

End Sub

InStr вернет количество раз, когда ваш текст поиска появится в строке. Я изменил твойif проверить, чтобы проверить, нет совпадений в первую очередь.

Окна сообщений и.Selects Вы просто видите, что происходит, пока вы шагаете по коду. Убери их, как только получишь работу.

Спасибо Сиддхарт.
Хорошая сделка - рад, что теперь это работает для вас. Похоже, вы получили 3 полезных ответа. Идите дальше и нажмите на флажок рядом с наиболее полезным, чтобы принять его как "ответ". И добро пожаловать в stackoverflow.
+1 Красиво Готово :)
Это простая часть головоломки, которую мне не хватало. Я все еще относительно новичок, так что не подумал (хорошо, может быть, известен :) о возможности сделать set rng.offset в if. Это здорово и очень очень полезно. Я также использовал истинное ложное значение в отличие от = 0 для функции InStr, которую я до сих пор не совсем понял, но оценил. Огромное спасибо! Tommy Z

Похожие вопросы