logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Excel VBA: Jak napisać makro działające na dwóch otwartych plikach?

pd4 04 Lip 2016 05:54 2742 15
REKLAMA
  • #1 15785236
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Hej, posiadam dwa otwarte dokumenty excel w 2 różnych plikach, w taki sposób żeby jeden mógł być wyświetlany na jednym monitorze, natomiast drugi na innym.
    Jak napisać jakiekolwiek makro, które będzie odpalane z jednego dokumentu, ale bedzie miało wpływ na drugi dokument?
  • REKLAMA
  • #2 15785333
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    Najlepiej jak utworzysz zmienną obiektową typu Workbook. Do niej otworzysz drugi plik z tego pierwszego. I w tedy z poziomu VBA masz dostęp do wszystkich właściwości, metod i obiektów należących do drugiego pliku. Napisz co chcesz konkretnie zrobić bo makra w Excel'u to temat rzeka. I koniecznie napisz jaka wersja Excel'a jaki system itp. Jak chcesz pomocy to daj więcej szczegółów. Nikt nie jest wróżką i nie zgadnie co masz i co chcesz zrobić.
  • #3 15785366
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Windows 10, Office 2010,

    zmienna Workbook działałaby gdyby oba dokumenty były otwarte w jednym pliku, ja natomiast nie mogę tego zrobić, bo jeden z plików wyświetlany jest na jednym z monitorów, natomiast drugi na innym.

    a jeśli chodzi o przykład to powiedzmy że stworzyłem 2 dokumenty excel; pierwszy to zeszyt1 natomiast drugi to zeszyt2.
    następnie otwieram dokument zeszyt1 po czym robię kombinację SHIFT + lewy click na skrót EXCEL, dzięki czemu otwiera mi się drugi plik excel do którego ładuję dokument zeszyt2.

    chciałbym stworzyć makro w dokumencie zeszyt1 które wpisywałoby liczbę 5 do komórki a1 w dokumencie zeszyt2

    Doszedłem do tego, że prawdopodobnie trzeba użyć funkcji shell, jednak nigdzie nie znalazłem tego jak jej użyć.
  • #4 15785382
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    Można otworzyć dwa pliki w dwóch oknach w jednej instancji Excel'a Przełącza się to poleceniem w oknie imediate: Application.ShowWindowsInTaskbar = true Na pewno gdzieś w ustawieniach można to też przełączyć. Jeżeli koniecznie chcesz to z poziomu makra możesz stworzyć oddzielną instancję excel'a i do niej otworzyć. Chociaż jest to kłopotliwe bo często następuje odłączenie od obiektu (state loss) i już tracimy kontrole nad nową instancją. Shela używam tylko jak muszę wywołać jakąś aplikację konsolową. Ale nie wiem jak zachowa się to w Win10. Poza tym mimo że masz przełączoną aplikację Excel' a i pokazuje Ci jeden plik "na raz" to ten plik jest otwarty. I jak go masz w zmiennej to możesz do niego wpisywać. Nie musi być widoczny ani nawet zfokusowany. Zaras Ci skrobnę makro do Twojego przykładu.


    Wklej kod do modułu do zeszyt1.xlsm i utwórz pusty Zeszyt2.xlsx w tym samym katalogu.

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    A tu przykład z tworzeniem nowej instancji Excela:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 15785879
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Przykłady które podałeś, otwierają zeszyt2, wpisują wartość, zapisują i zamykają zeszyt2.

    Moje pliki są zawsze otwarte i nie chcę ich zamykać,
    chce jedynie aby po włączeniu makra w zeszyt1, fokusował mi się zeszyt2 tam wykonywało się makro, po czym fokusował się zeszyt1

    Gdyby oba dokumenty otwarte były w jednym pliku wówczas wystarczyłoby makro w stylu:


    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    tylko że problem polega na tym, że oba dokumenty otwarte są w dwóch różnych plikach.
  • REKLAMA
  • #6 15785966
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    No i widzisz bo pracujesz na aktywnym arkuszu. Jak sobie przypiszesz do zmiennej workbook to nie musisz fokusować drugiego okna. Autofiltr też możesz zrobić na obiekcie. A pliku do zmiennej nie musisz otwierać możesz go przypisać:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    A potem się odwołujesz do tego obiektu.
    Aktywacje możesz zrobić poleceniem:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    Ale nie ma takiej potrzeby

    A autofiltr w takim przypadku robisz:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Jak odwołujesz się przez polecenie Range("A1") to robisz to w aktywnym arkuszu. Jak masz zamiar pisać rozsądne makra to tak nie rób. Zawsze warto przypisać do obiektu. Ew możesz napisać jak nie chcesz tworzyć obiektu:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    I w tedy nie trzeba aktywować arkusza. No chyba że chcesz.
  • REKLAMA
  • #7 15787496
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Nie wiem czy się nie dogadujemy, czy robię coś nie tak, ale już tak próbowałem zrobić i oto efekty:

    Excel VBA: Jak napisać makro działające na dwóch otwartych plikach?
  • #8 15787663
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    Ze screena widzę że nie masz otwartego arkusza "Zeszyt2.xlsx" Musi być otwarty w tej samej instancji excela. I tak się nazywać. Masz w tej instancji otwarte dwa arkusze. Oba mają nazwę "Zeszyt1." a dalej nie widać.
    Dlatego masz błąd bo w kolekcji Workbooks nie masz takiego z nazwą "Zeszyt2.xlsx".
    Ten skrypt wyświetli Ci w oknie Imediate listę otwartych arkuszy w aktywnej instancji Excela:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Twój Zeszyt2.xlsx jest otwarty w oddzielnej instancji Excela. I ta z której uruchamiasz makro jej nie widzi.
  • #9 15787722
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    No tak, Zeszyt1.xlsx i Zeszyt2.xlsx są w 2 różnych instancjach, ponieważ podczas otwierania nowego okna excel'a gdzie jest dokument Zeszyt2.xlsx ( bo tylko w taki sposób mogę go przenieść na drugi monitor ) automatycznie tworzy się też nowa instancja i dlatego też dokumenty nie komunikują się między sobą.

    Właśnie dlatego myślałem o tym żeby makro korzystało z fokusowania i funkcji shell, ale skoro mówisz że jest opcja, żeby mimo tego, że oba dokumenty są w osobnych oknach, można stworzyć dla niech wspólną instancje, to jak to zrobić? i czy to faktycznie jest najlepsza metoda?
  • #10 15787757
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    Ok to zrób tak otwórz jeden plik Zeszyt1 potem przez Ctrl + o ten drugi Zeszyt2. Powinny być w tej samej instancji.
    A użyłeś polecenia: Application.ShowWindowsInTaskbar = True ?

    Możesz je wpisać w oknie Imediate w VBA albo wkleić w makro

    Powinno sprawić że oba pliki mimo że otwarte w tej samej instancji będą wyświetlone w oddzielnych oknach i będziesz mógł sobie je przenosić między monitorami.
    Z tego co pamiętam tak to działało w Office 2010. Ja teraz używam już 16 i od razu pliki otwierają mi się w oddzielnych oknach i w tej samej instancji. W menu widok możesz też utworzyć oddzielne okna dla każdego pliku. Do jednego pliku możesz utworzyć nawet kilka okienek.
  • #11 15789727
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Zrobiłem wszystko tak jak napisałeś, niestety u mnie działa to nieco inaczej, niby otwiera się w nowym oknie, ale nie mogę przenosić ich między monitorami,
    mogę je jedynie zminimalizować w obrębie tego samego programu, o tak:

    Excel VBA: Jak napisać makro działające na dwóch otwartych plikach?

    Szukałem w opcjach czegoś co za to odpowiada, ale niestety nic nie znalazłem,
    ktoś ma jakiś pomysł albo zna jakiś inny sposób żeby rozwiązać mój problem?
  • #12 15789766
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    1. Otwórz plik programu Excel, wpłynie to na monitor 1 (główny).
    2. Weź go myszą i rozciągnąć na monitor 2, więc Excel wpłynie na powłoki oba monitory.
    3. Otworzyć inny plik programu Excel, lub dodatkowe okno w tym samym pliku...
    Jedyne co musisz ręcznie zainstalować drugi rozmiar okna z myszy i przeciągnij go do gdzie będzie wygodne.
    p.s. Excel 2010
  • #13 15790238
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Niestety, ale monitory są w takim miejscu, że albo widzę jeden albo drugi, więc jeśli zastosowałbym twój sposób JRW to ucięłoby mi połowę interfejsu Excela.

    Ahh nie wiedziałem, że z tym będzie tyle zachodu

    jakiś inny pomysł?

    i naprawdę nie da się tego zrobić przez shella lub jakąś podobną funkcję?
  • #14 15790533
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    pd4 napisał:
    widzę jeden albo drugi
    Nadzieję, komp choć jeden na dwa monitory? :)
    Jest metoda przeniesienia programu na inny monitorz
    Sprobuj
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ten exc2 przenieść do drugiego monitora znajomym sposóbem
  • #15 15792252
    pd4
    Poziom 8  
    Posty: 39
    Ocena: 2
    Jest progres :D

    tylko że makro otwiera nowy plik excela do którego ładuje zeszyt2.xlsx.
    jak napisać makro które aktywuje już otwarty zeszyt2.xlsx?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #16 15792280
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    pd4 napisał:
    ' New zamienić na zeszyt2.xlsx?
    Przeczytaj w pomocy co to 'New'
    Już otwarty - znaczy to że instancje Excel była uruchomiona nie przez makro, wtedy problem 'złapac je'. Gdy jest instancja exc2(utworzona przez makro - 'Set exc2 = New Excel.Application '), można łatwo zarządzać z nią.

    Dodano po 4 [minuty]:

    JRV napisał:
    'exc2.Workbooks.Open "zeszyt2.xlsx"
    to bylo do otwarzania.
    Zakomentowano poniewaz ne mam ten zeszyt2

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na napisanie makra w Excel VBA, które działałoby na dwóch otwartych plikach Excel wyświetlanych na różnych monitorach. W odpowiedziach zasugerowano, aby oba pliki były otwarte w tej samej instancji Excela, co umożliwiłoby łatwiejsze zarządzanie obiektami Workbook. Użytkownik próbował różnych metod, w tym użycia funkcji Shell, ale napotkał problemy z komunikacją między instancjami. Ostatecznie zasugerowano, aby otworzyć pliki w jednej instancji Excela, co pozwoliłoby na przypisanie ich do zmiennych obiektowych i manipulację danymi bez konieczności aktywacji okien. Wskazówki obejmowały również użycie polecenia Application.ShowWindowsInTaskbar, aby umożliwić przenoszenie okien między monitorami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA