2012-09-24 41 views
1

我想驗證用戶使用下面的代碼上傳的文件。錯誤處理程序檢查上傳文件的首行中是否有三個特定的列名。如果一個或多個列名不存在,程序應該向用戶返回一個提示,通知他們上傳的文件中缺少哪些列,然後關閉該文件。Excel VBA:錯誤處理與案件陳述

有幾個問題,我目前的VBA代碼,我尋求幫助與:

  1. 提示並不指定哪些列(或多個)缺少給用戶。
  2. 即使所有必需的列都存在於上載的文件中,錯誤處理程序也會被觸發。

代碼:

Sub getworkbook() 
' Get workbook... 
    Dim ws As Worksheet 
    Dim filter As String 
    Dim targetWorkbook As Workbook, wb As Workbook 
    Dim Ret As Variant 

    Set targetWorkbook = Application.ActiveWorkbook 

    ' get the customer workbook 
    filter = ".xlsx,.xls" 
    caption = "Please select an input file " 
    Ret = Application.GetOpenFilename(filter, , caption) 

    If Ret = False Then Exit Sub 

    Set wb = Workbooks.Open(Ret) 

On Error GoTo ErrorLine: 

'Check for columns 
var1 = ActiveSheet.Range("1:1").Find("variable1", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 
var2 = ActiveSheet.Range("1:1").Find("variable2", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 
var3 = ActiveSheet.Range("1:1").Find("variable3", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 

ErrorLine: MsgBox ("The selected file is missing a key data column, please upload a correctly formated file.") 
If Error = True Then ActiveWorkSheet.Close 

wb.Sheets(1).Move Before:=targetWorkbook.Sheets("Worksheet2") 
    ActiveSheet.Name = "DATA" 

End Sub 
+0

什麼這不是一個很好用的情況下,使用錯誤處理:缺少列標題可以檢測和排序的是「預期」(至少在某些情況下)。對於發生意外事件的情況(例如無法找到或打開文件),您應該保留錯誤處理。斯科特的答案顯示了一個更好的方法來處理你的情況。 –

回答

-1

你必須明確地結束小組處理,如果內容時發生任何錯誤,把一個Exit Sub聲明只是ErrorLine塊聲明之前。它應該解決不希望的觸發問題。

3

這個AME怎麼樣?應該做你想做的一切,並提醒用戶哪些數據列丟失。另外,不需要GoTo陳述。只是一個簡單的If Then Else

Sub getworkbook() 
' Get workbook... 
    Dim ws As Worksheet 
    Dim filter As String 
    Dim targetWorkbook As Workbook, wb As Workbook 
    Dim Ret As Variant 

    Set targetWorkbook = Application.ActiveWorkbook 

    ' get the customer workbook 
    filter = ".xlsx,.xls" 
    Caption = "Please select an input file " 
    Ret = Application.GetOpenFilename(filter, , Caption) 

    If Ret = False Then Exit Sub 

    Set wb = Workbooks.Open(Ret) 

    'Check for columns 
    Dim var1 As Range, var2 As Range, var3 As Range 
    Set var1 = ActiveSheet.Range("1:1").Find("variable1", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 
    Set var2 = ActiveSheet.Range("1:1").Find("variable2", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 
    Set var3 = ActiveSheet.Range("1:1").Find("variable3", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Column 

    If Not var1 Is Nothing Or Not var2 Is Nothing Or Not var3 Is Nothing Then 

     wb.Sheets(1).Move Before:=targetWorkbook.Sheets("Worksheet2") 
     ActiveSheet.Name = "DATA" 

    Else 

     MsgBox "The selected file is missing the following key data column(s): " & _ 
     vbNewLine & _ 
     vbNewLine & _ 
     IIf(var1 Is Nothing, "variable1", "") & _ 
     IIf(var2 Is Nothing, "variable2", "") & _ 
     IIf(var3 Is Nothing, "variable3", "") & _ 
     vbNewLine & _ 
     "Please upload a correctly formated file." 

     ActiveWorkbook.Close False 

    End If 

End Sub 
+1

斯科特 - 是Msgbox線是否正確?它只會顯示找到的列名... –

+0

當程序進入Var1時,出現錯誤。 「對象變量或塊變量未設置」。這個變量是否應該定義爲一個範圍? – AME

+0

我必須修復消息框代碼。掛在那裏,我現在正在做。這應該可以解決你的問題。 –

0

看,如果這是你想要

Sub getworkbook() 
    ' Get workbook... 
    Dim ws As Worksheet 
    Dim filter As String 
    Dim targetWorkbook As Workbook, wb As Workbook 
    Dim Ret As Variant 

    Set targetWorkbook = Application.ActiveWorkbook 

    ' get the customer workbook 
    filter = ".xlsx,.xls" 
    Caption = "Please select an input file " 
    Ret = Application.GetOpenFilename(filter, , Caption) 

    If Ret = False Then Exit Sub 

    Set wb = Workbooks.Open(Ret) 



'Check the headers in first row 
Dim width As Long 
Dim var1 As Long, var2 As Long, var3 As Long 
With ActiveSheet 
    width = .Cells(1, .Columns.Count).End(xlToLeft).Column ' getting the non-empty columns from right to left scanning 
    ' var1,2,3 will store the column number contains variable1,2,3 
    var1 = -1 
    var2 = -1 
    var3 = -1 
    For j = 1 To width 
     If .Cells(1, j).Value = "variable1" Then 
      var1 = j 
     ElseIf .Cells(1, j).Value = "variable2" Then 
      var2 = j 
     ElseIf .Cells(1, j).Value = "variable3" Then 
      var3 = j 
     End If 
    Next j 


    If var1 = -1 Then 
     MsgBox "variable1 not found" 
    End If 
    If var2 = -1 Then 
     MsgBox "variable2 not found" 
    End If 
    If var3 = -1 Then 
     MsgBox "variable3 not found" 
    End If 
End With 


wb.Sheets(1).Move Before:=targetWorkbook.Sheets("Worksheet2") 
    ActiveSheet.Name = "DATA" 

End Sub