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 2007 Automatyczne czyszczenie zakresu komórek wg konkretnej daty.

Kasia_2 10 Kwi 2015 19:57 2778 46
  • #1 10 Kwi 2015 19:57
    Kasia_2
    Poziom 8  

    Witam.
    Cały dzień myślałam nad tym i żadne skuteczne rozwiązanie mi do głowy nie przyszło dlatego proszę Was o pomoc.
    Mam zakres komórek, które są na bieżąco uzupełniane tylko do końca każdego miesiąca.
    Kiedy następuje kolejny miesiąc ręcznie czyszczę formularz (ten zakres komórek jw.) a chciałabym to zautomatyzować, no i nie wiem jak.
    Jeżeli można to zrobić jakaś formułą, to może nawet lepiej.
    Proszę Was zatem o jakąś podpowiedź.
    Z góry dziękuję.

    0 29
  • #3 12 Kwi 2015 10:43
    Kasia_2
    Poziom 8  

    Bardzo dziękuję. Prawie o to mi chodziło, więc trochę zmodyfikowałam i jest prawie ok tylko, że teraz nie mogę poradzić sobie z dobraniem zdarzenia.

    W komórce B1 jest formuła, która pobiera dzień z daty i jeżeli zmienia się on (dzień w B1) na 1, to chciałabym aby wyskakiwał monit z zapytaniem czy to jest 1 dzień miesiąca, bo od tego jest uzależnione czyszczenie baz (bazy są dwie).
    Poniżej kod to tego:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Worksheets("Formularz").Range("B1") = "1" And Worksheets("Formularz").Range("H12") <= "0" Then
    inf = MsgBox("Wpisujesz nowy miesiąc?", vbYesNo, "UWAGA")
    If inf = vbYes Then Worksheets("Baza").Range("A8:AO1000").ClearContents
    If inf = vbYes Then Worksheets("Baza_2").Range("A8:AO1000").ClearContents
    If inf = vbNo Then Exit Sub
    Cancel = True
    End If

    End Sub

    I teraz jak wsadzam to w Change, to musze kliknąć na tą 1, a dąże do tego aby po samej zmianie w B1 bez klikania wywoływało zdarzenie.

    Czy da się to zrobić? :)

    0
  • #4 12 Kwi 2015 10:53
    JRV
    Specjalista - VBA, Excel

    Worksheet_Calculate

    0
  • #6 12 Kwi 2015 11:47
    Kasia_2
    Poziom 8  

    Dziękuje Panowie, zatem tak: nie wiem co źle robie, ale Worksheet_Calculate wywołuje okienko, ale się wiesza i na wielokrotne potwierdzanie nie reaguje. Teraz mam taki kod:

    Private Sub Worksheet_Calculate()
    If Worksheets("Formularz").Range("B1") = "1" And Worksheets("Formularz").Range("H12") <= "0" Then
    inf = MsgBox("Wpisujesz nowy miesiąc?", vbYesNo, "UWAGA")
    If inf = vbYes Then Worksheets("Baza").Range("A8:AO1000").ClearContents
    If inf = vbYes Then Worksheets("Baza_2").Range("A8:AO1000").ClearContents
    If inf = vbNo Then Exit Sub
    Cancel = True
    End If

    End Sub

    PRL - Załacznik został skasowany?

    Dodano po 8 [minuty]:

    Już mam załącznik, dzięki. Wlaśnie go testuję.

    Dodano po 18 [minuty]:

    Ja nie wiem co jest źle, na Twoim formularzu działą, a na moim ani huhu. Ale nawet jeśli zadziała jest jeszcze taki problem, że nie wszyscy, którzy będą obsługiwali ten formularz będą go zamykać i ponownie otwierać. Zatem to zdarzenie musi być takie, ze jeśli bez dotykania formularza zmieni się data, to wtedy wywołuje zdarzenie. Ostatecznie może być z tym zamykaniem, ale i tak u mnie nie działa.

    A może w ogóle jest inny sposób na czyszczenie bazy po skończonym miesiącu?

    0
  • #7 12 Kwi 2015 12:00
    PRL
    Poziom 34  

    Umieść poniższy kod w module arkusza:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Wadą tego rozwiązania jest to, że dopóki jest pierwszy dzień miesiąca, a nie doprowadzisz do wyczyszczenia komórek, to będziesz pytana tyle razy ile razy następuje zdarzenie przeliczania arkusza.
    Co Ty na to JRV? Może masz lepszy pomysł...

    P.S. Trochę się zdziwiłem, że arkusz jest otwarty non stop...

    0
  • #8 12 Kwi 2015 12:18
    Kasia_2
    Poziom 8  

    Mogę Ci wysłać mój formularz?

    0
  • #10 12 Kwi 2015 12:21
    Kasia_2
    Poziom 8  

    Szczerze mówiąc nie wiem co to jest JRV. Jak ktoś jest na nocnym dyżurze z 31 na 1 to uzupelnia i 31 i 1 nowego miesiąca. Sa tacy, co otwierają formularz po przyjściu i zamykają po wyjściu albo i nie.

    0
  • #11 12 Kwi 2015 12:29
    PRL
    Poziom 34  

    Cytat:
    Szczerze mówiąc nie wiem co to jest JRV


    No to się wykazałaś... JRV, to nasz Kolega.:)

    Plik dotarł, zaraz go zrobię.

    0
  • #12 12 Kwi 2015 12:31
    Kasia_2
    Poziom 8  

    Ojej hihi sorry. Mam nadzieję, ze Kolega mi wybaczy :).

    0
  • Pomocny post
    #13 12 Kwi 2015 12:57
    JRV
    Specjalista - VBA, Excel

    PRL napisał:
    Co Ty na to JRV?

    Gdyby arkusza, byłoby to rozwiązanie

    1
  • #14 12 Kwi 2015 13:04
    PRL
    Poziom 34  

    Tak też zrobiłem. Umieściłem kod dla arkusza 'Formularz'.
    Ciekawe co na to Kasia.

    0
  • #15 12 Kwi 2015 13:07
    Kasia_2
    Poziom 8  

    Przetestowałam, ale nie działa. To znaczy w pewnym sensie działa, bo wywołuje okienko, ale się wiesza, nie można go zamknąć.
    Nie wiem dlaczego ten fragment kodu:

    If Worksheets("Formularz").Range("B1") > 1 Then Sheets("Formularz").Range("AC1") = 0

    zwraca 0 kiedy w B1 jest dzień pierwszy. Przecież 1 nie jest większy od 1.

    0
  • #17 12 Kwi 2015 13:38
    Kasia_2
    Poziom 8  

    Już prawie działa idealnie, tylko, że dla wyboru TAK wiesza się, natomiast dla wyboru NIE nie czyści bazy czyli ok i jak nie, to się wyłącza.

    A czy ten fragment kodu nie gryzie się?

    If Worksheets("Formularz").Range("B1") > 1 Then Sheets("Formularz").Range("AC1") = 0
    If Worksheets("Formularz").Range("B1") = 1 and Worksheets("Formularz").Range("H12") <= 0 And Sheets("Formularz").Range("AC1") = 0 Then

    czy po pierwszym If nie powinno być ElseIf?

    0
  • #19 12 Kwi 2015 13:55
    Kasia_2
    Poziom 8  

    Irek się opiera :p

    Czy w tej ostatniej wersji wywołuje się okienko czyszczenia bazy po kliknieciu w pierwszy pomiar? bo w tej chwili tak u mnie działa. No i trochę dalej się wiesza, nie wiem co jest.
    Dziękuję serdecznie za wskazówki.

    0
  • #20 12 Kwi 2015 14:29
    JRV
    Specjalista - VBA, Excel

    Teraz będą Goście we mnie(Welkanoc), jeśli nadal aktualne, a potem

    0
  • #21 13 Kwi 2015 11:41
    Kasia_2
    Poziom 8  

    Witajcie ponownie. Nie zdążyłam już wczoraj przetestować tego arkusza. Natomiast dzisiaj już wszystko wiem.

    Teraz mam kod w module:

    Sub CB() 'czysc baze

    If Worksheets("Formularz").Range("B1") > 1 Then Worksheets("Formularz").Cells(1, 29) = 0
    If Worksheets("Formularz").Range("B1") = 1 And Worksheets("Formularz").Range("H12") = "" And Worksheets("Formularz").Cells(1, 29) = 0 Then
    inf = MsgBox("Wpisujesz nowy miesiąc?", vbYesNo, "UWAGA")
    If inf = vbYes Then
    Worksheets("Baza").Range("A8:AO1000").ClearContents
    Worksheets("Baza_2").Range("A8:AO1000").ClearContents
    Worksheets("Formularz").Cells(1, 29) = 1
    End If
    If inf = vbNo Then Exit Sub
    End If

    End Sub

    A wywoływany jest w change:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$E$7" Or Target.Address = "$P$7" Or Target.Address = "$AA$7" Or Target.Address = "$AL$7" Then
    MsgBox "Przypomnienie o wpisaniu uwag.", vbOKOnly + vbInformation, "Uwaga!"
    End If
    Call CB 'ma czyscic baze
    End Sub

    I w zasadzie to działa, tylko, że mimo iż nie jest dopisane do CLIK to 2 razy wywołuje się po kliknięciu w "ZAPIS".
    Jeszcze tylko to stoi mi na przeszkodzie i najgorsze, ze do jutra musze to zrobić.

    Pomożecie? :)

    0
  • #22 13 Kwi 2015 12:02
    PRL
    Poziom 34  

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dlaczego wywołanie 'CB' jest poza warunkiem?

    0
  • #23 13 Kwi 2015 12:13
    Kasia_2
    Poziom 8  

    DZIAŁA! hura! wielkie dzięki! ale chyba jeszcze tu napisze, bo mam problem z kolei z wyświetlaniem liczb. Zamiast np. 1,8 to zwraca 1,7453256 i jak wpisuje formułe zaokr() to niby jest ok, ale z kolei źle przelicza. Tak się zastanawiam czy makrem nie potraktować całego arkusza.

    0
  • #24 13 Kwi 2015 12:15
    PRL
    Poziom 34  

    Cytat:
    Zamiast np. 1,8 to zwraca 1,7453256 i jak wpisuje formułe zaokr() to niby jest ok, ale z kolei źle przelicza.


    Dlaczego nie korzystasz z formatowania komórek?

    0
  • #25 13 Kwi 2015 12:24
    Kasia_2
    Poziom 8  

    Jeżeli chodzi o takie zwyczajne formatowanie, to działa tylko wizualnie, a gdzies w pamięci przechowuje taka liczbę. To formatowanie by pomogło, ale ja mam w wydruku formuły przekształcające "," na "." i na to formatowanie nie działa. Czasami zwraca właśnie taka długa liczbe.

    JEŻELI($P51="";"";JEŻELI($P51=LICZBA.CAŁK($P51);ZŁĄCZ.TEKSTY($P51;".0");PODSTAW($P51;",";".")))

    P51 wyswietla wynik tylko, że z przecinkiem.

    0
  • #26 13 Kwi 2015 12:30
    PRL
    Poziom 34  

    Public Function Zaokr(L, m) As Double
    Zaokr = Int(CDec(L) * 10 ^ m + 0.5) / 10 ^ m
    End Function

    0
  • #27 13 Kwi 2015 12:49
    Kasia_2
    Poziom 8  

    A potem powiem, ze sama wszystko wymyśliłam hihi. Zaraz przetestuję, dziękuję. Czy ta funkcje mam wstawić w Module?

    0
  • #28 13 Kwi 2015 12:55
    PRL
    Poziom 34  

    Cytat:
    A potem powiem, ze sama wszystko wymyśliłam


    Myślałem, że to ulepszenie w pracy, a nie coś na zaliczenie...
    Funkcję umieść w module.
    Resztę Irek Ci powie.;)

    0
  • #29 13 Kwi 2015 13:00
    Kasia_2
    Poziom 8  

    Tak do pracy ale kier będzie zaliczal jakkolwiek to brzmi hihi

    0
  • #30 13 Kwi 2015 13:09
    PRL
    Poziom 34  

    Wydaje mi się, że nie jesteś na etacie programisty i/lub nie masz w obowiązkach zapisanych takowych obowiązków.

    0