6

私はこれに一日狂ったように運転していて、高低を検索しました、そしておそらく可愛すぎようとしているので完全に立ち往生しています。

それなら私は単純なものを実行しようとしています

セルに「%」が含まれている場合は、あることを実行し、そうでない場合は別のことを実行します。理由がわからないので、うまくいきません。私は明らかに他の場所からいくつかのアイデアを取り入れましたが、それでもそれを機能させることはできません。

複雑な要因-これを列全体ではなく、テーブルだけで実行したくないので、ロットまたは相対ActiveCellを使用してより大きなサブに埋め込まれます。A列のどこで「%Change」が発生するかわからないため、範囲は常に可変である必要があります。「%」が含まれているセルに到達したときに、VBA/VBEに別の処理を実行させたい。それで

生データは次のようになります

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

しかし、以下を実行すると、サブの「Else」部分ではなく「IfThen」に引き出されるはずの悪いループでスタックします。

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

すべての助けに感謝します、ありがとう!

4

3 に答える 3

5

コードを単純化して、セル内にある「%」のテストを分離しました。それが機能するようになったら、残りのコードを追加できます。

これを試して:

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、コードのステップ実行中に何が起こっているかを確認するためだけに存在します。機能するようになったら、それらを取り出します。

于 2012-06-05T22:04:57.497 に答える
0

検索ルーチンについてはFindAutoFilterまたはバリアント配列アプローチの使用を検討する必要があります。通常、範囲ループは遅すぎます。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
于 2012-06-06T03:26:07.767 に答える
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
于 2012-06-05T21:30:35.090 に答える