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

VBa Excel(makro, Pętla do utworzenia "Listy" wpisywanej w arkusz Exela

amator_piotr 29 Lis 2011 00:44 10317 35
  • #1 29 Lis 2011 00:44
    amator_piotr
    Poziom 12  

    jestem początkujący i dopiero "raczkuje" w pisaniu kodów.

    usiłuje stworzyć makro, które ułatwiłoby mi życie :) jednak:
    potrzebuje pomocy w napisaniu petli, nie wiem którą z petli wybrać oraz jak ja jej kod powinien być napisany.

    Chodzi mi o stworzenie makra, w którym to z listy CheckBox1 do CheckBox10 będzie można odzaznaczyć odpowiedni (czy też odpowiednie-więcej niż jeden) CheckBox"N" po czym po zkliknięciu przycisku Ok nazwy zaznaczonych cBox'ów będą wprowadzone w postaci listy w komórkę np "A1".

    siedzę juz nad tym dośc dlugo :( do tej pory poprawnie udało mnie sie zrobić przycisk urachamiający liste :) zak na załączonym "obrazku"[/code]

    0 29
  • Pomocny post
    #2 29 Lis 2011 08:35
    adamas_nt
    Moderator Programowanie

    Domyślam się, że dotyczy to formularza i pól wyboru. Spróbuj

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    W arkuszu będzie podobnie.

    0
  • #3 29 Lis 2011 21:11
    amator_piotr
    Poziom 12  

    dziękuje za poswięcenie czasu. przepisałem dosłownie tak jak pan napisał i coś jest nie tak. nie wiem co mam office 2003.
    mianowicie po wpisaniu:
    1st = 1st & Chr(10) & ctrl.Name
    i przy przejsciu do następnego wiersza pokazuj mnie się:
    "compile error :
    Expected: end of statement"

    jak i również po:
    Range("A1") = 1st

    0
  • Pomocny post
    #4 29 Lis 2011 21:19
    marcinj12
    Poziom 40  

    Myślę, że tam było lst od "lista", nie 1st. Poza tym obrazek za dużo nie mówi, wklej kod jak już.

    0
  • #5 29 Lis 2011 21:30
    amator_piotr
    Poziom 12  

    amator_piotr napisał:
    dziękuje za poswięcenie czasu. przepisałem dosłownie tak jak pan napisał i coś jest nie tak. nie wiem co mam office 2003.
    mianowicie po wpisaniu:
    1st = 1st & Chr(10) & ctrl.Name
    i przy przejsciu do następnego wiersza pokazuj mnie się:
    "compile error :
    Expected: end of statement"

    jak i również po:
    Range("A1") = 1st


    przepraszam zapomniałem, opisy CheckBox1, CheckBox2, ........ CheckBox10 bedą zmienione lecz w właściwości nazwy będą jakie są czyli:
    CheckBox1, CheckBox2, ........ CheckBox10
    Chciałbym aby to opis widoczy dla użytkownika było przypisane do Komórki A1.

    myśle że mnie pan zrozumie.

    0
  • Pomocny post
    #6 29 Lis 2011 21:55
    marcinj12
    Poziom 40  

    To forum jest bezpłciowe, nie ma panów, ani pań ;)
    Jeżeli w kodzie adams_nt zmienisz w dwóch miejscach ctrl.Name na ctrl.Caption, to będzie wstawiało opisy checkboxów.

    0
  • #7 29 Lis 2011 22:01
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    Myślę, że tam było lst od "lista", nie 1st. Poza tym obrazek za dużo nie mówi, wklej kod jak już.


    dziłaa. dzieki wielkie :) jak mogę się odwdzieczyć?

    próbuje zrozumieć wszystko to co pan mi napisał lecz moja wiedza jak widzę jest znikoma. czytałem i wiem że regulamin mówi że forum to nie....

    czy jest to możliwe aby wyjaśnił mi pan jak to działa?
    z góry dziękuję.

    Dodano po 2 [minuty]:

    marcinj12 napisał:
    To forum jest bezpłciowe, nie ma panów, ani pań ;)
    Jeżeli w kodzie adams_nt zmienisz w dwóch miejscach ctrl.Name na ctrl.Caption, to będzie wstawiało opisy checkboxów.


    przepraszam, to moje pierwsze kroki i nie wiedziałem ze tu nie ma panów i pań.
    wychowano mnie....

    dzieki wielkie :)

    0
  • Pomocny post
    #8 29 Lis 2011 22:16
    marcinj12
    Poziom 40  

    Odwdzięczysz się klikając "pomógł" Koledze adams_nt, który zapodał kod ;)
    Kod w skrócie sam się udokumentował ;), widzę po fladze że Kolega z UK, więc wystarczy komendy przetłumaczyć, bo moje tłumaczenie może nie być zbyt jasne ;)

    Kolejne linijki:
    1. pętla For Each przechodzi po każdej kontrolce znajdującej się na formie (Me.Controls) i zapisuje ją tymczasowo w zmiennej ctrl.
    2. Warunek If TypeName(ctrl) = "CheckBox" Then sprawdza, czy trafiono akurat na kontrolkę typu CheckBox (pomija np. dwa przyciski, typu Button). W zasadzie sprawdza nazwę typu kontrolki.
    3. Warunek If ctrl = True Then będzie spełniony tylko, jeżeli kontrolka checkbox będzie zaznaczona "ptaszkiem". (tu bym dał ctrl.Value dla większej czytelności, niemniej tak jak jest też działa).
    4. Jeżli wszystkie 3 powyższe warunki są spełnione, wchodzimy we "właściwe" dodawanie nazwy:
    If i > 0 Then
    lst = lst & Chr(10) & ctrl.Caption
    Else
    lst = ctrl.Caption
    End If

    przy pierwszej kontrolce i = 0, więc wykona się druga część warunku, po else: do zmiennej lst (teraz pustej) zostanie przypisany "opis" kontrolki (ctrl.Caption). Zmienna i zostanie zwiększona o jeden (i = i + 1), więc przy kolejnej zaznaczonej kontrolce, wykona się pierwsza część warunku, czyli do zmiennej lst zostanie "doklejony" znak nowej linii w Exelu (Chr(10)) oraz "opis" kontrolki (ctrl.Caption). Po powtórzeniu tych czynności dla każdej kontrolki, poleceniem Range("A1") = lst zapisujesz sklejony ciąg opisów i znaków nowej linii do komórki A1.

    0
  • #9 29 Lis 2011 22:27
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    Odwdzięczysz się klikając "pomógł" Koledze adams_nt, który zapodał kod ;)
    Kod w skrócie sam się udokumentował ;), widzę po fladze że Kolega z UK, więc wystarczy komendy przetłumaczyć, bo moje tłumaczenie może nie być zbyt jasne ;)

    Kolejne linijki:
    1. pętla For Each przechodzi po każdej kontrolce znajdującej się na formie (Me.Controls) i zapisuje ją tymczasowo w zmiennej ctrl.
    2. Warunek If TypeName(ctrl) = "CheckBox" Then sprawdza, czy trafiono akurat na kontrolkę typu CheckBox (pomija np. dwa przyciski, typu Button). W zasadzie sprawdza nazwę typu kontrolki.
    3. Warunek If ctrl = True Then będzie spełniony tylko, jeżeli kontrolka checkbox będzie zaznaczona "ptaszkiem". (tu bym dał ctrl.Value dla większej czytelności, niemniej tak jak jest też działa).
    4. Jeżli wszystkie 3 powyższe warunki są spełnione, wchodzimy we "właściwe" dodawanie nazwy:
    If i > 0 Then
    lst = lst & Chr(10) & ctrl.Caption
    Else
    lst = ctrl.Caption
    End If

    przy pierwszej kontrolce i = 0, więc wykona się druga część warunku, po else: do zmiennej lst (teraz pustej) zostanie przypisany "opis" kontrolki (ctrl.Caption). Zmienna i zostanie zwiększona o jeden (i = i + 1), więc przy kolejnej zaznaczonej kontrolce, wykona się pierwsza część warunku, czyli do zmiennej lst zostanie "doklejony" znak nowej linii w Exelu (Chr(10) oraz "opis" kontrolki (ctrl.Caption). Po powtórzeniu tych czynności dla każdej kontrolki, poleceniem [b]Range("A1") = lst[/lst] zapisujesz sklejony ciąg opisów i znaków nowej linii do komórki A1.


    dzieki wielkie. jesteś wielki.

    przetłumaczenie nie wiele się zdaje. jest to jezyk techniczny i tu niestety ale kłania sie wiedza, której brakuje. jestem na etapie nauki VBA a przy książce tak rozbudowanej pętli się nie znajdzie. również opisu jej :)
    nie chciałbym przesadzać ale jesteś wielki.

    mała prośba, mianowicie. tego też nie umiem znaleść mianowicie:
    czy jest to możliwe aby to makro wpisywało w komórkę wcześnij zaznaczoną/odznaczoną (zanim się je uruchomi)?byłoby super jeśli jest taka możliwość.

    dzięki za rady wszystko zrobiłem wg wskazówek :)

    0
  • Pomocny post
    #10 29 Lis 2011 23:20
    adamas_nt
    Moderator Programowanie

    amator_piotr napisał:
    Czy jest to możliwe aby to makro wpisywało w komórkę wcześnij zaznaczoną/odznaczoną (zanim się je uruchomi)?byłoby super jeśli jest taka możliwość.
    Tak. Zamiast: Range("A1") = lst
    Wpisz: Acivecell = lst

    0
  • #11 30 Lis 2011 01:00
    amator_piotr
    Poziom 12  

    Wielkie dzieki :)

    0
  • #12 01 Gru 2011 22:04
    amator_piotr
    Poziom 12  

    Witam

    czy mógłbyś mi powiedzieć jak zmienić w własciwości pola tekstowego tak aby nie można było ich zmienić z pozycji użytkownika lecz aby modół VBA mókł wpisać je. tzn widziałem coś takiego mianowicie pole tekstowe byo koloru szarego i nie można było wpisać nie cokolwiek.

    pozdrawiam

    0
  • Pomocny post
    #13 01 Gru 2011 22:13
    adamas_nt
    Moderator Programowanie

    Ustaw w oknie właściwości pola pozycję "Locked" na True. Automatycznie szarzeje zdaje się tylko w Accesie. Ustaw ręcznie lub warunkowo w kodzie formy.

    0
  • Pomocny post
    #14 01 Gru 2011 22:18
    marcinj12
    Poziom 40  

    Podobny sposób do zablokowania kontrolki - dający efekt "wyszarzania", ale samego tekstu - można uzyskać ustawiając właściwość Enabled kontrolki na False. Excel faktycznie nie obsługuje wyszarzenia całej kontrolki, chyba że jej BackColor zmienisz ręcznie ;).

    0
  • #15 01 Gru 2011 23:30
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    Podobny sposób do zablokowania kontrolki - dający efekt "wyszarzania", ale samego tekstu - można uzyskać ustawiając właściwość Enabled kontrolki na False. Excel faktycznie nie obsługuje wyszarzenia całej kontrolki, chyba że jej BackColor zmienisz ręcznie ;).


    tylko jak zablokować tą komórke aby nie mozna bylo jej nadpisać?

    Dodano po 7 [minuty]:

    amator_piotr napisał:
    marcinj12 napisał:
    Podobny sposób do zablokowania kontrolki - dający efekt "wyszarzania", ale samego tekstu - można uzyskać ustawiając właściwość Enabled kontrolki na False. Excel faktycznie nie obsługuje wyszarzenia całej kontrolki, chyba że jej BackColor zmienisz ręcznie ;).


    tylko jak zablokować tą komórke aby nie mozna bylo jej nadpisać?


    sorry, zrozumialem. ale ze mnie ciemny bląd :) lol

    Dodano po 59 [minuty]:

    moja ortografia sie slania. sorry za blegy :) czytajac samego siebie az mi jest glupio.

    0
  • #16 08 Gru 2011 21:04
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    Podobny sposób do zablokowania kontrolki - dający efekt "wyszarzania", ale samego tekstu - można uzyskać ustawiając właściwość Enabled kontrolki na False. Excel faktycznie nie obsługuje wyszarzenia całej kontrolki, chyba że jej BackColor zmienisz ręcznie ;).


    witam ponownie

    czy moglbys mi powiedziec gdzie znalesc w jezyku polski opis kodow do VBA.

    jesli jest to mozliwe czy moglbys mi powiedziec jaka petle zastosowac aby sprawdzila czy jest zaznaczonay TYLKO jeden CheckBox jesli tak to ktory i aby wpisal w odpowiednia komórke wartosc.Caption. natomias jesli beda zaznaczone wiecej niz jedna komorka to aby wyswietlil sie komunikat (MsgBox) o odpowiedniej tresci po czy gdy kliknie sie "ok" na tym oknie komunikatu powróci do wyswietlanego "userform"

    0
  • #17 08 Gru 2011 21:32
    marcinj12
    Poziom 40  

    "Kody do VBA"?? Obawiam się że nie rozumiem, co masz na myśli...
    W Excelu jest wbudowany mechanizm nagrywania makr, który przekłada czynności na kod VBA, używasz go? W praktyce wygląda to tak, że jak chcesz coś zrobić to włączasz nagrywanie makra, wykonujesz tą czynność w Excelu, zatrzymujesz nagrywanie i podglądasz stworzony kod. Potem kopiujesz interesujący Cię fragment, ew. szukasz na google co jaka funkcja robi.

    Jeżeli chodzi Ci o jakiś opis wbudowanych funkcji, to np. tutaj masz cały kurs, wygląda na dobry.

    O ile dobrze zrozumiałem Twoje drugie pytanie, to chodzi o taką modyfikację kodu:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #18 08 Gru 2011 22:27
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    "Kody do VBA"?? Obawiam się że nie rozumiem, co masz na myśli...
    W Excelu jest wbudowany mechanizm nagrywania makr, który przekłada czynności na kod VBA, używasz go? W praktyce wygląda to tak, że jak chcesz coś zrobić to włączasz nagrywanie makra, wykonujesz tą czynność w Excelu, zatrzymujesz nagrywanie i podglądasz stworzony kod. Potem kopiujesz interesujący Cię fragment, ew. szukasz na google co jaka funkcja robi.

    Jeżeli chodzi Ci o jakiś opis wbudowanych funkcji, to np. tutaj masz cały kurs, wygląda na dobry.

    O ile dobrze zrozumiałem Twoje drugie pytanie, to chodzi o taką modyfikację kodu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    dziekuje za kod petli :) nie wiem czy sie zrozumielismy ale czy ta petala wpisuje w postaci listy "wynik" wiecej nizeli z jednego CheckBox'u?

    jesli chodzi o twoje pytanie, tak nagrywam makra i wybieram jak wspomniales wartosciowe.... :)
    natomias chodzi mi o to gdzie mozna znalesc opis np: "ctrl" albo jak dodac miesiac do wartosci "x" czy tez inne kody wykorzystywane do kodow.

    aha zapomnialem zapytac, czy jest kod ktory po zaznaczeniu CheckBox'u natychmiast wpisze wartosc.Caption w Range("a1")

    0
  • #19 08 Gru 2011 23:00
    marcinj12
    Poziom 40  

    amator_piotr napisał:
    czy ta petala wpisuje w postaci listy "wynik" wiecej nizeli z jednego CheckBox'u
    Nie, bo napisałeś:
    amator_piotr napisał:
    aby sprawdzila czy jest zaznaczonay TYLKO jeden CheckBox


    Ta pętla jest rozbudową tej z początku wątku, tyle że na końcu doszedł potrójny warunek if.
    Po przeleceniu wszystkich checkboxów w zmiennej i masz ilość zaznaczonych przez użytkownika checkboxów, a w lst - sklejony ciąg ich wartości .caption.
    To, co się dzieje dalej, zależy od wartości i - jeżeli = 0 -> MsgBox, jeżeli = 1 -> kopiowanie wyniku, we wszystkich pozostałych przypadkach -> drugi MsgBox.

    Aby po zaznaczeniu checkbox natychmiast wpisać tekst, a po odznaczeniu go usunąć, kliknij go dwukrotnie i skonstruuj następujące zdarzenie click (przykład dla CheckBox2):
    Kod: vb
    Zaloguj się, aby zobaczyć kod



    To że zmienna w pęli for jest nazwana ctrl to tyko przypadek, równie dobrze mogła się nazywać Jasio.
    Obawiam się że do opanowania samodzielnego pisania tego potrzebna jest praktyka - podstawowe cegiełki do budowania programu poznasz choćby po przerobieniu kursu, który Ci poleciłem. Pętle For..., instrukcje warunkowe - to podstawa, bez której nie ruszysz z bardziej rozbudowanymi makrami. Przerób ten kurs (ze zrozumieniem!) ;) to powinno się co nieco rozjaśnić. Tutaj jest drugi kurs, też po Polsku.

    Pozdrawiam i powodzenia ;)

    0
  • #20 08 Gru 2011 23:10
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    amator_piotr napisał:
    czy ta petala wpisuje w postaci listy "wynik" wiecej nizeli z jednego CheckBox'u
    Nie, bo napisałeś:
    amator_piotr napisał:
    aby sprawdzila czy jest zaznaczonay TYLKO jeden CheckBox


    Ta pętla jest rozbudową tej z początku wątku, tyle że na końcu doszedł potrójny warunek if.
    Po przeleceniu wszystkich checkboxów w zmiennej i masz ilość zaznaczonych przez użytkownika checkboxów, a w lst - sklejony ciąg ich wartości .caption.
    To, co się dzieje dalej, zależy od wartości i - jeżeli = 0 -> MsgBox, jeżeli = 1 -> kopiowanie wyniku, we wszystkich pozostałych przypadkach -> drugi MsgBox.

    To że zmienna jest nazwana ctrl to tyko przypadek, równie dobrze mogła się nazywać Jasio.
    Obawiam się że do opanowania samodzielnego pisania tego potrzebna jest praktyka - podstawowe cegiełki do budowania programu poznasz choćby po przerobieniu kursu, który Ci poleciłem. Pętle For..., instrukcje warunkowe - to podstawa, bez której nie ruszysz z bardziej rozbudowanymi makrami. Przerób ten kurs (ze zrozumieniem!) ;) to powinno się co nieco rozjaśnić. Tutaj jest drugi kurs, też po Polsku.

    Pozdrawiam i powodzenia ;)


    dzieki za wartosciowe rady, postaram sie przerobic material aby mnie sie rozjasnilo lol :)

    pytalem Cie czy jest taka mozliwosc aby po odznaczeniu CheckBox'u natychmias wpisywala sie wartosc.Caption w okrelona komorke. czy jest to do spelnienia?

    0
  • #21 08 Gru 2011 23:13
    marcinj12
    Poziom 40  

    Pytałeś czy jest kod który po zaznaczeniu wpisuje wartość.

    Cytat:
    aha zapomnialem zapytac, czy jest kod ktory po zaznaczeniu CheckBox'u natychmiast wpisze wartosc.Caption w Range("a1")


    Aby robił to po odznaczeniu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #22 09 Gru 2011 23:24
    amator_piotr
    Poziom 12  

    Private Sub flowKtory()

    ' przypisanie wartosci w okienkach.
    Dim i As Integer

    i = 0
    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "cbxType" Then
    If ctrl.Value = True Then
    If i > 0 Then
    lst = lst & Chr(10) & ctrl.Value
    Else
    lst = ctrl.Value
    End If
    i = i + 1
    End If
    End If
    Next

    If i = 0 Then
    wybierzJedenF

    ElseIf i = 1 Then
    If cbxType1 = True Then
    proba5l
    ElseIf cbxType2 = True Then
    proba10l
    ElseIf cbxType3 = True Then
    proba25l
    End If
    Else
    zaWieleF

    End If


    witam!
    nie wiem czemu ale tym razem nie dziala mi ten kod poprawnie.
    caly czas "i" = 0 gdyz wyskakuje mi MsgBox "wybierzJedenF".
    coS jest zle??? lecz nie mam pojecia co

    czy moglbys na to zerknac?

    0
  • #23 09 Gru 2011 23:31
    marcinj12
    Poziom 40  

    A dlaczego zmieniłeś nazwę typu kontrolki na "cbxType" ??

    0
  • #24 09 Gru 2011 23:46
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    A dlaczego zmieniłeś nazwę typu kontrolki na "cbxType" ??


    poniewaz zmienilem "name" z CheckBox1 na cbxType1, z CheckBox2 na cbxType2 itd.
    jest ich duzo i przypisane do roznych funkcji, chcialbym aby petla sprawdzala tylko np.z cbxType w jednym przypadku a w innym...., bylo dla mnie to czytelne.

    0
  • #25 10 Gru 2011 00:32
    marcinj12
    Poziom 40  

    Chodziło mi o nazwę typu:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Mimo zmiany nazwy, kontrolka ciągle jest typu CheckBox, i musi być zapisana jak poprzednio. Inaczej warunek nigdy nie jest spełniony, program nie wchodzi głębiej i nie zwiększa i, które pozostaje = 0.

    0
  • #26 10 Gru 2011 00:46
    amator_piotr
    Poziom 12  

    marcinj12 napisał:
    Chodziło mi o nazwę typu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Mimo zmiany nazwy, kontrolka ciągle jest typu CheckBox, i musi być zapisana jak poprzednio. Inaczej warunek nigdy nie jest spełniony, program nie wchodzi głębiej i nie zwiększa i, które pozostaje = 0.


    hmmm, zatem z 30 CheckBox'ow, trzy to jedn grupa, nastepne cztery to nastepna grupa a nastepne szesc to trzecia grupa itd.

    jesli wszystkie beda nosic ta sama nazwe to petla bedzie "przeszukiwac" wszystkie True.

    jak zatem przeszukiwac czesc/okreslona partie z nich?

    ciekawostka:
    gdy uzylem po raz pierwszy procedury i petli. zadzialala do zmienionych Nazw CheckBox'ow i dziala do tej pory.

    przeksztaciem pierwsza procedure i wyglada ona tak:

    Code:

    Private Sub btnOk_Click()
    Dim i As Integer

    cbxLista.Hide
    Worksheets("arkusz1").Range("J44").Clear

    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "CbxCalibrationOperative" Then
    If ctrl.Value = True Then
    If i > 0 Then
    lst = lst & Chr(10) & ctrl.Caption
    Else
    lst = ctrl.Caption
    End If
    i = i + 1
    End If
    End If
    Next

    Range("J44") = lst
    With Selection
    .HorizontalAlignment = xlLeft
    End With
    With Selection.Font
    .Name = "Times New Roman"
    .Size = 13
    End With
    Selection.Font.Italic = True
    End Sub

    0
  • #27 10 Gru 2011 02:13
    marcinj12
    Poziom 40  

    amator_piotr napisał:
    jesli wszystkie beda nosic ta sama nazwe to petla bedzie "przeszukiwac" wszystkie True.
    Musisz rozróżniać dwa pojęcia: każda kontrolka ma wiele parametrów, m.in. TYP oraz NAZWĘ.
    Każdy z tych 30 checkboxów o których piszesz ma ZAWSZE typ "Checkbox", czyli ten fragment pętli MUSI być taki:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    . Jeżeli zamiast "CheckBox" wpiszesz cokolwiek innego, to NIGDY się ten fragment wewnątrz nie wykona. Dlatego w #23 poście pytałem, czemu zmieniłeś ten fragment na zły.

    To, co Ty sobie zmieniasz żeby było łatwiej, to najwyżej NAZWY checkboxów, które są niepowtarzalne, czyli parametr ctrl.Name, którego nigdzie w kodzie w tej chwili nie wykorzystujesz.

    Sposobów na podzielenie tych 30 checkboxów na grupy jest kilka.
    Najprostszy: na formę wrzuć ramki Frame, a checkboxy umieść pogrupowane w tych ramkach. Jeżeli np. w ramce Frame1 umieścisz 5 checkboxów, to pętla która będzie tylko je sprawdzać, wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Druga opcja, bez użycia ramek, jest np. taka:
    każda kontrolka ma parametr Tag. Jest to zmienna dowolnego typu, która może być wykorzystana przez użytkownika do czegokolwiek. Pogrupuj checkboxy w ten sposób, że np. w pięciu wpisz w tag grupa1, trzem grupa2, sześciu grupa3 etc.
    Wtedy możesz zmienić jeszcze jeden warunek, który będzie wyglądał tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Oczywiście dla pozostałych grup możesz zrobić podobnie.

    PS. Naprawdę polecam przerobienie jakiegoś kursu, bo mam wrażenie że na razie poruszasz się po omacku, metodą prób i błedów...

    0
  • #28 11 Gru 2011 01:24
    amator_piotr
    Poziom 12  

    [quote="marcinj12"]

    amator_piotr napisał:
    jesli wszystkie beda nosic ta sama nazwe to petla bedzie "przeszukiwac" wszystkie True.
    Musisz rozróżniać dwa pojęcia: każda kontrolka ma wiele parametrów, m.in. TYP oraz NAZWĘ.
    Każdy z tych 30 checkboxów o których piszesz ma ZAWSZE typ "Checkbox", czyli ten fragment pętli MUSI być taki:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    . Jeżeli zamiast "CheckBox" wpiszesz cokolwiek innego, to NIGDY się ten fragment wewnątrz nie wykona. Dlatego w #23 poście pytałem, czemu zmieniłeś ten fragment na zły.

    To, co Ty sobie zmieniasz żeby było łatwiej, to najwyżej NAZWY checkboxów, które są niepowtarzalne, czyli parametr ctrl.Name, którego nigdzie w kodzie w tej chwili nie wykorzystujesz.

    Sposobów na podzielenie tych 30 checkboxów na grupy jest kilka.
    Najprostszy: na formę wrzuć ramki Frame, a checkboxy umieść pogrupowane w tych ramkach. Jeżeli np. w ramce Frame1 umieścisz 5 checkboxów, to pętla która będzie tylko je sprawdzać, wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Druga opcja, bez użycia ramek, jest np. taka:
    każda kontrolka ma parametr Tag. Jest to zmienna dowolnego typu, która może być wykorzystana przez użytkownika do czegokolwiek. Pogrupuj checkboxy w ten sposób, że np. w pięciu wpisz w tag grupa1, trzem grupa2, sześciu grupa3 etc.
    Wtedy możesz zmienić jeszcze jeden warunek, który będzie wyglądał tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Oczywiście dla pozostałych grup możesz zrobić podobnie.

    PS. Naprawdę polecam przerobienie jakiegoś kursu, bo mam wrażenie że na razie poruszasz się po omacku, metodą prób i błedów...[/qu

    wielkie dzieki :) za wyjasnienie jak i poomoc

    masz racje poruszam sie po omacku. sadzilmel ze VBA studio to tosamo co VB dla aplikacji. jak narazie starcza mi czasu na nauke jednego dleatego tez wyglada to tak jak wyglada. po za tym w VBA 2010 jest troche inny i latwiej jak widze.
    jak zauwazyles rowniez jestemw domu okolo 23.00 stad tez rowniez metoda prob i bledow. :) sorrki za przysparzanie....

    jesli chodzi o przerobienie materialu ktory mi przeslales zaczalem i mysle ze w przyszlosci bedzie to wygladalo zupelnie inaczej.

    raz jeszcze wielkie dzieki.
    jesli bede mial jakies pytanie do Ciebie czy moge wyslac email?

    pozdrawiam

    0
  • #29 05 Sty 2012 23:46
    amator_piotr
    Poziom 12  

    witam ponownie

    Szczesliwego Nowego Roku.

    nie wiem czy masz doswiadczenie w VB Studio 2010. nie wiem jak przeksztalcic projekt ktory staralem sie opracowac w VB Studio 2010. Utworzylem szablon Excel'a. Co musialbym zrobic aby go przeksztalcic w plik Excel'a?

    prosze odpowiedz na forum abym mogl Ci sie "odwdzieczyc"

    pozdrawiam

    0
  • #30 06 Sty 2012 00:10
    marcinj12
    Poziom 40  

    Witam, witam...
    Na tym forum jest więcej ludzi, nigdy nie wiesz kto odpowie ;)
    Niestety, w Visual Basic z Visual Studio robi się kompletnie inne projekty niż w VBA w Excelu - to drugie jest mocno okrojoną wersją wspomnianego. Jedynie składnia języka jest trochę podobna, ale nie ma możliwości przeniesienia projektu z VS do Excela.
    Pozostaje ponowne wykonanie (podobnej) formy w Excelu i przekopiowanie kodu z funkcji/procedur, poprawiając wszelkie fragmenty, które nie są zgodne z językiem VBA (a będzie tego sporo, bo VS opiera się o platformę .NET która jest zupełnie obca w VBA, więc multum funkcji będzie trzeba wymyślać na nowo).
    Ale skoro zacząłeś robić ten projekt w Visual Studio, to po co przenosić go do Excela?? Ja bym dalej go robił w VS.

    0