我正在寫一個宏並且宏能正常工作,但我正在嘗試向它添加一些錯誤處理,以便其他人正在使用它併發生錯誤,因此他們能夠弄清楚發生了什麼。我遇到的最後一個問題是我使用Application.GetOpenFilename
以multiselect = True打開多個文件。我正在使用正則表達式來匹配文件名,如果選擇了錯誤的文件名,則會顯示一條錯誤消息。如果multiselect = False,那麼我沒有得到任何錯誤,但是當它等於True時,我得到一個Type Mismatch錯誤。我只能假設這是因爲當mutliselect = True時,該文件是正則表達式無法處理的數組。有沒有解決這個問題的方法,或者任何人都可以指出一個更好的解決方案來處理錯誤。我也附加了VBA腳本。在數組上使用VBA正則表達式
Sub DataImport_Loop()
Dim nom As String
Dim wb As Excel.Workbook
Dim i, j, k, m, n, file As Variant
Dim strPattern As String: strPattern = "Strain End Point [0-9] - FEA Loop - Loading - (Timed)" 'File Pattern
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
'Turns Screen Updating and Alert Displays off
Application.ScreenUpdating = False
Application.DisplayAlerts = False
nom = ActiveWorkbook.Name
'takes user straight into necessary folder
If CurDir() <> CurDir("J:") Then
ChDrive "J:"
ChDir "J:FEA Material Data"
End If
'Number of specimens tested
For i = 1 To 5
'Allows user to select multiple files to open
file = Application.GetOpenFilename(_
FileFilter:="Text Files (*.csv), *.csv", _
MultiSelect:=True)
'If no file selected, stop data import and display error message
If Not IsArray(file) Then
MsgBox ("You only imported " & (i - 1) & " Specimens.")
Exit Sub
'Sets patteren to check if correct file
With regex
.Pattern = strPattern
End With
'Checks set pattern, displays error message if not correct file
If regex.Test(file) = False Then
MsgBox ("Select Loading Only")
Exit Sub
End If
Else
Counter = 1
While Counter <= UBound(file)
j = (2 * i) - 1
Workbooks.Open file(Counter)
Set wb = Workbooks("Strain End Point " & Counter & " - FEA Loop - Loading - (Timed).csv")
'End of column, needs + 3 to account for first 3 unused cells
k = Range("F4", Range("F4").End(xlDown)).Count + 3
'Loops through data, deletes negative values
For m = 4 To k
If Range("F" & m).value < 0 Or Range("F" & m).Offset(0, 1) < 0 Then
Range("F" & m).Delete
Range("F" & m).Offset(0, 1).Delete
'If cell is deleted, rechecks new value
m = m - 1
End If
Next m
Range("F4:G" & k).Copy
Workbooks(nom).Sheets(Counter + 1).Cells(4, j).PasteSpecial
wb.Close
'Opens next file
Counter = Counter + 1
Wend
End If
Next i
'Turns Screen Updating and Alert Displays back on
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
如果文件是一個數組,則需要通過每個元件進行迭代。但是,當你可以簡單地使用'Like'運算符來完成這樣的事情時,爲什麼還要用正則表達式。由於'File'將始終是一個數組(當'MultiSelect'爲'True'時,即使只選擇了一個文件,您也將始終需要迭代元素。 –
我同意上面關於如何處理'file 'array。另外,它看起來像你的代碼不會實現你想要的,如果用戶點擊取消按鈕,'If Not IsArray(file)Then'後面的代碼將執行 - 你的MsgBox顯示出來然後你'Exit Sub'。正則表達式代碼從不執行,好像正則表達式代碼塊應該遵循'Else'語句,並且我認爲使用'For'循環代替'While Counter'會更好的代碼風格'loop。 – xidgel