2016-12-05 12 views
0

У меня есть этот код ниже, где Set x не работает. Что странно, как Set f. Я понятия не имею, почему, я нахожусь в середине моего кода, и это просто не работает. Это то же самое, что и Set f в моей точке зрения. Любые идеи почему?Требуемый объект vba

Sub Macro2() 

Dim WsOuput As Worksheet 
Dim WsScenarios As Worksheet 
Dim ScenarioIDrow As Long 
Dim ScenarioIDColumn As Long 
Dim ScenarioIDinScenarios As Long 
Dim ScenarioIDinScenariosC As Long 
Dim p As String 
Dim q As String 
Dim x As Range 
Dim z As String 
Dim r As String 
Dim RgnScenarioOutput As Range 
Dim RgnScenarioScenario As Range 
Dim Findsomething As Range 
Dim FindAgain As Range 
Dim lLastRow As Long 
Dim f As Range 
Dim fAgainAddress As Range 

Set WsOutput = Worksheets("Output") 
Set WsScenarios = Worksheets("Scenarios.New") 
lLastRow = WsOutput.Cells(Rows.Count, "B").End(xlUp).Row 
r = WsOutput.Cells(lLastRow, 2).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
Range("B22").Select 
    Selection.Copy 
    Sheets("Scenarios.New").Select 
    Columns("A:A").Select 

    Set f = Selection.Find(What:=Worksheets("Output").Range("B22").Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False) 

    f.Select 
    q = f.Address 
    Set x = Cells.FindNext(After:=ActiveCell).Activate 
    x.Select 
    z = x.Address 

    Range("F21:M21").Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Output").Select 
    Range("AFI35").Select 
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ 
     False, Transpose:=True 
End Sub 
+3

Является 'Cells.FindNext (After: = ActiveCell) .Activate' возвращение объекта? –

+0

Является ли 'FindNext.Activate' правильным синтаксисом? – Chrismas007

+0

Возможно, вы должны переписать все это, не прибегая к '.Select' и' .Activate' –

ответ

5

Как Эндрю Чонг (и Chrismas007) прокомментировал, ваша проблема с вашим Activate методом.

Команда Range.Activate не возвращает объект (он просто активирует что-то), поэтому Set не может быть Range.Activate.

Вы, вероятно, хотите изменить:

Set x = Cells.FindNext(After:=ActiveCell).Activate 

к:

Set x = Cells.FindNext(After:=ActiveCell) 
If Not x Is Nothing Then x.Activate 
+0

Не любите мой комментарий к синтаксису? :-P – Chrismas007

+0

@ Chrismas007 - В свою защиту я начал набирать ответ, прежде чем вы отправили свой комментарий - я поправлю свой ответ, чтобы дать вам кредит;) – YowE3K

+0

@ Mat'sMug - Я доволен сделанным вами изменением , но, строго говоря, не требуется «поддерживать оригинальную функциональность» - исходная функциональность была бы достигнута в любом случае с помощью оператора 'x.Select', который следует за оператором' Set'. – YowE3K

2

вы можете использовать этот

Dim x As Range 
Dim f As Range 
Set f = Selection.Find(What:=Worksheets("Output").Range("B22").Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False) 

    f.Select 
    q = f.Address 
    Set x = Range("A:A").FindNext(f) 
    x.Select 
+0

Это сработало отлично. Благодаря! –

+1

@LeandroMoreira отмечает, что 'x.Select' будет поднимать ошибку времени выполнения 91, если' FindNext' ничего не находит. Другой ответ решает эту проблему. –

+0

Убедитесь, что вы правильно обрабатываете его, когда x возвращает null/Nothing. Как упоминалось http://stackoverflow.com/users/1188513/mats-mug, вы можете столкнуться с ошибкой 91. – PankajKushwaha

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