Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - VBA kopiowanie grafiku

JaroFon 14 Jul 2013 10:28 3312 16
  • #1
    JaroFon
    Level 23  
    Witam wszystkich. Mam prośbę o pomoc w poprawieniu kodu. W pierwszej wersji pliku w jakim był wykorzystany kod wszystkie arkusze były widoczne i odblokowane i kod działał poprawnie. Plik postanowiłem trochę przerobić. Ukryłem wszystkie arkusze i zablokowałem je przed wścibskimi użytkownikami. Po ukryciu arkuszy w poniższym kodzie wywaliło mi błąd w pierwszej linijce. Po odkryciu ukrytego arkusza z którego jest kopiowany wzór grafiku błędu nie wywala. Jak poprawić kod aby poprawnie kopiował grafik z ukrytego arkusza?

    Code: vbscript
    Log in, to see the code


    Excel - VBA kopiowanie grafiku
  • #2
    cbrman
    Level 27  
    Skoro ukryłeś arkusz "Grafik" to jak chcesz do niego przejść?
    Usuń z kodu linijki w których przechodzisz do arkusza "Grafik" i przetestuj kod.
  • #3
    JaroFon
    Level 23  
    Do tej pory arkusz nigdy nie był ukryty. Teraz go ukryłem i nie wiem jak to obejść :(
  • #4
    adamas_nt
    Moderator of Programming
    Przy Select-Copy-Paste arkusz musisz odkryć i ukryć na końcu (właściwość Visible=True/False arkusza)

    Jeśli możesz, zrezygnuj z selektów i kopiuj (w ukrytym arkuszu) do destination (nie Paste). Mniej-więcej coś takiego:
    Code: vbscript
    Log in, to see the code
  • #5
    JaroFon
    Level 23  
    Kolego adamas na Twoim kodzie też mi wywala błąd w drugiej linijce czyli tej:

    Code: vbscript
    Log in, to see the code

    ...wyskakuje takie okno:

    Excel - VBA kopiowanie grafiku
  • #6
    adamas_nt
    Moderator of Programming
    Wszystko jest w komunikacie... Brakuje przypisania do zmiennej 'grafik', lub arkusz nie istnieje.
  • #7
    JaroFon
    Level 23  
    Może nie bardzo wiem o co chodzi ale podaję dokładnie nazwę arkusza w jakim jest grafik i w dalszym ciągu wywala ten błąd, w tym wypadku w pierwszej linii podaję:

    Code: vbscript
    Log in, to see the code
  • #8
    JaroFon
    Level 23  
    adamas niestety Twój kod nie działa poprawnie. Dziś z samego rana po odpoczynku dostałem olśnienia i rozwiązałem problem. Do mojego kodu na początku dodałem odkrycie a na końcu zamknięcie arkusza i teraz śmiga jak ta lala :). Na początku kodu dodałem coś takiego:

    Code: vbscript
    Log in, to see the code
  • Helpful post
    #9
    adamas_nt
    Moderator of Programming
    No tak to jest, gdy poprawka dotyczy fragmentu wyrwanego "ze środka" ;)

    W załączniku uproszczony przykład kopiowania w ukrytym arkuszu ("Arkusz1").
    -odkryj
    -popatrz
    -ukryj
    -naciśnij przycisk
    -odkryj i zobacz co się narobiło
  • #10
    JaroFon
    Level 23  
    U Ciebie fajnie to śmiga ale jak zablokujesz arkusz i go ukryjesz to już nie jest tak wesoło. Wtedy już nie działa. Próby wcześniejszego odblokowania w moim przypadku ciągle wywalało błąd. Powyższym sposobem jaki pokazałem opanowałem to. :)
  • #11
    adamas_nt
    Moderator of Programming
    JaroFon wrote:
    ale jak zablokujesz arkusz
    Łoj, to trzeba było od razu... Oczywiście, że na zablokowanym się wysypie. Ale skoro już masz z odkrywaniem... Dodaj wyłączanie odświeżania (Application.screenupdate=false/true) i Userzy nie zauważą nawet, że coś się kopiuje.
  • #12
    JaroFon
    Level 23  
    Application.screenupdating mam już zastosowana w i innym miejscu, w change arkusz
  • #13
    JaroFon
    Level 23  
    Wrócę do tematu ponieważ chciałem sobie trochę udoskonalić kod do kopiowania grafiku ale nie mogę sobie poradzić z jedną opcją. Chodzi o poniższy kod i jego czwartą linijkę a dokładnie o wpis "Grafik1". W arkuszu z którego jest pobierany grafik mam trzy różne grafiki, tz. "Grafik1", "Grafik2" i "Grafik3" i w zależności który grafik wpiszę w czwartej linijce tego kodu to taki grafik będzie kopiowany. Jednak problem jest w tym że mam dziesięć różnych arkuszy do których kopiuję grafik i kod poniższy powoduje że do wszystkich arkuszy jest kopiowany taki sam grafik no chyba że to zmienię w kodzie. Wpadłem na pomysł jak to udoskonalić aby bez edytowania kodu można wybrać jaki grafik ma być kopiowany do danego arkusza. Do czwartej linijki poniższego kodu zamiast wpisy "Grafik1" dałbym coś takiego:

    Code: vbscript
    Log in, to see the code


    ...w ten sposób z komórki 'D1' będzie pobierana informacja jaki grafik ma być kopiowany (do komórki 'D1' mam już sposób jak dodać informacje o grafiku). Jednak jest jedno małe ale! Wpis w postaci : Sheets("1").Range("D1") powoduje że informacja o grafiku jest pobierana tylko z jednego arkusza a ja mam tych arkuszy dziesięć. Jak zrobić aby ta informacja była pobierana z aktywnego arkusza (ActiveSheet) ale biorąc pod uwagę że cały kod jest umieszczony w Module? Myślałem o czymś takim: ActiveSheet.Range("D1") ale to nie działa chyba dlatego że kod jest umieszczony w Module


    Code: vbscript
    Log in, to see the code
  • #14
    adamas_nt
    Moderator of Programming
    JaroFon wrote:
    ale to nie działa chyba dlatego że kod jest umieszczony w Module
    To nie to. Makro aktywuje arkusz o nazwie przypisanej do zmiennej 'grafik', dlatego ActiveSheet będzie zawsze Sheets(grafik).

    Najprościej byłoby przerobić je na procedurę z przekazaniem argumentu w postaci nazwy aktywnego arkusza. Ale jest jeszcze wiele niejasności... Najlepiej, gdybyś wrzucił przykładowy plik.
  • #15
    JaroFon
    Level 23  
    Jeśli chodzi mój problem to już go rozwiązałem w taki trochę sposób na okrętkę ale działa poprawnie.
    mam jednak inny może nie problem ale coś z czym nie wiem jak sobie poradzić. Mam pewien grafik który raz w miesiącu muszę aktualizować. Nie jest to coś bardzo uciążliwego ale pomyślałem że można by to zautomatyzować tak aby moja praca w edytowaniu grafiku była minimalna. Mam pewien grafik w systemie 6/2 czyli 6 dni roboczych i dwa dni wolne, trzy zmianowy czyli praca na trzy zmiany 4, 5 i 6 gdzie zmiany zawsze następują po sobie do przodu czyli od4 do 6 i czterobrygadowy czyli brygady od A do D. Może ktoś ma pomysł jak zrobić aby ten grafik sam się aktualizował na podstawie zadanej daty mając wzór wyjściowy utworzony i aktualny zawsze na ten sam miesiąc roku. Dołączam plik w którym wszystko pokazałem
  • #16
    adamas_nt
    Moderator of Programming
    Nie jestem pewien, czy o to chodzi. Po prawej stronie przerobiłem kalendarz na formuły+formatowanie komórek. Data pobierana jest z B2 pierwszego arkusza.
  • #17
    JaroFon
    Level 23  
    Tak, dokładnie. Po prawej stronie ma być sformatowany nowy grafik, data do utworzenia nowego grafiku jest data z B2 pierwszego arkusza. Trzeba pamiętać ze do bazą di utworzenia grafiku jest wzór z prawej strony który jest ważny dla sierpnia 2013 i ten wzór z taka datą jest bazą wyjściowa. Jeśli np. zrobię nowy wzór dajmy na to w grudniu 2013 to wtedy taki wzór z taka data będzie baza wyjściową