2016-06-27 3 views
0

Я некоторое время работаю над этой функцией и не могу заставить ее работать, и я не смог найти какие-либо должности, которые помогли решить мою конкретную проблему.переменные в функции поиска vba

То, что я пытаюсь выполнить, - это найти даты, которые могут быть в любом столбце A: G из Sheet4, используя значение Date, которое является одной ячейкой слева от моей активной ячейки в Sheet9.

Этот код является тем, что у меня до сих пор работало, когда у меня были статические значения, такие как (1/1/16) в моем поиске, но теперь не работает, когда я пытаюсь использовать переменную. На второй строке моего с выражением, которое у меня только что было. Выберите, когда у меня были статические термины поиска, и это сработало, но как только я добавил переменную, я получил ошибку «Object variable или With Block not Set», поэтому я добавил ActiveCell перед это, но теперь это просто заставляет выбирать любую ячейку, в которой находится мой курсор. Любая помощь по этому поводу будет очень признательна.

Sub test() 

Dim rFoundCell As Range 
Dim vDate As Variant 
Dim Expense As Worksheet 
Dim Data As Worksheet 

Set Expense = Sheet9 
Set Data = Sheet4 
Set rFoundCell = Range("A1") 
Set vDate = ActiveCell.Offset(0, -1) 


     Set rFoundCell = Data.Range("A:G").find(What:=vDate, After:=rFoundCell, _ 
      LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ 
      SearchDirection:=xlNext, MatchCase:=False) 

     Sheet4.Activate 

     With rFoundCell 
      ActiveCell.Select 
      ActiveCell.Offset(1, 0).Copy 
      Sheets("Expense Data").Select 
      Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True 
      ActiveCell.Offset(1, 0).Select 
     End With 
+1

Какой тип 'vDate'? Если он работал со строковым литеральным вводом, попробовал ли вы объявить его как «Строка» вместо «Как вариант»? Также вам нужно обработать случай, когда 'rFoundCell' является' Nothing' - блок 'With' взорвется с ошибкой времени выполнения 91. @cyboashu плохой совет, вы не' Set' a * value *, вы 'Set' * ссылка на объект *. –

+0

согласился. не испытал на моем конце. Комментарий удален! – cyboashu

ответ

1
Set vDate = ActiveCell.Offset(0, -1) 

Потому что вы объявили vDate As Variant, это Set инструкция присвоить ссылку на объект указывающий на Range объекта.

Объявить его с фактическим типом данных, падение Set заявление и назначить его значение вместо:

Dim vDate As String 
vDate = ActiveCell.Offset(0, -1).Value 

Set rFoundCell = Data.Range("A:G").Find(...) 
If rFoundCell Is Nothing Then 
    Debug.Print "Not Found!" 
    Exit Sub 
End If 

'rFoundCell cannot be Nothing if we're here 
With rFoundCell 
    .Select 
    '... 
End With 

так я добавил ActiveCell перед ним, но сейчас просто делает это выбрать то, что клетка мой курсор оказывается в

Ну, вот что делает ActiveCell. Избегайте использования .Select и .Activate и ссылайтесь на ActiveSheet и ActiveCell, по крайней мере, неявно.

Set rFoundCell = Range("A1") 

Range Этот вызов неявно со ссылкой на активном листе.

Set Expense = Sheet9 
Set Data = Sheet4 

Вы должны переименовать Sheet9 в Expense и Sheet4 к Data вместо того, чтобы придумывать новые ссылки на объекты, чтобы держать копии этих ссылок. Выберите лист в Проводнике проекта, нажмите F4 и измените свойство (name) на что-то значимое.

Смежные вопросы