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 VBA - problem z oskryptowaniem

04 Cze 2009 16:14 3631 10
  • Poziom 10  
    Witajcie,

    Mam problem z oskryptowaniem pliku zamieszczonego w załączniku.
    Ma on ukazywać wyniki ankiety przeprowadzonej na uczelni.

    Ale po kolei:

    1. Z pola rozwijanego D7 wybiera się wartość oceny z zakresu 2-5

    2. Do odpowiednich wartości przyporządkowana jest odpowiednia komórka:
    dla 5 D8
    dla 4 D9
    dla 3 D10
    dla 2 D11

    3. Po wybraniu odpowiedniej wartości (np. 5) czytana jest zawartość odpowiadającej jej komórki ( D8 ) i jest dodawane do niej 1.

    4. Po wybraniu innej wartości 1 jest dodawane do aktualnej wartości odpowiadającej jej komórki.

    5. Po wyjściu z pliku aktualnie wartości nie powinny się zerować.

    6. Formularz będzie zawierał ok 50 wykładowców, także każde z pól wyboru podejrzewam trzeba będzie pojedynczo oskryptować.

    7. Po wprowadzeniu wszystkich danych z całej ankiety wypełnione są odpowiednie dla niej komórki ( np. wykładowca otrzymał z poszczególnych pytań 5,5,4,4,5 - także zapełnione są komórki D8,E8,F9,G9 i H8 ).

    8. I w momencie kiedy ponownie wybieramy z pola D7 jakąś wartość jest ona dodawana do bieżącej wartości odpowiadającej jej komórki.

    Jeśli ktoś ma jakiś pomysł będę wdzięczny za wszelką pomoc.
  • Moderator Programowanie
    Zapytam:
    1. Liczyć chcesz ilość ocen (ile piątek w D5 itd)? Tzn pola określone w pkt.7 są wypełnione jedynkami?

    Podpowiedzi:
    1. Z sumami i średnią poradzisz sobie bez VBA.
    2. Ad.5, 7 i 8 Użyj osobnego arkusza do przechowywania danych.
    3. Formularzowe pola kombi trudniej oprogramować niż ActiveX (Np ListIndex) a można by tę właściwość wykorzystać do dodawania i zapisywania.
    4. Ad.6 Niekoniecznie. Jeżeli użyjesz pola kombi do wyboru wykładowcy, to można wykorzystać wartość ListIndex tego pola do przydzielenia odp. zakresu przechowywania ilości ocen, jednocześnie wykorzystując w tabelce funkcję PRZESUNIĘCIE jako wartość podając ten właśnie indeks do połączenia danych (ocen z wykładowcą).
  • Poziom 10  
    Dokładnie, chcę liczyć ilość głosów oddanych na daną ocenę. To znaczy nie będzie to wpisywane na zasadzie 1,1,1,1,... tylko będzie dodawane (0+1=1 1+1=2 itd).

    ad. 1. z sumami poradzę sobie bez VBA to doskonale wiem :)

    ad. 2. fajnie, tylko trzeba by to jakoś oskryptować w VBA - a ja to raczej lepiej się czuję w html, css, javascript, php i mysql. :D

    ad. 3. a możesz na ten temat napisać coś więcej (co, jak i gdzie? )

    ad. 4. a tego to już wogóle nie wiem jak zrobić :)
  • Pomocny post
    Moderator Programowanie
    W załączniku przykład dla kolumny D. Użyłem pól kombi ActiveX, zwróć uwagę na ich właściwości. Kod jest prosty, więc nie powinno być kłopotów z adaptacją dla kolejnych ComboBox'ów.
  • Poziom 10  
    Wielkie dzięki, o to mi właśnie chodziło :D A mam pytanko, czy ewentualnie mogłbyś mi oskryptować te trzy pozostałe pola combo, bo jakoś mi to nie wychodzi? . Z góry dziekuję.
  • Moderator Programowanie
    A z czym konkretnie masz problem? Inni też chcieliby się pewnie nauczyć...
  • Poziom 10  
    Code:
    Private Sub ComboBox2_Change()
    
    Range("B7") = ComboBox2.ListIndex
    End Sub


    To czaję i nie ma problemu.

    Code:
    Private Sub ComboBox1_DropButtonClick()
    
    wiersz = ComboBox2.ListIndex + 2
    With Sheets("Arkusz2")
    Select Case ComboBox1.ListIndex
        Case 0: .Range("C" & wiersz) = .Range("C" & wiersz) + 1
        Case 1: .Range("D" & wiersz) = .Range("D" & wiersz) + 1
        Case 2: .Range("E" & wiersz) = .Range("E" & wiersz) + 1
        Case 3: .Range("F" & wiersz) = .Range("F" & wiersz) + 1
    End Select
    End With
    ComboBox1.ListIndex = -1
    ComboBox1.Text = "wybierz"
    End Sub


    tutaj kod też prawie cały czaję, z małymi ale

    Powiedz mi proszę jak wstawić to rozwijalne pole w arkuszu (obecnie siedzę w domciu i używam Excela 2007). Rozumiem, że zmienna wiersz odnosi się w jakiś sposób do komórki, w której znajdować się będzie pole Combo. czyli w przypadku komórki pod "b" będzie to +3 jeśli dobrze rozumiem?

    Z tego co robiłem to zmieniałem skrypt w sposób podany poniżej (dla pola pod "B"
    Code:
    Private Sub ComboBox3_DropButtonClick()
    
    wiersz = ComboBox2.ListIndex + 2
    With Sheets("Arkusz2")
    Select Case ComboBox3.ListIndex
        Case 0: .Range("C" & wiersz) = .Range("C" & wiersz) + 1
        Case 1: .Range("D" & wiersz) = .Range("D" & wiersz) + 1
        Case 2: .Range("E" & wiersz) = .Range("E" & wiersz) + 1
        Case 3: .Range("F" & wiersz) = .Range("F" & wiersz) + 1
    End Select
    End With
    ComboBox3.ListIndex = -1
    ComboBox3.Text = "wybierz"
    End Sub


    ale to w żaden sposób nie zmieniło tego pola, które jest aktualnie wsadzone (ręcznie pole formularz/combobox

    Jak to zrobić nie wiem za cholerę. :(
  • Moderator Programowanie
    Użyłem Select Case, żeby nie zapisać pół strony instrukcją IfThenElse. Teraz jaśniej?
    Dobra, już tłumaczę.

    1. Takie (zgodne z VB) a nie inne pole kombi, bo zdarzenie "Przy zmianie" reaguje tylko na zmianę wartości. Gdybyś chciał wpisać te same oceny raz za razem, to zmiana by nie nastąpiła. Należało użyć innego zdarzenia, o które kombi formularza jest zbyt ubogie. Wstawiasz je na karcie Deweloper>Wstaw>Formaty ActiveX>Pole kombi. Te wcześniejsze usuń.

    2. Zwróć uwagę na właściwości pól kombi. W 2007 na zakładce Deweloper klikasz ikonę "Tryb projektowania", zaznaczasz pole kombi i klikasz ikonę "właściwości". Pole "ComboBox2" (te od profesorów, nazwy możesz zmienić pamiętając o zmianie w kodzie): "ListFillRange" wpisujesz zakres listy (kolumna B w arkuszu "Arkusz2", gdzie dopisujesz kolejnych psorów). Możesz nazwać zakres i wpisać w to miejsce, ale ich ilość będzie statyczna więc wystarczy jak dopasujesz do swoich potrzeb. Kolejne pola (ComboBox1, Combobox3...: właściwość "Tekst" wpisałem "wybierz" i dla pewności powtórzyłem to w kodzie przycisku. Umieściłem tam również zerowanie ideksu (ComboBox1.ListIndex = -1), żeby nie dublować dodawania. (klikasz przecież 2 razy. Raz w "strzałkę" i drugi raz w pozycję listy). Właściwość "ListFillRange" wpisujesz zakres z ocenami (u nas C8:C11). Czyli kolejność jest taka: Wstawiasz pole kombi, klikasz "Tryb projektowania", klikasz "właściwości", wpisujesz zakres listy, klikasz "wyświetl kod", wpisujesz procedurę, wyłączasz tryb projektowania, cieszysz się efektami.

    3. Właściwość ListIndex i instrukcja SelectCase. Każda pozycja listy ma indeks (pierwsza 0, druga 1 itd) Jak zauważyłeś do zmiennej "wiersz" przypisywany jest indeks na podstawie wyboru nauczyciela i określany Nr wiersza w arkuszu "Arkusz2". Pozostaje tylko wpisać Nr kolumny (literę w przypadku Range), w której znajdą się oceny. Wydaje się logiczne przyjąć następne 4 dla pytania "b", następne 4 dla "c" i tak dalej. Czyli dla odpowiedzi "b" kolejne kolumny to G,H,I,J
    Code:
    Select Case ComboBox3.ListIndex
    
        Case 0: .Range("G" & wiersz) = .Range("G" & wiersz) + 1
        Case 1: .Range("H" & wiersz) = .Range("H" & wiersz) + 1
        Case 2: .Range("I" & wiersz) = .Range("I" & wiersz) + 1
        Case 3: .Range("J" & wiersz) = .Range("J" & wiersz) + 1
    End Select


    4. Formuły: Użyłem PRZESUNIĘCIE, bo dla INDEKS musisz ustalić zakres, patrz B6. Tam zamiast INDEKS można użyć: =" " &PRZESUNIĘCIE(Arkusz2!A2;B7;0) i zapomnieć o zakresach. W B7 (pod polem kombi) makro wpisuje Nr indeksu wyboru nauczyciela i o tę wartość następuje przesunięcie.
    PRZESUNIĘCIE(odwołanie;wiersze;kolumny)
    Dla komórek E8:E11 będą to kolejno G2, H2, I2, J2 i tak dla następnych zgodnie z kodem przycisku.

    Uff, się rozpisałem. Myślę, że teraz (i w przyszłości) na pewno sobie poradzisz. Pozdrawiam.
  • Poziom 10  
    No i niestety poległem :(

    Chyba jestem jakiś niedorozwinięty, bo nie wiem co robię źle.

    Podsyłam plik, może mi powiesz, co robię źle?

    Z góry dzięki, miałem to mieć gotowe na dzisiaj rano, pewnie w poniedziałek będzie awantura.
  • Pomocny post
    Moderator Programowanie
    No, prawie :)

    Edit:
    Błąd w liczeniu średniej. W D13 należy wpisać
    Code:
    =(($C8*D8)+($C9*D9)+($C10*D10)+($C11*D11))/D12
    i skopiować (przeciągnąć) w prawo.
  • Poziom 10  
    No spoxik i oczywiscie wielkie dzieki. Wprowadziłem jeszcze parę poprawek, bo generalnie sumy i średnie miał liczyć inaczej i w zeszycie2.

    Szkoda, że nie mogę Ci za to postawić duuuużego browarka, bo bez wątpienia Ci się należy.

    Greetz for you - jesteś wielki.