функция instr в VBA - PullRequest
       25

функция instr в VBA

0 голосов
/ 16 июня 2011

Пожалуйста, помогите, нужна ваша помощь, пожалуйста,

Описание:

Я разработал код VBA, в котором я хочу сравнить строку с FileName в каталоге. В этом случае я использовал функцию Instr, это помогает мне только в 3 случаях, но не динамически.

Explaination:

если str = 4567 и сравнивать с именем файла, где имя файла может быть:
1.xs1234567.pdf
2.4567.pdf
3,4567 (1) .pdf * * 1016 4. обновлено 4567 (2) .pdf

поэтому созданный мною код помогает найти все файлы, но это не правильно. Он должен исключать имя первого файла, т.е.: xs1234567.pdf

Это следующий код:

Dirfname = finDir
fName = Mid((Dirfname), 1, (InStr(1, (Dirfname), ".") - 1))
fileExt = Mid((Dirfname), (InStr(1, (Dirfname), ".") + 1), 3)


**If (InStr(1, fName, wkvalue) > 0 And wkvalue <> "") Then ** 'checking lookup val in instr
        If (Trim(UCase(fileExt)) = "PDF" Or Trim(UCase(fileExt)) = "TIF") Then
                                Cells(recnum, 2).Value = "Yes"
                                'col = col + 1
                                ws.Hyperlinks.Add Anchor:=Cells(recnum, (col + 1)), _
                                Address:=SourceFolderName & "\" & Dirfname
                                col = col + 1
                                'Else: Cells(recnum, 2).Value = "No"
        End If
  End If

Пожалуйста, посоветуйте, что можно сделать для этого случая.

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Вы можете использовать регулярные выражения, чтобы помочь вам. Я еще не очень разбираюсь в этом, но это относительно простой случай. Вот функция, адаптированная из tmehta.com / regexp , которую вы можете использовать в сочетании с итерацией имен файлов в папке:

Function RegExpFind(FindIn, FindWhat As String, _
                    Optional IgnoreCase As Boolean = False) As Variant

    Dim i As Long
    Dim rslt() As String

    '// Using Late Binding here, use the commented types if you've added
    '// the "Microsoft VBScript Regular Expressions" reference
    Dim RE As Object 'RegExp
    Dim allMatches As Object 'MatchCollection
    Dim aMatch As Object 'Match

    '// Use "Set RE = New RegExp" if using the VBScript reference        
    Set RE = CreateObject("vbscript.regexp")

    RE.Pattern = FindWhat
    RE.IgnoreCase = IgnoreCase
    RE.Global = True
    Set allMatches = RE.Execute(FindIn)

    '// check if we've found anything, if not return a single element array
    '// containing an empty string. If we've found something return at least 
    '// at least a single element array containing the matched expressions
    If allMatches.Count = 0 Then
        ReDim rslt(0 To 0)
        rslt(0) = ""
    Else
        ReDim rslt(0 To allMatches.Count - 1)
        For i = 0 To allMatches.Count - 1
            rslt(i) = allMatches(i).Value
        Next i
    End If

    RegExpFind = rslt

End Function

Вам потребуется передать имя файла в качестве параметра FindIn и шаблон регулярного выражения "^4567" в параметре FindWhat. Использование этого способа вернет 4567 (как первый элемент в возвращаемом массиве), только если это произойдет в начале строки поиска. Эта функция может быть легко переработана для использования с другими поисками в будущем, если вам нужно.

1 голос
/ 16 июня 2011

Вы не описываете , почему первое имя файла должно быть отклонено, но я предполагаю, что это потому, что оно имеет цифру (0-9) до и / или после wkvalue, например, "4567"не весь номер.В таком случае это будет работать:

    charBefore = ""
    charAfter = ""
    pos = InStr(fName(i), wkvalue)
    If pos = 1 Then
        ' It's at the beginning of the filename.
        ' Get character after the number.
        charAfter = Mid(fName(i), pos + Len(wkvalue), 1)
    ElseIf pos > 1 Then
        ' It's not at the beginning of the filename
        ' Get characters before and after the number.
        charBefore = Mid(fName(i), pos - 1, 1)
        charAfter = Mid(fName(i), pos + Len(wkvalue), 1)
    Else
        ' Number not found.
    End If
    ' Could add another ElseIf to check if it's at the end of the filename.

    If pos > 0 And wkvalue <> "" _
        And Not charBefore Like "#" And Not charAfter Like "#" Then
            ' Number found and not preceded or followed by a digit (0-9).
            ' Do your thing.
    End If
1 голос
/ 16 июня 2011

Предполагая, что ваш критерий совпадения состоит в том, что символ, предшествующий 4567, если он есть, является пробелом

i = InStr(1, fName, wkvalue)
if i > 0 and wkvalue <> "" Then
    ch = " "
    if i > 1 then
        ch = mid(fName, i - 1, 1)
    end if
    if ch = " " then 
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...