2016-06-14 7 views
1

ための正規表現私はブールある機能を持っており、それは、次の文字を保有している場合、その値またはそのない(に基づいて新規フォルダを作成するためのOKセルであるかどうかを返します:<、>、 |、\、* ,?)新しいフォルダの文字のためのVBAのExcelマクロ

しかし、いくつかの奇妙な理由から、それは常にfalseを返し、どちらかOKかどうかの細胞です。 だから、私はすべての行のループを作成し、いくつかの.txtファイルを作成し、自動生成されたフォルダに入れますサブを持っています。ここで

は私のコードです:

Sub CreateTxtSrb() 
Dim iRow As Long 
Dim iFile As Integer 
Dim sPath As String 
Dim sFile As String 
Dim iEnd As Range 
'iEnd = Cells(Rows.Count, "B").End(xlUp).Row 
For iRow = 1 To Cells(Rows.Count, "B").End(xlUp).Row 
    iFile = FreeFile 
With Rows(iRow) 
    If IsValidFolderName(.Range("B2").Value) = False Or IsValidFolderName(.Range("D2").Value) = False Or IsValidFolderName(.Range("F2").Value) = False Then 
     MsgBox ("Check columns B,D or F, it cannot contains chars: <,>,?,|,\,/,*,. or a space at the end") 
     Exit Sub 
    Else 
    strShort = IIf(InStr(.Range("E2").Value, vbCrLf), Left(.Range("E2").Value, InStr(.Range("E2").Value, vbCrLf) - 2), .Range("E2").Value) 
     sPath = "E:\" & .Range("B2").Value & "\" 
     If Len(Dir(sPath, vbDirectory)) = 0 Then MkDir sPath 
     sFile = .Range("D2").Value & ".txt" 
     Open sPath & sFile For Output As #iFile 
     Print #iFile, .Range("E2").Value 
     Close #iFile 
    End If 
End With 
Next iRow 
End Sub 

Function IsValidFolderName(ByVal sFolderName As String) As Boolean 
'http://msdn.microsoft.com/en- us/library/windows/desktop/aa365247(v=vs.85).aspx#file_and_directory_names 
'http://msdn.microsoft.com/en-us/library/ie/ms974570.aspx 
On Error GoTo Error_Handler 
Dim oRegEx   As Object 

'Check to see if any illegal characters have been used 
Set oRegEx = CreateObject("vbscript.regexp") 
oRegEx.Pattern = "[&lt;&gt;:""/\\\|\?\*]" 
IsValidFolderName = Not oRegEx.test(sFolderName) 
'Ensure the folder name does end with a . or a blank space 
If Right(sFolderName, 1) = "." Then IsValidFolderName = False 
If Right(sFolderName, 1) = " " Then IsValidFolderName = False 

Error_Handler_Exit: 
On Error Resume Next 
Set oRegEx = Nothing 
Exit Function 

Error_Handler: 
MsgBox ("test") 
' MsgBox "The following error has occurred" &amp; vbCrLf &amp; vbCrLf &amp; _ 
'   "Error Number: " &amp; Err.Number &amp; vbCrLf &amp; vbCrLf &amp; _ 
'   "Error Source: IsInvalidFolderName" &amp; vbCrLf &amp; _ 
'   "Error Description: " &amp; Err.Description, _ 
'   vbCritical, "An Error has Occurred!" 
Resume Error_Handler_Exit 
End Function 

は、どのように私は必要であれば、それは真を返すことができますか?

答えて

1

はあなたが単にできる外部リファレンスを必要としません。

は(あなたの例では、HTMLエンティティ(例えば&lt;)を持っている - これらは、あなたの正規表現文字列には意味がありませんし、クラスの4つの文字として解釈されている)

+0

おかげでアレックス、あなたのソリューションは、よりエレガントです。私は「好き」という方法を実現しませんでした。毎日新しいこと。 :) – Stefan0309

1

混乱です。別の機能を使用してください。

Public Function IsInvalid(ByVal name As String) As Boolean 
    Dim regex As Object 
    Set regex = VBA.CreateObject("VBScript.RegExp") 
    regex.Pattern = "[\\/:\*\?""<>\|]" 'the disallowed characters 
    IsInvalid = (regex.Execute(name).Count > 0) 
End Function 

代わりに、必要に応じて呼び出してください。

hasInvalidChars = sFolderName like "*[<>|\/:*?""]*" 

私も違法で":を追加しました:

関連する問題