webentwicklung-frage-antwort-db.com.de

Suchen Sie mit VBA eine Zeichenfolge in einer Zelle

Ich habe mich einen Tag lang verrückt gemacht, hoch und tief gesucht und versuche wahrscheinlich, zu süß zu sein, also stecke ich total fest.

Ich versuche dann ein einfaches zu betreiben

Wenn eine Zelle "%" enthält, möchte ich, dass sie eine Sache macht, und wenn nicht eine andere. Aus Gründen, die ich nicht verstehe, kann ich es nicht zum Laufen bringen. Ich habe eindeutig ein paar Ideen von anderswo übernommen, kann sie aber immer noch nicht zum Laufen bringen.

Komplizierende Faktoren - Ich möchte dies nicht für die gesamte Spalte ausführen, sondern nur für eine Tabelle. Daher wird es mithilfe von Lots oder relativen ActiveCells in ein größeres Sub eingebettet. Ich weiß nie, wo ich in der A-Spalte auf "% Change" stoßen werde, daher muss der Bereich immer variabel sein. Ich möchte, dass VBA/VBE etwas anderes macht, wenn es auf eine Zelle mit dem "%" darin stößt. SO

So sehen die Rohdaten aus

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

Aber wenn ich das Folgende laufen lasse, bleibt es in einer schlechten Schleife stecken, wo es in das "Wenn Dann" herausgezogen werden sollte, im Gegensatz zum "Anderen" Teil des U-Boots.

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

Alle Hilfe wird geschätzt, danke!

4
Tommy Z

Ich habe Ihren Code vereinfacht, um den Test für "%" in der Zelle zu isolieren. Sobald Sie das zum Laufen gebracht haben, können Sie den Rest Ihres Codes hinzufügen.

Versuche dies:

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 gibt zurück, wie oft Ihr Suchtext in der Zeichenfolge erscheint. Ich habe Ihren if-Test so geändert, dass er zuerst auf keine Übereinstimmungen überprüft wird.

Die Meldungsfelder und der .Selects sind nur für Sie da, um zu sehen, was passiert, während Sie den Code durchlaufen. Nehmen Sie sie heraus, sobald Sie es zum Laufen bringen.

4
Jon Crowell

Für eine Suchroutine sollten Sie Find-, AutoFilter- oder variant array-Ansätze verwenden. Range-Loops sind normalerweise zu langsam, schlimmer noch, wenn sie Select verwenden

Der folgende Code sucht nach der Variablen strText in einem vom Benutzer ausgewählten Bereich und fügt dann Übereinstimmungen zu einer Bereichsvariablen rng2 hinzu, die Sie dann weiterverarbeiten können

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
0
brettdj

sie ändern niemals den Wert von rng, sodass er immer auf die ursprüngliche Zelle verweist

kopieren Sie die Set rng = rng.Offset(1, 0) in eine neue Zeile vor der Schleife

außerdem schlägt Ihr InStr-Test immer fehl
True ist -1, aber die Rückgabe von InStr ist größer als 0, wenn die Zeichenfolge gefunden wird. Ändern Sie den Test zu entfernen = True

neuer Code:

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
0
SeanC