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 - Połączenie dwóch makr worksheet_change

17 Cze 2013 16:33 2364 5
  • Poziom 8  
    Cześć
    Jak się okazało nie można mieć dwóch makr "worksheet_change". Doczytałem że jedyną opcją jest ich połączenie w jedno makro. Czy ktoś jest wstanie mi pomóc?
    Poniżej dwa makra:
    Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.ListObject = ("tabela1") Then
        If Target.Column = 11 Then
            If Target.Value = "x" Then
                'Range("tabela1[Nazwa4]") = Range("Tabela2[Nazwa5]")
                Target.Offset(0, 1) = Target.Offset(0, 2)
            Else
                'Range("tabela1[Nazwa4]") = ""
                Target.Offset(0, 1) = ""
            End If
        End If
    End If
    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim changed As Range, c As Range
        Dim cVal

        Const myR As String = "Tabela1[[nazwa3]:[nazwa7]],tabela1[[nazwa9]:[Nazwa13]],tabela[nazwa19]"
       
        Set changed = Intersect(Target, Range(myR))
        If Not changed Is Nothing Then
            Application.EnableEvents = False
            For Each c In changed
                cVal = c.Value
                Select Case True
                    Case IsEmpty(cVal), IsNumeric(cVal), _
                            IsDate(cVal), IsError(cVal)
                        ' Do nothing
                    Case Else
                        c.Value = UCase(cVal)
                End Select
            Next c
            Application.EnableEvents = True
        End If
    End Sub
  • Moderator Programowanie
    Zwykle rozwiązaniem jest rozgałęzienie instrukcji If. Np
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 31  
    kelels napisał:
    Cześć
    Jak się okazało nie można mieć dwóch makr "worksheet_change"..

    W ogóle nie można używać wielu makr o tych samych nazwach.
    Skąd program "miałby wiedzieć" które z nich uruchomić?

    T.z.n. można, ale dla każdego arkusza musi być przypisane oddzielnie i musi być Private.
  • Poziom 8  
    adamas_nt napisał:
    Zwykle rozwiązaniem jest rozgałęzienie instrukcji If. Np
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Mógłbyś to rozwinąć bardziej bo sobie nie radzę.
    Szukałem o tym poleceniu ale googiel ma mnie w nosie...
    Spróbowałem wpisać tak ale wywala błąd:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Moderator Programowanie
    Ojej, nie myślałem, że weźmiesz to dosłownie ;)

    Już tłumaczę i objaśniam:
    1. Nie możesz stosować dwóch procedur o tej samej nazwie. W Twoim przypadku zdublowałeś Worksheet_Change.

    2. W poruszonej procedurze zdarzeniowej, przekazywany jest argument typy Range, zadeklarowany jako zmienna Target. Obiekt Range posiada własności (members), stąd skrót i... nieporozumienie.

    3. Jeśli chcesz testować wiele zakresów w obrębie jednej procedury zdarzeniowej, musisz zastosować instrukcję If lub Select Case.

    Może zdarzyć się sytuacja, że oba warunki będą spełnione. O kolejności wykonywania kodu w takim przypadku decyduje kolejność zapisu. Np komórka A1 mieści się w Target.Row = 1 oraz Target.Column =1

    Sprawdź w swoim arkuszu działanie następującej procedury
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Zastrzegam, że nie analizowałem przypisania. Skopiowałem po prostu z Twoich postów.
    Jeśli działanie jest zgodne z założeniami, doklej sobie resztę...
  • Poziom 8  
    Wiem wiem na brak wiedzy nie ma lekarstwa ;) ale dzięki za zrozumienie i wytłumaczenie łopatologicznie choć i tak nie wiem czy to mi wystarczy :D.

    Więc tak Twój zapis działa bez zarzutu ale tylko w przypadku kiedy piszę po tabeli1, pojawia się okienko ze spełnionym warunkiem 1. Gdy próbuję pisać w komórkach poza tabelą1 wyświetla się błąd:

    Code:
    object variable or with block variable not set


    i zaznacza tą linię jako nieprawidłową

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Tak na marginesie po wklejeniu obu makr, oba działają prawidłowo w obrębie tabeli po za nią jak wyżej.

    Dzięki za pomoc :)