Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA应用程序。匹配错误处理和消息传递_Vba_Excel_Error Handling_Match - Fatal编程技术网

Excel VBA应用程序。匹配错误处理和消息传递

Excel VBA应用程序。匹配错误处理和消息传递,vba,excel,error-handling,match,Vba,Excel,Error Handling,Match,我正在尝试将Excel工作表中的数据存储到数组中。 数据如下所示: 我使用的代码是: 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)

我正在尝试将Excel
工作表中的数据存储到
数组中。
数据如下所示:

我使用的代码是:

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
如上图所示时,一切都能正常工作

但是,在
表1中,每次列的顺序和数量可能会有所不同。例如:
姓名年龄国籍
姓名执照手性别年龄国籍
国籍年龄
等。此表由人填写,因此他们可能会忘记包含一些变量

如果缺少任何列,我会在下面得到一个
错误

我想显示的是
消息/消息框
,其中列名缺失,而不是此错误。如果有几个缺少的列,我希望将所有缺少的名称都发送给您


禁用错误不是解决方案,因为屏幕上没有传递消息。有什么解决办法吗

以下是我建议的解决方案:

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
选项显式
选项比较文本
公共子存储数据()
将ws设置为工作表
作为变量的Dim数据
将LastRow变长,LastColumn变长
Dim N列长度为,RequirementCount长度为,CheckCount长度为
Dim RequirementList()作为字符串,ErrorMessage作为字符串
"确定范围,
设置ws=ThisWorkbook.Worksheets(“Sheet1”)
LastRow=ws.Cells.Find(What:=“*”,LookIn:=xlFormulas,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlPrevious)。行
LastColumn=ws.Cells.Find(What:=“*”,LookIn:=xlFormulas,LookAt:=xlPart,SearchOrder:=xlByColumns,SearchDirection:=xlPrevious)。行
'范围到阵列
Data=ws.Range(ws.Cells(1,1),ws.Cells(LastRow,LastColumn)).Value2
"定要求",
需求列表=拆分(“姓名|国籍|年龄|执照|手|性别”、“|”)
'将所有可用列与要求进行比较
对于nColumn=1到UBound(数据,2)
对于RequirementCount=LBound(RequirementList)到UBound(RequirementList)
如果数据(1,n列)=需求列表(需求计数),则
RequirementList(RequirementCount)=vbNullString
CheckCount=CheckCount+1
如果结束
下一个需求计数
下一列
'如果找到的列少于所需的6列,则向用户传递一个消息框,告诉他/她这方面的信息
如果支票计数为6,则
ErrorMessage=“缺少以下列:”&Chr(10)
对于RequirementCount=LBound(RequirementList)到UBound(RequirementList)
ErrorMessage=ErrorMessage&IIf(RequirementList(RequirementCount)=vbNullString、“,”-“&RequirementList(RequirementCount)&Chr(10))
下一个需求计数
MsgBox错误消息
其他的
MsgBox“所有列都已记帐并准备好导入。”
如果结束
端接头

有关更多信息,请查看代码中的注释。另外,请注意代码顶部的
选项比较文本的重要性,以确保
年龄
年龄
年龄
年龄
年龄
年龄
等等。

将数据作为变量
进行模糊处理,然后设置
数据=工作表(“表1”)。范围(“A1”)不是更容易吗.CurrentRegion
?数组中变量的位置必须固定。此外,这并不能解决如何向用户发送缺少列的消息的问题