2014-01-30 38 views
2

我是新来的Excel/VBA和StackOverflow。获取应用程序定义或对象定义的错误

我运行Excel版本2007

我花了一整天在这个问题上,我已经用尽了我的耐心。尝试执行简单的VLOOKUP时,我总是收到“应用程序定义或对象定义的错误”。我正在测试此示例代码以解决我的更大问题:

我需要位于Sheet1中的命令按钮,该按钮将具有基于Sheet1中的单元格值执行表查找的VBA代码。该表在Sheet2中定义。查找(我假设的VLOOKUP)将需要查找名称并发回包含例如“薪水”的数据。然后将此工资信息插入到Sheet1上的另一个单元格中。用户然后可以更新这个薪水数字。另一个命令按钮会将其导出回表格(更新表格条目)。

这可能吗?但是,我无法通过简单代码通过VLOOKUP显示消息框(参见下文)。

这是我的工作表Sheet:A1:4

Dave 
John 
Sara 
Steve 

这是我的Sheet 2中其被定义为表1(A2:B6)

Name Salary 
Dave 2500 
John 3500 
Sara 4000 
Steve 4500 

这是我的VBA代码:(注意评论在尝试“尝试”)

Sub FINDSAL() 

Dim E_name As String 
Dim Res As Variant 

'On Error Resume Next 
'Err.Clear 

'ThisWorkbook.Sheets("Sheet2").Activate 
'ActiveSheet.Range("A1:B5").Select 

E_name = "John" 

'Res = Application.WorksheetFunction.VLookup(E_name, Sheet1.Range("A2:B5"), 3, False) 
Res = Application.WorksheetFunction.VLookup(E_name, Table1, 2, False) 


MsgBox "Salary is: $" & Res 

End Sub 
+0

将'Option Explicit'添加到代码的顶部。你会立即发现你的错误。 – enderland

回答

0

试试这个代码。

FINDSAL获取名称从工作表Sheet1 A1(你可以很容易地改变它),发现在Sheet2的范围Table1的工资和薪水,如果发现 - 在Sheet1 A2写入。

Sub FINDSAL() 

    Dim E_name As String 
    Dim Res As Variant 
    Dim sh1 As Worksheet, sh2 As Worksheet 

    Set sh1 = ThisWorkbook.Worksheets("Sheet1") 
    Set sh2 = ThisWorkbook.Worksheets("Sheet2") 

    E_name = sh1.Range("A1") 

    Res = Application.VLookup(E_name, sh2.Range("Table1"), 2, False) 

    If Not IsError(Res) Then 
     MsgBox "Salary is: $" & Res 
     sh1.Range("A2") = Res 
    Else 
     MsgBox "Nothing found" 
    End If 

End Sub 

下一步,updateSalary从工作表Sheet1 A1和工资从工作表Sheet1 A2读取名称,并试图在Table1 Sheet 2上

Sub updateSalary() 
    Dim E_name As String 
    Dim newSalary As Variant 
    Dim rnd As Range 
    Dim sh1 As Worksheet, sh2 As Worksheet 

    Set sh1 = ThisWorkbook.Worksheets("Sheet1") 
    Set sh2 = ThisWorkbook.Worksheets("Sheet2") 

    With sh1 
     E_name = .Range("A1") 
     newSalary = .Range("A2") 
    End With 


    Set Rng = sh2.Range("Table1").Find(What:=E_name, LookAt:=xlWhole) 

    If Not Rng Is Nothing Then 
     Rng.Offset(, 1) = newSalary 
     MsgBox "Salaty updated" 
    Else 
     MsgBox "Can't find " & E_name & " in table" 
    End If 
End Sub 

该代码更新的薪水值假定所有名称是唯一的。

+1

非常感谢你。这段代码正是我所需要的!我不知道该怎么感谢你才足够!我无法在帖子中找到你的名字。我希望自己能够想出这些代码。我主要通过剪贴和谷歌解决方案。我喜欢VBA,需要接受一些培训。 – user3255090

+0

欢迎您:)作为推荐,请阅读[真棒书](http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470475358.html):) –

相关问题