2016-10-13 7 views
1

Excel sheetのデータをarrayに格納しようとしています。 enter image description hereExcel VBA Application.Matchエラー処理とメッセージング

私が使用するコード:

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は、上記のように見えるとき、すべてが完璧に動作 データは次のようになります。

ただし、列の順序と数は、sheet1で毎回異なる場合があります。たとえば、Name Age NationalityまたはName License Hand Sex Age NationalityまたはNationality Ageなどです。この表は人によって入力されるため、変数を含むことを忘れる可能性があります。

任意の列は、私は以下のerrorを取得欠落している場合: enter image description here

私はにしたいのですがどのようにこのエラーの代わりに欠けている列の名前とmessage/message boxを示すことです。欠落している列がいくつかある場合は、すべての欠落している名前をメッセージしたいと思います。

エラーを無効にすることは、画面にメッセージが配信されないため解決策ではありません。どんな解決策ですか?ここで

+1

それははるかに簡単ではないでしょうにちょうど '薄暗いデータとしてVariant'してから設定し'データ=ワークシート( "Sheet1")。範囲( "A1")。CurrentRegion'? – Ralph

+0

配列内の変数の存在を修正する必要があります。また、これは列方向の不足についてユーザーにどのようにメッセージするかという問題を解決しません – AK47

答えて

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 

は、より多くの情報のためのコード内のコメントをチェックしてください。また、確実にするために、コードの先頭にOption Compare Textの重要性を注意してAge = age = aGeなど