1

私はあまり経験がありませんが、列 A を検索する関数を作成しようとしています。最初に「AT」で始まる文字列が見つかったときに、その文字列全体をセル N1 にコピーします。2 番目の文字列は「」で始まります。 AT" は N2 にコピーされ、列 A がなくなるまで繰り返されます。これはこれまでのところ私の弱い試みですが、あまり運がありません。

Function Find_AT(ByVal I As Integer)

Dim c As Range
Dim COUNTER As Integer
Dim CAPTURE As Long

    COUNTER = 0

    For Each c In Range("A1", Range("A65636").End(xlUp))
        If Left(c, 2) = AT Then
            COUNTER = COUNTER + 1
            If COUNTER = I Then
            CAPTURE = c
            Exit For
            End If
        End If
        Next c
Find_AT = CAPTURE

End Function
4

3 に答える 3

0

コードのエラーは、テキスト (文字列) AT を二重引用符 "AT" で囲む必要があることです。モジュールの先頭に追加Option Explicitすると、関数をコンパイルまたは実行しようとすると、このエラーが発生します。

ただし、あなたの説明を考えると、関数ではなくサブプロシージャ (SUB) を書きたいと思うかもしれません。関数は値を返すことを目的としています。関数を使用する場合は、次のように定義できます。

Function Find_AT(rng As Range, ByVal i As Integer)

つまり、Range検索するには a を指定し、「AT」で始まる範囲内の最初の値を見つけるには数値 1 を指定します。ただし、この関数をセルに入れてコピーしても、最初に出現したものだけが返されます。1 を 2、3 などに手動で変更する必要があります (または、ROW() のバリエーションを使用してこのシーケンスを自動的に生成します)。

とにかく、ワークシートのボタンをクリックして実行できる SUB プロシージャが本当に必要なのではないかと思います。

現在の関数を続行したい場合は、戻り値の型を文字列として宣言できます。

Function Find_AT(ByVal i As Integer) As String
'...
Dim CAPTURE As String
'...
    CAPTURE = c.Text

それ以外の場合、c はオブジェクトであるため、この値を設定CAPTURE = cして返そうとすると問題が発生します。Range

于 2013-06-27T22:55:31.767 に答える
0

フィルタリングははるかに効率的です。以下の2つのアプローチ:

フィルター

Sub GetAT1()
X = Filter(Application.Transpose(Range([a1], Cells(Rows.Count, "A").End(xlUp))), "AT", True)
If UBound(X) > 0 Then [n1].Resize(UBound(X) + 1) = Application.Transpose(X)
End Sub

オートフィルター

Sub GetAT()
Dim rng1 As Range
Set rng1 = Range([a1], Cells(Rows.Count, "A").End(xlUp))

Application.ScreenUpdating = False
ActiveSheet.AutoFilterMode = False
rng1.AutoFilter 1, "=AT*"
rng1.Copy [n1]
If LCase$(Left$([n1], 2)) <> "at" Then [n1].Delete xlUp

ActiveSheet.AutoFilterMode = False
Application.ScreenUpdating = True
End Sub
于 2013-06-28T02:27:49.553 に答える
0

検討:

Function Find_AT(ByVal I As Long) As String
    Dim c As Range
    Dim COUNTER As Long
    Dim CAPTURE As String
    Dim v As String
    COUNTER = 0
    CAPTURE = "xx"
    For Each c In Range("A1", Range("A65636").End(xlUp))
        v = c.Text & "  "
        If Left(v, 2) = "AT" Then
            COUNTER = COUNTER + 1
            If COUNTER = I Then
                CAPTURE = c.Address
                Exit For
            End If
        End If
    Next c
    Find_AT = CAPTURE
End Function
于 2013-06-27T23:07:35.860 に答える