2013-07-18 21 views
6

Próbuję przenieść niektóre dane z jednego skoroszytu do drugiego, przypisując wartości z jednego zakresu do drugiego. Kiedy używam składni Normalny zakres, aby określić zakres docelowy (Zakres ("A1: B2")) mój kod działa, ale jeśli spróbuję użyć składni Zakres, Komórki (Zakres (Komórki (1,1), Komórki (2 , 2))) mój kod nie działa.Dlaczego zasięg działa, ale nie komórki?

Uaktywniam skoroszyt docelowy (ActiveWorkbook) i uruchamiam kod w skoroszycie źródłowym (ThisWorkbook).

Ten kod działa:

ActiveWorkbook.Worksheets(1).Range("A1:B2").Value _ 
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value 

ale ten kod nie działa:

ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value _ 
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value 

Błąd pojawia się błąd czasu wykonywania „1004”: Applicaton zdefiniowane lub przedmiot zdefiniowane błąd.

Czy ktoś wie, dlaczego korzystanie z obiektu komórki powoduje problemy, lub jeśli jest jakiś inny problem, którego nie jestem świadomy?

Odpowiedz

21

Problem polega na tym, że Cells jest niekwalifikowany, co oznacza, że ​​arkusz, do którego odnoszą się te komórki, różni się w zależności od tego, gdzie znajduje się Twój kod. Za każdym razem dzwonić Range lub Cells lub Rows lub UsedRange ani niczego, która zwraca obiekt Range, a nie określić arkusz jest na arkusz zostaje przydzielony według:

  • w module klasy arkusz jest: że arkusz niezależnie od tego, co jest aktywne
  • W każdym innym modułem: the ActiveSheet

można zakwalifikować odniesienie Range, ale odniesienie Cells jest bez zastrzeżeń i jest prawdopodobne, wskazując na Activesheet. To tak, jakby pisać coś, co oczywiście nie ma sensu, chyba że ThisWorkbook.Worksheets (1) stanie się aktywny. Często lubię używać bloku Z, aby upewnić się, że wszystko jest w pełni kwalifikowane.

With Sheets(1) 
    .Range(.Cells(1,1), .Cells(2,2)).Value = "something" 
End With 

Ale odnoszą się do dwóch różnych arkuszy, dzięki czemu będziemy lepiej wyłączyć za pomocą krótkich arkuszy zmienne jak:

Dim shSource As Worksheet 
Dim shDest As Worksheet 

Set shSource = ThisWorkbook.Worksheets(1) 
Set shDest = Workbooks("myBook").Worksheets(1) 

shDest.Range(shDest.Cells(1, 1), shDest.Cells(2, 2)).Value = _ 
    shSource.Range(shSource.Cells(1, 1), shSource.Cells(2, 2)).Value 

Ale tak naprawdę, jeśli masz zamiar zakodować na Cells argumenty, ty można to wyczyścić tak, jak

shDest.Cells(1, 1).Resize(2, 2).Value = shSource.Cells(1, 1).Resize(2, 2).Value 
+4

Ta odpowiedź jest właściwa i powinna zostać oznaczona jako tak. – dnLL

+0

nie trzeba kwalifikować zakresu w instrukcji 'shDest.Range (shDest.Cells (1, 1), shDest.Cells (2, 2)). Wartość = _ shSource.Range (shSource.Cells (1, 1) , shSource.Cells (2, 2)). Wartość 'this is correct 'Range (shDest.Cells (1, 1), shDest.Cells (2, 2)) Wartość = _ Range (shSource.Cells (1 , 1), shSource.Cells (2, 2)). Wartość " – h2so4