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

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

amator_piotr 29 Nov 2011 00:44 11877 35
  • #1
    amator_piotr
    Level 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]
  • Helpful post
    #2
    adamas_nt
    Moderator of Programming
    Domyślam się, że dotyczy to formularza i pól wyboru. Spróbuj
    Code: vb
    Log in, to see the code
    W arkuszu będzie podobnie.
  • #3
    amator_piotr
    Level 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
  • Helpful post
    #4
    marcinj12
    Level 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ż.
  • #5
    amator_piotr
    Level 12  
    amator_piotr wrote:
    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.
  • Helpful post
    #6
    marcinj12
    Level 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.
  • #7
    amator_piotr
    Level 12  
    marcinj12 wrote:
    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 wrote:
    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 :)
  • Helpful post
    #8
    marcinj12
    Level 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.
  • #9
    amator_piotr
    Level 12  
    marcinj12 wrote:
    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 :)
  • Helpful post
    #10
    adamas_nt
    Moderator of Programming
    amator_piotr wrote:
    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
  • #11
    amator_piotr
    Level 12  
    Wielkie dzieki :)
  • #12
    amator_piotr
    Level 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
  • Helpful post
    #13
    adamas_nt
    Moderator of Programming
    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.
  • Helpful post
    #14
    marcinj12
    Level 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 ;).
  • #15
    amator_piotr
    Level 12  
    marcinj12 wrote:
    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 wrote:
    marcinj12 wrote:
    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.
  • #16
    amator_piotr
    Level 12  
    marcinj12 wrote:
    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"
  • #17
    marcinj12
    Level 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:
    Code: vb
    Log in, to see the code
  • #18
    amator_piotr
    Level 12  
    marcinj12 wrote:
    "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:
    Code: vb
    Log in, to see the code


    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")
  • #19
    marcinj12
    Level 40  
    amator_piotr wrote:
    czy ta petala wpisuje w postaci listy "wynik" wiecej nizeli z jednego CheckBox'u
    Nie, bo napisałeś:
    amator_piotr wrote:
    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):
    Code: vb
    Log in, to see the code



    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 ;)
  • #20
    amator_piotr
    Level 12  
    marcinj12 wrote:
    amator_piotr wrote:
    czy ta petala wpisuje w postaci listy "wynik" wiecej nizeli z jednego CheckBox'u
    Nie, bo napisałeś:
    amator_piotr wrote:
    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?
  • #21
    marcinj12
    Level 40  
    Pytałeś czy jest kod który po zaznaczeniu wpisuje wartość.
    Quote:
    aha zapomnialem zapytac, czy jest kod ktory po zaznaczeniu CheckBox'u natychmiast wpisze wartosc.Caption w Range("a1")


    Aby robił to po odznaczeniu:
    Code: vb
    Log in, to see the code
  • #22
    amator_piotr
    Level 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?
  • #23
    marcinj12
    Level 40  
    A dlaczego zmieniłeś nazwę typu kontrolki na "cbxType" ??
  • #24
    amator_piotr
    Level 12  
    marcinj12 wrote:
    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.
  • #25
    marcinj12
    Level 40  
    Chodziło mi o nazwę typu:
    Code: vb
    Log in, to see the code

    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.
  • #26
    amator_piotr
    Level 12  
    marcinj12 wrote:
    Chodziło mi o nazwę typu:
    Code: vb
    Log in, to see the code

    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:


    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
  • #27
    marcinj12
    Level 40  
    amator_piotr wrote:
    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:
    Code: vb
    Log in, to see the code
    . 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:

    Code: vb
    Log in, to see the code


    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:
    Code: vb
    Log in, to see the code

    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...
  • #28
    amator_piotr
    Level 12  
    [quote="marcinj12"]
    amator_piotr wrote:
    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:
    Code: vb
    Log in, to see the code
    . 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:

    Code: vb
    Log in, to see the code


    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:
    Code: vb
    Log in, to see the code

    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
  • #29
    amator_piotr
    Level 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
  • #30
    marcinj12
    Level 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.