1

スプレッドシートの特定の 1 列幅の範囲で、Excel 2007 VBA のrange.findメソッドを使用して、2 文字の長さの値を含むテキスト値のセルを見つける必要があります: 8" (米国ではエイト インチと発音)。.findメソッドは次のとおりです。実行中の他のすべての検索で正常に機能するサブでは、8 "、または実際には末尾に二重引用符が付いたテキスト値を見つけることができないようです.

以下のコードでは、最初sComparisonTextに含まれています8"

sComparisonTextを使用して の末尾に 1 ~ 6 個の二重引用符を追加しようとしましChr(34)たが、.find メソッドはまだ Nothing を返します。

さまざまな検索でChr(34)アプローチが指摘されており、二重引用符を積み重ねています: """"resolves to """""""resolves to""など。特殊なエスケープ文字を持つメソッドも調べました.findが、そこでも成功しませんでした。

If Right(sComparisonText, 1) = """" Then
    sComparisonText = sComparisonText & Chr(34) & Chr(34) & Chr(34) & Chr(34) & Chr(34) & Chr(34)
End If
Set rResult = rCT.Columns(InputColumn).Find(What:=sComparisonText, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If (rResult Is Nothing) Then  'Add a new row to the bottom of the rCT range

誰かが私が間違っていることを教えてもらえますか?

どうもありがとうございました!デイブ

4

3 に答える 3

1

最初に考慮すべきことは、xlWholeではなくxlPartを使用することです。

2 番目のことは、単一引用符のペアではなく二重引用符が本当にあることを確認することです。悪意のあるセルをクリックして実行します。

Sub WhatIsInThere()
    Dim st As String, msg As String
    Dim i As Long, CH As String

    st = ActiveCell.Text
    msg = Len(st)
    For i = 1 To Len(st)
        CH = Mid(st, i, 1)
        msg = msg & vbCrLf & CH & vbTab & Asc(CH)
    Next i
    MsgBox msg
End Sub

トレイルの二重引用符で何かを見つける例を見るには、空のワークシートから始めて実行します。

Sub EightInchNails()
    Dim DQ As String, WhereIsIt As Range
    DQ = Chr(34)
    Range("A15").Value = "8" & DQ

    Set WhereIsIt = Range("A:A").Find(what:="8" & DQ, after:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart)

    If WhereIsIt Is Nothing Then
    Else
        MsgBox WhereIsIt.Address(0, 0)
    End If
End Sub
于 2015-05-05T19:57:01.160 に答える
1

文字列リテラルではないものをエスケープしようとしている理由は明らかではありません。文字列リテラルで二重引用符をエスケープする必要があるのは、コンパイラがそれを解析できるようにするためです。シングルのみを探している場合、.Find関数はシングルのみを期待します。文字列に含まれる変数に文字列が既に格納されている場合は、それを使用します。文字列に追加する必要がある場合は、またはエスケープされた文字列リテラルを使用できます。結果として得られる文字列はまったく同じです。"""Chr$(34)""""

Dim sComparisonText As String
Dim rResult As Range

sComparisonText = 8 & Chr$(34) 
Set rResult = ActiveSheet.Cells.Find(What:=sComparisonText, LookIn:=xlValues, _
              LookAt:=xlWhole, SearchOrder:=xlByColumns, _
              SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
Debug.Print rResult.Address

...と同じです...

sComparisonText = "8"""
Set rResult = ActiveSheet.Cells.Find(What:=sComparisonText, LookIn:=xlValues, _
              LookAt:=xlWhole, SearchOrder:=xlByColumns, _
              SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
Debug.Print rResult.Address

...と同じです...

sComparisonText = 8 & """"

...等。

エスケープ シーケンスは、コンパイラの外では意味がありません。

于 2015-05-05T23:17:25.560 に答える
0
range.find "8""" 

トリックを行う必要があります。末尾の最初の 2 つの引用符は実際の"文字をエスケープし、3 番目の引用符は文字列を終了します。

于 2015-05-05T19:51:32.810 に答える