Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel - Visual basic

10 Lip 2009 12:19 6303 15
  • Poziom 2  
    Mam tagi problem do rowiązania. Może mi ktoś podpowie jakie makro to zrobi.
    A mianowicie:
    Mam w skoroszycie excela wiele arkuszy.
    W każdym arkuszu mam zdefiniowany obszar wydruku z tabela.
    Mam również zrobiony arkusz - listę ze spisem wszystkich arkuszy z tabelami.
    Chciałbym zrobic makro, którę bedzie drukować tylko wybrane arkusze.
    Wybór arkusz dokonywał by się poprzez arkusz - liste, gdzie w kolejnym komórkach byłyby wstawione pole wyboru. A wieć w makrze powienien byc warunek "pole wyboru zaznaczone - drukować".
    Nie wiem czy wystarczająco wyjaśniłem problem.
    Może ktoś robił coś podobnego, to chetnie bym skorzystał z przyj=kładu lub podpowiedzi.
  • Moderator Programowanie
    "Zwykłe" pole wyboru ma łącze z komórką, w której zapisywana jest wartość PRAWDA lub FAŁSZ. Najprościej byłoby użyć takiego właśnie pola, gdzie warunkiem wykonania procedury drukowania w pętli będzie odp. wartość w komórce.
  • Poziom 2  
    Dzięki, za zainteresowanie.
    Mas rację, lepsze będzie zwykle pole, ale mi głownie chodzi i te drukowanie w pętli.
    Jak je dobrze napisać.
  • Moderator Programowanie
    Najlepiej pętlą For. Musisz ustalić ilość kroków, wiersz początkowy itd. Np
    Jest 10 arkuszy, pierwszy wiersz Nr2, kolumna komórek łączących C.
    Coś w rodzaju:

    for wiersz = 2 To 11
      if cells(wiersz,3)= True then
       'Tu Twoja procedura drukowania arkusza o nazwie w kolumnie A
        Sheets(Range("A" & wiersz).printout
      end if
    next
  • Poziom 28  
    adamas_nt napisał:


    Najlepiej pętlą For. Musisz ustalić ilość kroków, wiersz początkowy itd. Np
    Jest 10 arkuszy, pierwszy wiersz Nr2, kolumna komórek łączących C.



    Nie do końca jest to miły sposób. Przy stałej, niewielkiej ilości arkuszy da się jeszcze przeżyć. W przypadku zmieniającej się dynamicznie ich liczby czyż nie prościej jest sprawdzić ile CheckBox-ów jest na głównym arkuszu i które z nich są zaznaczone (zakładam, że każdy arkusz do drukowania ma swojego Check...)? Wtedy można wydrukować tylko wybrane arkusze.
  • Moderator Programowanie
    Racja, oczywiście. Z tym, że pól opcji bym nie liczył makrem, łatwo o błąd (niedawno był temat o tym właśnie). Pewniejsze będzie policzenie zajętych wierszy wybranej kolumny lub wierszy używanego zakresu.
  • Poziom 28  
    Code:


    Private Sub Druk_Click()
        With Sheets(1)
            For i = 1 To .OLEObjects.Count
                If Left(.OLEObjects(i).Name, 8) = "CheckBox" Then
                    If .OLEObjects(i).Object.Value = True Then
                        c = Range(.OLEObjects(i).LinkedCell).Offset(0, 1).Text
                        Sheets(c).PrintOut
                    End If
                End If
            Next
        End With
    End Sub



    A coś takiego Twoim zdaniem ma sens?
    Mogę to podesłać do testowania w xls-ie.
  • Moderator Programowanie
    Oczywiście, ale :) Excel lubi płatać figle.
    Zapisz jeden wiersz z CheckBoxem, skopiuj go 100 razy, po czym usuń przez zaznaczenie 80 wierszy. Ile jest CheckBoxów w arkuszu? I co będzie gdy uruchomisz powyższe makro? Raczej użyłbym czegoś w stylu
    Code:
    For wiersz = 1 To Range("A65536").End(xlUp).Row
    
    'tu drukowanie zaznaczonych w gałęzi If
    Next
    MsgBox wiersz - 1 'Nr ostatniego


    Twoje makro natomiast jest rewelacyjne do zastosowanie w UserFormie.
  • Poziom 28  
    Kopiowania i wklejania, tudzież opcji odwrotnej nie polecam. I tak w efekcie końcowym po wklejeniu wierszy (w trybie projektowania ma się rozumieć) trzeba ręcznie zmienić właściwość LinkedCell na właściwą. W tym momencie makro działa prawidłowo. Po usunięciu wierszy też makro działa właściwie. Dalej drukuje zaznaczone. Można oczywiście w VBA napisać makro, którym przy wstawianiu nowego arkusza na zbiorowym powstaje odpowiednia pozycja jemu dedykowana. Osoba tworząca dany skoroszyt powinna wiedzieć co chce zrobić. Może także uniemożliwić postronnym, lub niedoświadczonym użytkownikom wszelkie niebezpieczne zmiany w arkuszach. Nie chodzi mi o to, żeby upierać się przy moim pomyśle jako "jedynym słusznym". :D Moim zdaniem wszystkie, które prowadzą do zamierzonego celu są dobre. To, którego użyje kolega waldekl zależy tylko od niego.
    Przykładowy skoroszyt do zabaw i testowania w umieszczam załączniku. Makro jest zapisane w arkuszu pierwszym.


    ---
    A tak na marginesie:
    Cytat:

    Z tym, że pól opcji bym nie liczył makrem, łatwo o błąd (niedawno był temat o tym właśnie)

    pisząc to miałeś na myśli "Excel - formatowanie warunkowe" ten wątek?
    Czytając odniosłem wrażenie, że autor (tak jak niektórzy moi koledzy z pracy) biegają po arkuszach naciskając co popadnie, a potem płaczą, że nie działa. Stąd właśnie wzięła się u mnie zasada blokowania (prawie) wszystkiego w produkcji arkuszy. "Mniej możesz, mniej popsujesz".
    :D
  • Poziom 10  
    Panowie mam problem, a mianowicie muszę zrobić wizualizacje w VB.
    Chodzi o szkielety figur przestrzennych.
    Czy jest ktoś mi w stanie pomóc?
  • Poziom 2  
    Witam Wszystkich,
    Mam taki problem do rozwiązania- jeżeli chodzi makra to jestem na początku drogi - a chodzi mi o coś takiego - w arkuszy zrobiłem kalkulację z grupowaniem danych - kiedy włączę ochronę - brak jest możliwości "rozwijania" danych - jakie makro pomoże ???
  • Poziom 28  
    Możesz użyć:
    Code:

    Private Sub Workbook_Open()
        Sheets("DD").EnableOutlining = True
    End Sub


    Dodane 2009-07-16:
    Oczywiście w przypadku chronionego arkusza należy przed zabiegiem ochronę zdjąć a po założyć.
    Code:

    Private Sub Workbook_Open()
        With Worksheets("DD")
            .Unprotect [color=red](XXXXXX)[/color]
            .EnableOutlining = True
            .Protect  [color=red]Password:="XXXXXX",[/color] Contents:=True, UserInterfaceOnly:=True
        End With
    End Sub

    Na czerwono masz wpis opcjonalny w przypadku użycia hasła. "DD" to nazwa arkusza, na którym chcesz zadziałać.
  • Poziom 2  
    ...dzięki ale (może dla was - ekspertów) moja prośba bedzie banalnie prosta - ale jak to zrobić ???? krok po kroku ??
  • Poziom 28  
    Z tymi ekspertami to Ty nie przesadzaj. Ale do rzeczy:
    1. Otwierasz w Excel-u swój plik
    2. Klikasz na Narzędzia > Makro > Edytor Visual Basic
    3. W nowo otwartym oknie, w projektach odnajdujesz VBAProject z nazwą twojego pliku w nawiasie.
    4. W folderze Microsoft Excel Obiekty klikasz podwójnie na ThisWorkbook.
    5. W okienku, które otworzy się po prawej stronie wybierasz z lewej listy rozwijalnej Workbook
    6. Kopiujesz (lub wpisujesz) kod do procedury opuszczając to co w poprzednim moim poście jest w nawiasach kwadratowych.
    7. Zapisujesz plik.
    Powinno działać. Nie zapomnij zmienić "DD" na nazwę swojego arkusza a w miejsce XXXX wpisać prawidłowe hasło.
  • Poziom 2  
    Serdeczne dzięki !! bedę kombinował :)
  • Poziom 2  
    ...wszystko robie tak jak podane w poscie i NIC - chyba coś pierdzieliłem !! :)