Excel VBA Application.Matcherror handling和消息传递

我试图将数据从Excel sheet存储到array 。 数据如下所示: 在这里输入图像说明

我使用的代码是:

 Sub StoreData() Dim Data() As String 'Count number of Line in Sheet1 Sheet1_size = Worksheets("Sheet1").Range("A1").CurrentRegion.Rows.Count 'Array to store data ReDim Data(1 To Sheet1_size - 1, 1 To 6) As String 'storing data into array For i = 1 To Sheet1_size - 1 With Worksheets("Sheet1") Data(i, 1) = .Cells(i + 1, Application.Match("Name", .Rows(1), 0)) Data(i, 2) = .Cells(i + 1, Application.Match("Sex", .Rows(1), 0)) Data(i, 3) = .Cells(i + 1, Application.Match("Age", .Rows(1), 0)) Data(i, 4) = .Cells(i + 1, Application.Match("Nationality", .Rows(1), 0)) Data(i, 5) = .Cells(i + 1, Application.Match("License", .Rows(1), 0)) Data(i, 6) = .Cells(i + 1, Application.Match("Hand", .Rows(1), 0)) End With Next i End Sub 

sheet1看起来像上面时,一切正常。

但是,每张表的顺序和列数可能不同。 例如,它可能是: Name Age NationalityName License Hand Sex Age NationalityNationality Age等。此表由人填写,所以他们可能忘记包含一些变数。

如果有任何列丢失,我得到一个error如下: 在这里输入图像说明

我想要的是显示message/message box的名称列是缺less的,而不是这个错误。 如果有几个缺失的列,我想给所有缺less的名字留言。

禁用错误不是解决scheme,因为在屏幕上没有消息传递。 任何解决scheme

这是我build议的解决scheme:

 Option Explicit Option Compare Text Public Sub StoreData() Dim ws As Worksheet Dim Data As Variant Dim LastRow As Long, LastColumn As Long Dim nColumn As Long, RequirementCount As Long, CheckCount As Long Dim RequirementList() As String, ErrorMessage As String 'Determine the range Set ws = ThisWorkbook.Worksheets("Sheet1") LastRow = ws.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row LastColumn = ws.Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row 'Range to array Data = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastColumn)).Value2 'Set requirements RequirementList = Split("Name|Nationality|Age|License|Hand|Sex", "|") 'Compare all available columns against the requirements For nColumn = 1 To UBound(Data, 2) For RequirementCount = LBound(RequirementList) To UBound(RequirementList) If Data(1, nColumn) = RequirementList(RequirementCount) Then RequirementList(RequirementCount) = vbNullString CheckCount = CheckCount + 1 End If Next RequirementCount Next nColumn 'If less then the required 6 columns were found then pass a message box to the user telling him/her about it If CheckCount <> 6 Then ErrorMessage = "The following columns are missing:" & Chr(10) For RequirementCount = LBound(RequirementList) To UBound(RequirementList) ErrorMessage = ErrorMessage & IIf(RequirementList(RequirementCount) = vbNullString, "", " -" & RequirementList(RequirementCount) & Chr(10)) Next RequirementCount MsgBox ErrorMessage Else MsgBox "All columns are accounted for and ready for import." End If End Sub 

查看代码中的注释以获取更多信息。 另外,请注意代码顶部的Option Compare Text的重要性,以确保Age = age = aGe等。