Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 9248 Skopiuj do schowka import wartości z innego pliku
Autor Wiadomość
Bajka
[Usunięty]

Wysłany: 06-10-2008, 08:38   import wartości z innego pliku

Witam,
zanim zacznę opisywać mój problem może zapytam ( byc może tu już się już rozwiąże)
jaka jaka prawidłowa metoda aby przerzucić dane ( wartości) z jednego pliku do drugiego :
np. taka metoda

Kod:
Set plik = ActiveWorkbook
innyplik = "C:\plik.xls"
     Workbooks.Open innyplik
For Each v In Range("K1:K20")
l = plik.Sheets(2).Cells(65536, "C").End(xlUp).Row + 1
If v <> 0 Then

'przerzucanie danych
plik.Sheets(2).Cells(l, "D").Value = v.Value


no własnie: jak powienien wyglądac ostatni wers
zależy mi aby sciągać wartości (bez formatowania) z komórek 'innegopliku"

pozdrawiam
Bajka
ID posta: 47876 Skopiuj do schowka
 
 
Tajan


Pomógł: 4969 razy
Posty: 10897
Wysłany: 06-10-2008, 09:28   

Spróbuj tak:
Kod:
Set plik = ActiveWorkbook

l = plik.Sheets(2).Cells(65536, "C").End(xlUp).Row

innyplik = "C:\plik.xls"

With Workbooks.Open(innyplik)
  For Each v In .Sheets(1).Range("K1:K20")
      If v.Value <> 0 Then
        'przerzucanie danych
        l = l + 1
        plik.Sheets(2).Cells(l, "D").Value = v.Value
      End If
  Next
  .Close False
End With
ID posta: 47881 Skopiuj do schowka
 
 
Bajka
[Usunięty]

Wysłany: 06-10-2008, 09:45   

no właśnie...
operując po obu stronach ".Value" - wrzucamy wartości do pliku wynikowego
ale, kiedy makro natrafia na wartość 0,01 ( będącą wynikiem formuły typu = (adres komórki)
pojawia się błąd 424 - Object required.
co ciekawe kiedy zdejmę właściwość ".Value" (muszę po obydwu stronach )to kod wykonuje się dalej
testowałem ten na innych wartościach ( myśląc że boli go wartość 0,01) ale jest dokładnie to samo

Rozumiem że Twój kod nie zawiera jakichś magicznych zmian i wyraża dokładnie to samo
tyle że jest profesjonalnie dopracowany :-) ?
ID posta: 47886 Skopiuj do schowka
 
 
Tajan


Pomógł: 4969 razy
Posty: 10897
Wysłany: 06-10-2008, 09:50   

Dziwne rzeczy piszesz. :-) Mógbyś sporządzić mały przykład i wrzucić na forum? "Value" to wartośc komórki, zatem nie ma znaczenia, czy będzie to 0,1, czy inna liczba. Kod błędu raczej nie wskazuje na to, aby miało to coś wspólnego z wartością komórki.
ID posta: 47887 Skopiuj do schowka
 
 
Bajka
[Usunięty]

Wysłany: 06-10-2008, 10:56   

powiem szczerze , też sie nie mogę nadziwić ...

przyk.zip
Pobierz Plik ściągnięto 123 raz(y) 11.33 KB

ID posta: 47891 Skopiuj do schowka
 
 
Tajan


Pomógł: 4969 razy
Posty: 10897
Wysłany: 06-10-2008, 11:10   

Twój kod jest błędny!
Kod:
t = Range("K1").Value

w powyższej linii przypisujesz do zmiennej "t" wartość komórki, więc nie możesz w nastepnej linii:
Kod:
If t.Value <> 0 Then

odwoływać sie do tej zmiennej jak do obiektu komórki, gdyż nie jest ona obiektem.
Poprawnie byłoby gdyby pierwszą linię zamienić na:
Kod:
 Set t = Range("K1")

gdyż wtedy do zmiennej "t" zostanie przypisane odwołanie do komórki.
ID posta: 47893 Skopiuj do schowka
 
 
Bajka
[Usunięty]

Wysłany: 06-10-2008, 12:33   

No to chyba mamy winowajcę :))

Czy to oznacza że KAŻDĄ zmienną musimy przypisać poprzez "Set"
w powyższym przykładzie użyłem kilkanaście takich "prostych" przypisań
np. v = Range("A1") , ale użyte też są w pętli np.

For Each v In Range("K36:K40")
If v <> 0 Then
lastRow =plik.Sheets(2).Cells(65536, "C").End(xlUp).Row + 1
If v < 0 Then ... itd..
ale ten mój niewdzięczny przypadek dotyczył przypadku v = Range("K1").Value

czy to oznacza że teraz zawsze powinienem używać "Set" ,
czy da się jakoś ustalić kiedy zadziała bez "Set" a kiedy się wywali ( tak jak w tym przypadku?)
ID posta: 47907 Skopiuj do schowka
 
 
Tajan


Pomógł: 4969 razy
Posty: 10897
Wysłany: 06-10-2008, 13:02   

Hmm.... Jak by tu powiedzieć :-) Piszący program musi wiedzieć, kiedy będzie korzystał ze zmiennej obiektowej, a kiedy z jej wartości. Przecież program nie "wywalał" się przypadkowo, lecz na skutek błędu programistycznego :-)
Zatem, jeżeli będziesz pobierał wartość ze zmiennej za pomocą Value, to musi być ona przypisana przez Set, natomiast, gdy od razu chcesz tę wartość mieć w zmiennej, to Set nie używasz.
Przy czym, należy pamiętać, że takie przypisanie:
Kod:
v = Range("A1")

zawsze oznacza pobranie wartości i jest równoznaczne z:
Kod:
v = Range("A1").Value

Natomiast w przypadku pętli:
Kod:
For Each v In Sheets(1).Range("K1:K20")

do zmiennej v kolejno przypisywane sa komórki z obszaru K1:K2, więc do ich wartości należy odwoływać się przez v.Value.
Natomiast, gdy pętlę skonstruujemy tak:
Kod:
For Each v In Sheets(1).Range("K1:K20").Value

to do zmiennej v będą przypisywane wartości komórek z danego obszaru i tym samym odwołanie v.Value zwróci błąd.
ID posta: 47909 Skopiuj do schowka
 
 
Bajka
[Usunięty]

Wysłany: 06-10-2008, 13:14   

... czyli sama kwintesencja :-)

seredeczne dzięki - jak zwykle cenna lekcja !!

pozdrawiam
Bajka
ID posta: 47910 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe