2015-03-02 4 views
0

Я пишу макрос vba, чтобы позволить мне ссылаться на данные на листе и суммировать некоторые данные, а не использовать тонну формул для этого.Ссылка на рабочие листы для рисования данных

У меня возникли трудности со ссылками на листы и вернулись к активационным листам. Я не уверен, что делаю неправильно. Например:

 Sheets("Rainfall").Activate 
    Set x = Range(Range("C2"), Range("C2").End(xlDown)) 

, а не

 Set x = Sheets("Rainfall").Range(Range("C2"), Range("C2").End(xlDown)) 

При попытке ссылки на код, такой как

 Cells(2 + j, 3) = Application.WorksheetFunction.VLookup(Cells(2 + j, 2), Worksheets("Raw Data").Range(Range("C4"), Range("H4").End(xlDown)), 6, False) 

я получаю ошибку 1004. Ниже приведен мой код, и если у кого-то есть предложения по упрощению кода, который также будет отличным.

Sub selectall() 
    Dim x, y As Range 
    Dim nv, rd As Long 
    Set Wkb = Workbooks("DWH Calculations V1.xlsm") 
    Sheets("Rainfall").Activate 
    Set x = Range(Range("C2"), Range("C2").End(xlDown)) 
    nv = x.Rows.Count 
    'MsgBox (nv) 
    Sheets("Raw Data").Activate 
    Set y = Range(Range("E4"), Range("E4").End(xlDown)) 
    rd = y.Rows.Count 
    'MsgBox (rd) 

    MinD = Round(Application.WorksheetFunction.Min(y), 0) 
    MaxD = Round(Application.WorksheetFunction.Max(y), 0) 
    Ndays = MaxD - MinD 
    'MsgBox (Ndays) 

    Sheets("Rainfall").Activate 
    Cells(2, 2) = MinD 

    For j = 1 To Ndays - 1 
    Cells(2 + j, 2) = Cells(1 + j, 2) + 1 
    Cells(2 + j, 3) = Application.WorksheetFunction.VLookup(Cells(2 + j, 2), Worksheets("Raw Data").Range(Range("C4"), Range("H4").End(xlDown)), 6, False) 
    Next j 

    End Sub 

Спасибо всем за вашу помощь

ответ

1

Это было предложено много раз, прежде чем - вы должны квалифицироваться все на Range вызовы с объектом рабочего листа, так:

Set x = Sheets("Rainfall").Range(Sheets("Rainfall").Range("C2"), Sheets("Rainfall").Range("C2").End(xlDown)) 

или использовать With...End With блок:

With Sheets("Rainfall") 
Set x = .Range(.Range("C2"), .Range("C2").End(xlDown)) 
End With 

и обратите внимание на периоды до всех трех вызовов Range. Вы также можете использовать переменную рабочего листа:

Dim ws as Worksheet 
Set ws = Sheets("Rainfall") 
Set x = ws.Range(ws.Range("C2"), ws.Range("C2").End(xlDown)) 
+0

Спасибо Рори, что имеет смысл сейчас. – Tree

0

Проблема заключается в том диапазоне, в пределах диапазона:

заменить:

Set x = Range(Range("C2"), Range("C2").End(xlDown)) 

с:

With Sheets("Rainfall") 
     Set x = .Range(.Range("C2"), .Range("C2").End(xlDown)) 
End With 

ctivate не требуется Установить диапазонов.

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