4

私のサブは文字列の 2 つのリストを比較し、最も近い一致を返します。サブが「the」や「facility」などの一般的な単語につまずくことがわかりました。除外する単語の配列を指定して、これらの単語の各文字列をチェックし、見つかった場合は除外する関数を作成したいと思います。

入力例を次に示します。

|aNames        |  bNames        | words to exclude
|thehillcrest  |oceanview health| the
|oceanview, the|hillCrest       | health

意図した出力:

|aResults     |bResuts
|hillcrest    |hillcrest
|oceanview    |oceanview

これまでのところ、私は持っています:

Dim ub as Integer
Dim excludeWords() As String

'First grab the words to be excluded
If sheet.Cells(2, 7).Value <> "" Then
  For y = 2 To sheet.Range("G:G").End(xlDown).Row
    ub = UBound(excludeWords) + 1             'I'm getting a subscript out of range error here..?
    ReDim Preserve excludeWords(0 To ub)
    excludeWords(ub) = sheet.Cells(y, 7).Value
  Next y
End If

次に、二重ループを使用する比較関数は、列 A の各文字列を列 B と比較します。比較の前に、列 a と b の値は、これらの単語を除外するかどうかをチェックする関数を通過します。除外する単語がない可能性があるため、パラメーターはオプションにする必要があります。

Public Function normalizeString(s As String, ParamArray a() As Variant)
  if a(0) then           'How can I check?
    for i = 0 to UBound(a)
      s = Replace(s, a(i))
    next i
  end if
  normalizeString = Trim(LCase(s))
End Function

おそらく、このコードには機能しない部分がいくつかあります。私を正しい方向に向けることができますか?

ありがとうございました!

4

2 に答える 2

6

リストを配列に保存するには、これを行うことができます

Sub Sample()
    Dim excludeWords As Variant
    Dim lRow As Long

    With Sheet1 '<~~ Change this to the relevant sheet
        '~~> Get last row in Col G
        lRow = .Range("G" & .Rows.Count).End(xlUp).Row

        excludeWords = .Range("G2:G" & lRow).Value

        'Debug.Print UBound(excludeWords)

        'For i = LBound(excludeWords) To UBound(excludeWords)
            'Debug.Print excludeWords(i, 1)
        'Next i
    End With
End Sub

次に、配列を関数に渡します。上記の配列は 2D 配列であるため、それに応じて処理する必要があります (上記のコードのコメント セクションを参照してください) 。

また、上記のコメントで述べたように

はどうoceanview, theなるのOceanview?あなたは置き換えることができますtheが、それはあなたにoceanview,(カンマに注意してください)とないOceanview.

これらの特殊文字をシートの Col G に渡す必要がある場合や、ループを使用して関数でそれらを処理することができます。そのためには、ASCII 文字を使用する必要があります。これを見てください

コメントからのフォローアップ

これは私が簡単に書いたものなので、広範囲にテストされていません。これはあなたが探しているものですか?

Sub Sample()
    Dim excludeWords As Variant
    Dim lRow As Long

    With Sheet1
        lRow = .Range("G" & .Rows.Count).End(xlUp).Row

        excludeWords = .Range("G2:G" & lRow).Value

        '~~> My column G has the word "habilitation" and "this"
        Debug.Print normalizeString("This is rehabilitation", excludeWords)

        '~~> Output is "is rehabilitation"
    End With
End Sub

Public Function normalizeString(s As String, a As Variant) As String
    Dim i As Long, j As Long
    Dim tmpAr As Variant

    If InStr(1, s, " ") Then
        tmpAr = Split(s, " ")

        For i = LBound(a) To UBound(a)
            For j = LBound(tmpAr) To UBound(tmpAr)
                If LCase(Trim(tmpAr(j))) = LCase(Trim(a(i, 1))) Then tmpAr(j) = ""
            Next j
        Next i
        s = Join(tmpAr, " ")
    Else
        For i = LBound(a) To UBound(a)
            If LCase(Trim(s)) = LCase(Trim(a(i, 1))) Then
                s = ""
                Exit For
            End If
        Next i
    End If

    normalizeString = Trim(LCase(s))
End Function
于 2014-11-06T21:28:37.870 に答える
5

まず、サイズがまだない配列に対してUBound関数を呼び出すことはできません。

Dim excludeWords() As String

ub = UBound(excludeWords) + 1  'there is no size yet

不要な単語の一部を削除するには、置換機能を使用します

String1 = Replace(String1, "the", "")

あなたが説明した比較を行うには、Like関数を使用します。ここにドキュメントがあります。 http://msdn.microsoft.com/pl-pl/library/swf8kaxw.aspx

于 2014-11-06T21:27:34.123 に答える