2013-04-16 2 views
0

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

У меня есть 2 книги. Один содержит список полей для копирования в другой. Пока все выглядит очень просто, но когда я пытаюсь назначить имя листа переменной, он не сохраняет его, поэтому я не могу вернуть этот лист позже.

Я дам вам пример

Function getActiveWBName() 
    getActiveWBName = ActiveWorkbook.NAME 
End Function 

Dim homeWB 

Sub pull_data() 
    Set homeWB = Workbooks(getActiveWBName) 
    homeWB.Activate 
    Call Update_List 
End Sub 

Sub Update_List() 
    Workbooks.Open Filename:=FullFilePath, UpdateLinks:=3 

    Sheets("List").Activate 
    Cells.Select 
    Selection.Copy 
    ActiveWorkbook.Close 

    homeWB.Activate 
    Sheets("List").Activate 
    Range("A1").Select 
    Selection.Paste 
End Sub 

После того, как к homeWB.activate в sub Update_List она возвращает runtime error 424 - Object required.

Что я делаю неправильно?

Я хотел бы сохранить функцию, которая возвращает имя активного листа.

Может ли кто-нибудь помочь мне в этом?

ответ

1

Вам не обязательно идти по этой дороге :) Я не знаю, на каком сайте вы ссылались, но вам следует избегать использования .Select и .Activate. См this

Ваш код может быть переписана в виде (Change, как это применимо)

Sub Sample() 
    Dim wbInput As Workbook, wbOutput As Workbook 
    Dim wsInput As Worksheet, wsOutput As Worksheet 

    '~~> From where you want to copy 
    Set wbInput = ThisWorkbook 
    '~~> This is the sheet which has the fields you want to copy 
    Set wsInput = wbInput.Sheets("List") 

    '~~> Destination workbook 
    Set wbOutput = Workbooks.Open("C:\Sample.xlsx") 
    '~~> Destination sheet 
    Set wsOutput = wbOutput.Sheets("List") 

    '~~> Copy the relevant range 
    wsInput.Range("A1:A10").Copy wsOutput.Range("A1") 
End Sub 
0

Вы получаете в Required ошибку объекта, поскольку homeWB не объявлен в качестве публичной переменной, а также не прошло, чтобы Update_List подпрограмма.

Вы можете исправить это, передавая переменную homeWB в Update_List подпрограммой:

Sub pull_data() 
Set homeWB = Workbooks(getActiveWBName) 
homeWB.Activate 
Call Update_List(homeWB) 

End Sub 

Sub Update_List(homeWB as Workbook) 
Workbooks.Open Filename:=FullFilePath, UpdateLinks:=3 

Sheets("List").Activate 
Cells.Select 
Selection.Copy 
ActiveWorkbook.Close 

homeWB.Activate 
Sheets("List").Activate 
Range("A1").Select 
Selection.Paste 
End Sub 

Однако я хотел бы прислушаться к совету Siddhart разгромить в выше, в отношении использования Activate и Select которых следует избегать 99% время.

+0

ДомашнийWB должен быть общедоступным? – Santosh

+0

Если вы передаете переменную явно в качестве требуемого аргумента для функции «Update_List», нет. Если вы предпочитаете не передавать значение переменной между подпрограммами, то да, вы должны объявить как общедоступную переменную. –

+0

Не пытайтесь объявить публичным и посмотреть, есть ли у вас какие-либо ошибки. – Santosh

0

Попробуйте ввести код.

Dim homeWB As Workbook 
Const FullFilePath = "C:\Users\Santosh\Desktop\ssss.xlsx" ' specify your path here 

Sub pull_data() 
    Set homeWB = ThisWorkbook 
    Call Update_List 
End Sub 

Sub Update_List() 

    Dim wkb As Workbook 
    Set wkb = Workbooks.Open(Filename:=FullFilePath, UpdateLinks:=xlUpdateLinksAlways) 
    wkb.Sheets("List").Cells.Copy homeWB.Sheets("List").Range("A1") 

    wkb.Close 
End Sub 
+0

Сантош. Это второй раз, когда вы отправили ответ, похожий на мой :) –

+0

Я уверен, что этот пост также будет удален. Удачи мне – Santosh

+0

Никто не удаляет это сообщение :) Просто хотел сказать вам, что нет смысла публиковать один и тот же ответ (или его вариант);) –

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