2013-04-18 10 views
5

Próbuję skopiować zawartość pola tekstowego z jednego workbook do innego. Nie mam problemu z kopiowaniem wartości komórek z pierwszego workbook na 2., ale pojawia się błąd object required podczas próby skopiowania pola tekstowego. Ta macro jest uruchamiana ze skoroszytu zawierającego dane, które chcę skopiować. Korzystanie z Excel 2007 Kod:Błąd wykonania programu Excel VBA '424': Obiekt wymagany podczas próby kopiowania TextBox

Sub UploadData() 
    Dim xlo As New Excel.Application 
    Dim xlw As New Excel.Workbook 
    Set xlw = xlo.Workbooks.Open("c:\myworkbook.xlsx") 
    xlo.Worksheets(1).Cells(2, 1) = Range("d4").Value 'Copy cell content (this works fine) 
    xlo.Worksheets(1).Cells(2, 2) = TextBox1.Text 'This gives me the object required error 
    xlw.Save 
    xlw.Close 
    Set xlo = Nothing 
    Set xlw = Nothing 
End Sub 

Dzięki za pomoc.

+0

Próbowano przy pełnym Application.ActiveWorkbook.ActiveSheet.TextBox1? Czy możesz sprawdzić, czy ActiveWorkbook/ActiveSheet nie jest xlw? W takim przypadku wystarczy ustawić obiekt dla aktywnego dokumentu przed otwarciem kolejnego. – dnLL

+0

wypróbuj tę właściwość '... = activesheet.TextBox1.Object.value' lub' .Text' na końcu też powinna działać –

+0

Otrzymuję "obiekt nie obsługuje tej właściwości lub metody" z żadnym z twoich rozwiązań dnLL & KazJaw –

Odpowiedz

4

Problem z makro jest, że po otwarciu cel skoroszyt (xlw w próbce kodu), jest on ustawiony jako ActiveWorkbook obiektu i pojawi się błąd, ponieważ TextBox1 nie istnieje w tym konkretnym Skoroszycie. Aby rozwiązać ten problem, można zdefiniować obiekt odniesienia do rzeczywistego skoroszyt przed otwarciem drugiego.

Sub UploadData() 
    Dim xlo As New Excel.Application 
    Dim xlw As New Excel.Workbook 
    Dim myWb as Excel.Workbook 

    Set myWb = ActiveWorkbook 
    Set xlw = xlo.Workbooks.Open("c:\myworkbook.xlsx") 
    xlo.Worksheets(1).Cells(2, 1) = myWb.ActiveSheet.Range("d4").Value 
    xlo.Worksheets(1).Cells(2, 2) = myWb.ActiveSheet.TextBox1.Text 

    xlw.Save 
    xlw.Close 
    Set xlo = Nothing 
    Set xlw = Nothing 
End Sub 

Jeśli wolisz, możesz też użyć myWb.Activate umieścić z powrotem swoją główną skoroszytu jako aktywny. Będzie również działać, jeśli zrobisz to za pomocą obiektu Arkusz. Korzystanie z jednego lub więcej zależy głównie od tego, co chcesz zrobić (jeśli istnieje wiele arkuszy itp.).

1

Myślę, że powodem takiego stanu rzeczy może być to, że TextBox1 ma zasięg do modułu VBA i skojarzonego z nim arkusza, podczas gdy zakres obejmuje zakres "aktywnego arkusza".

EDIT

Wygląda na to może być w stanie korzystać z funkcji GetObject wyciągnąć tekstowe ze skoroszytu.

+0

Każdy pomysł, w jaki sposób mogę zakres textbox1 do aktywnego arkusza? Nie wierzę, że mogę używać ActiveSheet.TextBox1 –

+0

To powinno być opublikowane jako komentarz, a nie jako odpowiedź. – dnLL

+0

@dnLL Dlaczego? To odpowiedź, a nie komentarz czy pytanie. Nie jest tak dokładny jak twoja odpowiedź, ale jest odpowiedzią [z definicji] (http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer). –

0

Problem jest z tej linii

xlo.Worksheets(1).Cells(2, 2) = TextBox1.Text 

Masz tekstowe zdefiniowane w jakimś innym miejscu, które nie są tutaj używany. Program Excel nie może znaleźć obiektu textbox w bieżącym arkuszu, podczas gdy ten tekst jest zdefiniowany w xlw.

Stąd zastąpić ten z

xlo.Worksheets(1).Cells(2, 2) = worksheets("xlw").TextBox1.Text 
Powiązane problemy