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.

Funkcja VBA w Excelu nie działa przy przełączaniu arkuszy

AJOT74 28 Sty 2011 16:27 2284 4
  • #1 28 Sty 2011 16:27
    AJOT74
    Poziom 10  

    Mam jeden arkusz który ma działać przy uruchomieniu i następnie po uruchomieniu, wygląda to tak:

    Code:
    'to jest działanie po uruchomieniu
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Symbole
    Application.EnableEvents = False
    With Target
     Symbole = UCase(.Value)
     Select Case Symbole
      Case "PS1"
       .Value = "Ps1"
      Case "PS2"
       .Value = "Ps2"
      Case Else
       MsgBox "Wprowadzony skrót jest nieprawidłowy!"
       .Value = ""
     End Select
    End With
    Application.EnableEvents = True
    End Sub

    'to jest działanie przy uruchomieniu
    Private Sub worksheet_activate()
    Dim wartosc As Long
    Dim mies, rok, x, y, poz, fuls
    Range("A1:I80").Clear
    mies = 0: rok = 0
    Do While rok = 0
     mies = InputBox("Wprowadź numer dnia dla którego ma być utworzone obłożenie:", "Grafik DGP")
     rok = 1
     If mies < 1 Then
      MsgBox "Wprowadzony numer dnia jest błędny!"
      rok = 0
     End If
     If mies > 31 Then
      MsgBox "Wprowadzony numer dnia jest błędny!"
      rok = 0
     End If
    Loop
    Range("A3:C3").Select
    Selection.Merge
    Range("D3:F3").Select
    Selection.Merge
    Range("G3:I3").Select
    Selection.Merge
    Range("A1").Select
    Range("A3") = "A"
    Range("A3").Font.Size = 16
    Range("A3").Font.Bold = True
    Range("A3").HorizontalAlignment = xlCenter
    With Range("A3:C3").Borders
     .LineStyle = xlContinuous
     .ColorIndex = xlColorIndexAutomatic
     .Weight = 4
    End With
    Range("D3") = "B"
    Range("D3").Font.Size = 16
    Range("D3").Font.Bold = True
    Range("D3").HorizontalAlignment = xlCenter
    With Range("D3:F3").Borders
     .LineStyle = xlContinuous
     .ColorIndex = xlColorIndexAutomatic
     .Weight = 4
    End With
    Range("G3") = "C"
    Range("G3").Font.Size = 16
    Range("G3").Font.Bold = True
    Range("G3").HorizontalAlignment = xlCenter
    With Range("G3:I3").Borders
     .LineStyle = xlContinuous
     .ColorIndex = xlColorIndexAutomatic
     .Weight = 4
    End With
    '...............dalsza część kodu
    End Sub

    Problem w tym, że gdy arkusz jest otwarty to można wpisywać te symbole, gdy jednak zmienimy na inny arkusz a po czym wracamy to zamiast tworzenia się arkuszu następuje błąd.
    Znak ktoś jakiś sposób na ominięcie tego?

    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0 4
  • #2 28 Sty 2011 16:36
    Ksysiek
    Poziom 14  

    Sugestia - używaj znaczników code .

    0
  • #3 28 Sty 2011 16:43
    AJOT74
    Poziom 10  

    Proszę Cię bardzo...

    Mam jeden arkusz który ma działać przy uruchomieniu i następnie po uruchomieniu, wygląda to tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Problem w tym, że gdy arkusz jest otwarty to można wpisywać te symbole, gdy jednak zmienimy na inny arkusz a po czym wracamy to zamiast tworzenia się arkuszu następuje błąd.
    Znak ktoś jakiś sposób na ominięcie tego?

    0
  • Pomocny post
    #4 28 Sty 2011 17:36
    marcinj12
    Poziom 40  

    Polecam zaprzyjaźnić się z debuugerem. Pomaga na zgryzoty :D

    Wstawiasz break ("czerwone kółko") na początku obu funkcji, ale nie przy deklaracji zmiennych (klikając na szarym polu po lewej stronie kodu).
    Potem robisz jakąś akcję w excelu, np. zmieniasz arkusze, i kiedy program zatrzyma wykonywanie w zaznaczonym miejscu, wciskając F8 przechodzisz kolejne linie krok po kroku.

    Jak to zrobisz, to zauważysz, że program wywala się na linijce Worksheet_Change:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    , bo kiedy dokonujesz czyszczenia zakresu A1:I80 w Worksheets.Activate, wywołuje się funkcja Worksheet_Change.
    Wartość Target.Value jest wtedy tablicą, na której nie działa funkcja UCase().

    Tutaj - nomen omen - warto skorzystać z wyłączenia zdarzeń, najlepiej w całym zdarzeniu worksheet_activate. Zrób to tak jak w pierwszym kodzie, żeby na czas operacji na arkuszu nie wywoływać zdarzenia o Worksheet_Change..

    Tak nawiasem mówiąc, nie bardzo wiem co ma robić Twoje makro: Worksheet_Change. W tej chwili pozwala wpisać tylko dwie wartości: PS1 i PS2 w komórkę w obrębie całego arkusza. Jeśli chciałeś ograniczyć wybór do tych dwóch wartości, wybrałeś dziwną drogę...

    Zwykle takie rzeczy robi się wybierając w komórce listę (Dane->Sprawdzanie poprawności->Lista...).
    Idąc dalej - można zablokować arkusz tak, żeby użytkownik mógł tylko wybierać wartości z list.
    Ewentualnie, w zdarzeniu Worksheet_Change sprawdza się na samym początku kolumnę, w której nastąpiła zmiana:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #5 28 Sty 2011 17:50
    AJOT74
    Poziom 10  

    Całość kodu była dosyć spora do umieszczenia tutaj dlatego powstał tylko zarys.
    Dzięki za pomoc...

    0