napisał: Trebor postów: 1209
umieszczony: 3 stycznia 2014 12:39
|
|
Zacznijmy od Twojego kodu:
Uwaga ogólna - aby coś zrobić nie trzeba obiektu docelowego zaznaczać czy aktywować. Linie te to przeważnie pozostałość po rejestrowaniu czynności, które wykonujemy. Nie jest to powodem niedziałania, ale powoduje wielokrotne miganie ekranu. Można użyć polecenia Application.ScreenUpdating = False, które ukryje przeskakiwanie na ekranie. Jednak bardziej procesjonalnie jest wyeliminować polecenia typu select, activate. To co według mnie jest niewłaściwe w Twoim kodzie to Application.CutCopyMode = False, w ten sposób nie umieszczasz w schowku to co chciałeś kopiować. Bez tego wiersza Twój kod powinien działać poprawnie, chociaż tego nie testowałem i nie powodować błędu w linii wklejania ActiveSheet.Paste
Ciekawa jest linia Workbooks("KK_User.xls").Saved = True. Linia oszukuje podając informację do systemu o zapisaniu zmian w pliku, chociaż faktycznie tak nie musiało być. Przy zamykaniu pliku nie będzie pytań o zapis zmian. W moim kodzie odpowiada za to linia: Workbooks("KK_User.xls").Close savechanges:=False zamykając plik bez zachowania zmian.
Jedyną linią wartą uwagi w moim kodzie jest Application.EnableEvents = False, która wyłącza zdarzenia np. WorkbookOpen uruchamiane wraz ze startem skoroszytu, a więc nie pozwala na automatyczne uruchomienie UserForma. Należy pamiętać, aby stan wstrzymania zdarzeń na końcu procedury przywrócić do stanu działania.
Czy jakaś linia jest jeszcze dla Ciebie niejasna? |
|
napisał: wywyż postów: 7
umieszczony: 2 stycznia 2014 22:20
|
|
Działa!!!
Super, bardzo dziękuję.
Kolejny raz ekspresem i skutecznie.
A czy w wolnej chwili mógłbym prosić o wyjaśnienie dlaczego moje makro nie działało i jak mój cel został osiągnięty? |
|
napisał: Trebor postów: 1209
umieszczony: 2 stycznia 2014 16:29
|
|
Spróbuj poniższym kodem:
Sub Makro1()
Application.EnableEvents = False
Workbooks.Open Filename:=ThisWorkbook.Path & "\KK_User.xls" 'ReadOnly:=True
Workbooks("KK_User.xls").Worksheets("KK").Range("C4:BE369").Copy Workbooks("Admin.xls").Worksheets("KK_User").Range("C4")
Workbooks("KK_User.xls").Close savechanges:=False
Application.EnableEvents = True
Call kolor
End Sub
Daj znać jak działa.
Jeśli wolisz Twój kod to troszkę będziemy musieli go zmienić. |
|
napisał: wywyż postów: 7
umieszczony: 2 stycznia 2014 11:57
|
|
Dzień dobry!
Borykam się z podobnym problemem. Też od dłuższego czasu nie potrafię sobie z tym poradzić. Co gorsza raz działa, a raz nie! Tzn. U mnie za którymś razem wywołania makra wyskakuje błąd związany z procedurą Paste w Worksheets. U innych użytkowników błąd jest cały czas i za każdym razem wywołania się pojawia.
Co chciałem osiągnąć pisząc to makro (a raczej przerabiając to co znalazłem w sieci):
- mam dwa skoroszyty: Admin.xls i kk_User.xls
- w pliku kk_user.xls zaraz po otwarciu wyskakuje UserForm, który po wypełnieniu zapisuje wprowadzone dane do arkusza("KK")
- w pliku Admin.xls mam arkusz KK_User do którego mają się skopiować wszystkie wartości, które wprowadza użytkownik w skoroszycie User
- skopiowanie danych odbywa się przy zamkniętym skoroszycie user.xls
Nie udało mi się osiągnąć:
- przy kopiowaniu metodą getValue trwało to bardzo długo, dlatego może być poprzez otwórz user.xls -> skopiuj dane -> zamknij kk_user.xls wklej w odpowiednie miejsce
- jak otwiera się kk_user.xls to wyskakuje userform, nie potrafię tego wyłączyć (a wtedy możnaby dojść do perfekcji żeby nie było nic widoczne)
- jak już kod zadziała, to kopiuje poprawnie, we właściwe miejsca itp, itd. więc dla mnie super, ale wykładam się na błędach, których nie potrafię obejść...
KOD:
Sub Makro1()
Workbooks.Open Filename:=ThisWorkbook.path & "\KK_User.xls" 'ReadOnly:=True
'Workbooks("KK_User").Activate
'Unload (frm_kk) 'frm_kk
Workbooks("KK_User.xls").Activate
Worksheets("KK").Activate
Range("C4:BE369").Select 'wybiera komorke z ktorej bedzie kopiowac
Selection.Copy 'kopiuje
Application.CutCopyMode = False
Workbooks("KK_User.xls").Saved = True
ActiveWindow.Close '//zamyka
Workbooks("Admin.xls").Activate
Worksheets("KK_User").Activate
Range("C4").Select 'wybiera gdzie kopiowac
ActiveSheet.Paste ' i kopiuje w zadane miejsce
Application.CutCopyMode = False
Call kolor
End Sub |
|
wstecz 1 dalej wszystkich stron: 1
|