2014-01-30 1 views
2

Я новичок в Excel и VBA и StackOverflow.Получение определённой или определяемой объектом ошибки

Я бег Excel версии 2007

Я провел весь день над этой проблемой, и я исчерпал мое терпение. При попытке выполнить простой VLOOKUP я продолжаю получать «Определенную приложением или объектную ошибку». Я тестирую этот пример кода, чтобы перейти к моей более крупной проблеме:

Мне нужна кнопка Command, расположенная в Sheet1, которая будет иметь код VBA для выполнения поиска таблицы на основе значения ячейки в Sheet1. Таблица определена в Листе2. Поиск (VLOOKUP, я предполагаю), должен будет искать имя и отправлять обратно данные, содержащие, например, «Зарплата». Затем эта информация о зарплате вставляется в другую ячейку на Листе 1. Затем пользователь может обновить этот показатель зарплаты. Другая кнопка Command вернет ее обратно в таблицу (обновить запись в таблице).

Возможно ли это? Однако я не могу получить простой код для отображения окна сообщения через VLOOKUP (см. Ниже).

Вот мой Лист1: A1: 4

Dave 
John 
Sara 
Steve 

Вот мой Лист2, который определяется как Table1 (A2: B6)

Name Salary 
Dave 2500 
John 3500 
Sara 4000 
Steve 4500 

Вот мой VBA код: (обратите внимание на комментарии на severy "пытается")

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 получает название от Лист1 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 считывает имя из Лист1 A1 и зарплаты от sheet1 A2 и пытается обновить значение заработной платы в Table1 на sheet2

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

Спасибо вам большое. Этот код именно то, что мне нужно! Я не могу тебя отблагодарить! Я не мог найти твое имя на этом посту. Хотел бы я разобраться с этим кодом самостоятельно. В основном я получаю решения для вырезания и вставки и google. Я люблю VBA и мне нужно немного тренироваться. – user3255090

+0

Добро пожаловать :) в качестве рекомендации прочитайте эту [удивительную книгу] (http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470475358.html) :) –