3

リストの特定の単語 (または数字) が特定の文字列に含まれているかどうかを確認しようとしています。

たとえば、「2012 年 1 月 20 日と 2011 年 1 月 20 日」というフレーズがあります。
そして、月が文に含まれているかどうかを確認しようとしていますが、月がある限り、文にどの月が含まれていても問題ありません。(したがって、「2012 年 2 月 20 日と 2011 年 2 月 20 日」も通過します)

私は次のようなことを考えていました:

Sub Run_Find()
Dim Month As String, Number, Year, Splitmonth As Variant
Dim ii As Integer

Month = "January, February, March, April, May, June, July, August, September, October, November, December"
Number = "1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 28, 29, 30, 31"
Year = "2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015"

Splitmonth = VBA.Split(Month, ",")
For ii = 0 To 12
    If VBA.InStr(1, "January 30, 2012 and 2011", Splitmonth(ii)) > 0 Then
        MsgBox "Found it!"
    Else
        MsgBox "Nop!"
    End If
Next ii

End Sub

これは機能します。しかし、代替手段はありますか?リストを調べて、リスト内の単語のいずれかが文字列に存在する場合、合格する必要があります。

最終的にIf、月、And日(数字)、And年などが含まれていることを確認しようとしていThenます..
この方法を使用すると、「複雑になりすぎる」ようです。

前もってありがとう、R

4

2 に答える 2

6

ここでは正規表現が役立つ場合があります。正規表現は幅広いトピック ( ) ですが、質問の内容に沿った例をいくつか示します。

Public Sub example1()
  Dim re As Object
  Set re = CreateObject("vbscript.regexp")
  re.Pattern = "January|February|March|April|May|June|July|August|September|November|December"
  If re.test("January 30, 2012 and 2011") Then
      Debug.Print "match found"
  End If
End Sub

'=> match found

Public Sub example2()
  Dim re As Object
  Dim matches As Object, match As Object, submatch

  Set re = CreateObject("vbscript.regexp")
  re.Pattern = "(January|February|March|April|May|June|July|August|September|November|December) (\d+), (\d{4})"
  Set matches = re.Execute("January 30, 2012 and 2011")
  For Each match In matches
    Debug.Print "match: " & match
    Debug.Print "submatches: ",
    For Each submatch In match.submatches
        Debug.Print submatch,
    Next
    Debug.Print ""
  Next
End Sub

'=> match: January 30, 2012
'=> submatches:   January       30            2012          
于 2013-02-28T18:35:07.847 に答える
2

正規表現よりも優れているわけではありませんが、フィルター関数を使用する別の方法があります

Sub Run_Find()

    Dim sMonth As String
    Dim vaMonth As Variant
    Dim vaDate As Variant
    Dim i As Long

    sMonth = "January, February, March, April, May, June, July, August, September, October, November, December"

    vaMonth = Split(sMonth, "," & Space(1))
    vaDate = Split("July 30, 2012 and 2011", Space(1))

    For i = LBound(vaMonth) To UBound(vaMonth)
        If UBound(Filter(vaDate, vaMonth(i))) >= 0 Then
            Debug.Print vaMonth(i)
            Exit For
        End If
    Next i

End Sub
于 2013-02-28T21:59:17.823 に答える