logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Excel - VBA - Uruchamianie makra poprzez VBA na podstawie tekstu

mrgaj 21 Wrz 2018 14:33 2799 19
REKLAMA
  • #1 17452532
    mrgaj
    Poziom 9  
    Posty: 20
    Witam serdecznie.
    Zaczynam się uczyć języka VBA i mam pewien problem którego nie mogę przeskoczyć. Bardzo prosiłbym o pomoc.

    Mam arkusz

    W wierszu w poszczególnych komórkach np. F5,L5.... mam do wyboru TAK / NIE
    Chciałbym aby po wybraniu któregoś z tych słów uruchamiało się moje makro.

    Stworzyłem poniższy kod :

    Private Sub Worksheet_Change(ByVal Target As Range)
        
            Select Case Range("F5")
                Case "TAK": AUTOWIERSZ
                Case "NIE": AUTOWIERSZ
                
                End Select
                       
        
            
     
        End Sub
        


    Działa on - jednakże chciałbym aby działał on najlepiej na CAŁYM wierszu 5. Tzn gdziekolwiek w wierszu 5 będzie wyraz TAK/NIE - to uruchmi się makro. ( najlepiej jakby był cały wiesz ponieważ mam w wierszu ponad 1000 pozycji i wpisywanie kodu dla każdej komórki po kolei zajmię 100 lat :)

    z góry dziękuje bardzo za pomoc
  • REKLAMA
  • Pomocny post
    #2 17452546
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Argumentem procedur zdarzeniowych jest zmienna 'Targret' reprezentująca "obrabiany" zakres. Wystarczy więc jeśli Target.Row zwraca 5.
    Czyli zamiast select i tych wszystkich case'ów: if Target.Row=5 then itd.
  • REKLAMA
  • #3 17452559
    mrgaj
    Poziom 9  
    Posty: 20
    Dziękuję za szybką odpowiedź nie mniej jednak jestem baardzo początkujący mógłbyś mi zarysować jak taki kod wygląda w całości?
    dziękuję

    EDIT:

    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Row = 5 Then AUTOWIERSZ
        
            
     
        End Sub
        
        
    
    

    zrobiłem tak lecz makro uruchamia się po KAŻDEJ zmianie w KAŻDEJ komórce wiersza 5
    a mi chodzi aby uruchamiało się gdy zostanie wpisanie słowo TAK lub NIE
  • Pomocny post
    #4 17452573
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Komorka As Range

    If Not Application.Intersect(Rows(5), Range(Target.Address)) Is Nothing Then
    For Each Komorka In Target.Cells
    Select Case Komorka.Value
    Case "TAK":
    .
    .
    .
    End Select
    Next
    End If

    End Sub
  • REKLAMA
  • #5 17452579
    mrgaj
    Poziom 9  
    Posty: 20
    Loker napisał:
    Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Komorka As Range

    If Not Application.Intersect(Rows(5), Range(Target.Address)) Is Nothing Then
    For Each Komorka In Target.Cells
    Select Case Komorka.Value
    Case "TAK":
    .
    .
    .
    End Select
    Next
    End If

    End Sub


    Dziękuję ! o to chodziło ALE :) - teraz się uruchamia po wpisaniu GDZIEKOLWIEK w arkuszu słów TAK/NIE - a mi chodziło wyłącznie o konkretny wiersz 5
  • Pomocny post
    #6 17452590
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Najprościej:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    Jeśli w nagłówku dołożyć:
    Option Compare Text
    wtedy nie ma znaczenia wielkość liter.
  • Pomocny post
    #7 17452605
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    adamas_nt napisał:
    Najprościej:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    Jeśli w nagłówku dołożyć:
    Option Compare Text
    wtedy nie ma znaczenia wielkość liter.


    Nie zadziała jeśli target jest większy niż pojedyncza komórka (np. wklejanie kilku komórek).

    Odnośnie mojego przykładu - a u mnie działa ;) tzn. reaguje tylko na wiersz 5.

    Edit: Mała modyfikacja eliminująca pewną niedogodność przy wklejaniu kilku komórek na raz ;)

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • #8 17452612
    mrgaj
    Poziom 9  
    Posty: 20
    Cytat:

    Odnośnie mojego przykładu - a u mnie działa ;) tzn. reaguje tylko na wiersz 5.

    Edit: Mała modyfikacja eliminująca pewną niedogodność przy wklejaniu kilku komórek na raz ;)

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Dziękuję Ci bardzo ! Jesteś wielki :) Faktycznie działa tylko na 5 - gdzieś mi ta 5 uciekła wcześniej

    Jeszcze tylko gdzie w ten kod wcisnąć makro AUTOWIERSZ ? przy którym then :)
  • Pomocny post
    #9 17452686
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Zamiast MsgBox ("1")
  • REKLAMA
  • #10 17452697
    mrgaj
    Poziom 9  
    Posty: 20
    Dzięki tam też wstawiłem.

    Chciałem zostawić ten msg :) wpisałem sobie komunikat. Dlatego spytałem.
  • #11 17452719
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • #12 17458478
    mrgaj
    Poziom 9  
    Posty: 20
    [quote="mrgaj"]
    Cytat:

    Odnośnie mojego przykładu - a u mnie działa ;) tzn. reaguje tylko na wiersz 5.

    Edit: Mała modyfikacja eliminująca pewną niedogodność przy wklejaniu kilku komórek na raz ;)

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Witam ponownie.
    Wszystko działało do momentu dodania wielu danych w kolumnach.. Trochę tego jest = ponad 1.5k

    VBA działa - makro się uruchamia ale pojawia się błąd : Run time error 13 , Type missmatch
    Pokazuje błąd przy Case'ach

    Case "TAK"
    MsgBox ("Dziękuję za informacje !")
    AUTOWIERSZ

    Case "NIE"
    MsgBox ("Dziękuję za informacje !")
    AUTOWIERSZ

    Case "WARUNKOWO"
    MsgBox ("Dziękuję za informacje !")
    AUTOWIERSZ

    O co chodzi ? Czy VBA/Makro mają jakieś ograniczenia co do rekordów ?

    Dziękuje za pomoc
  • #13 17463985
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    A co jest w komórce, na której makro się "wykłada"?
    I co dokładnie robi AUTOWIERSZ?
  • #14 17473317
    mrgaj
    Poziom 9  
    Posty: 20
    Loker napisał:
    A co jest w komórce, na której makro się "wykłada"?
    I co dokładnie robi AUTOWIERSZ?


    Nie wiem ale gdzieś musiał się wkraść jakiś chochlik - zrobiłem od nowa i wszystko hula jak powinno.

    AUTOWIERSZ dodaje nowy wiersz wraz z formułami w poszczególnych komórkach.

    Dodano po 19 [godziny] 16 [minuty]:

    Troszkę muszę znów zmodyfikować początek kodu aby umieścić w innej karcie ( a nie umiem :(

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim Komorka As Range
    
    If Not Application.Intersect(Rows(5), Range(Target.Address)) Is Nothing Then
     For Each Komorka In Target.Cells
     If Komorka.Row = 5 Then
     Select Case Komorka.Value
     
    Case "AWARIA"
     MsgBox ("Dziękuję za informacje !")
     Send_Range
     
     
    Case "SPRAWNY"
     MsgBox ("Dziękuję za informacje !")
     Send_Range
     
     
    Case "WARUNKOWO"
     MsgBox ("Dziękuję za informacje !")
     Send_Range
      
      
     End Select
     End If
    
     Next
    End If


    Potrzebuję aby makro uruchamiało się po wybraniu w KOLUMNIE którejś z wartości : AWARIA,SPRAWNY,WARUNKOWO
    Najlepiej byłoby gdyby makro uruchamiało się na podstawie wykrycia powyższych wartości w AKTYWNEJ KOMÓRCE gdyż Kolumna ma sporo wierszy gdzie w większości już są wpisane powyższe wybory. Jeżeli MAKRO będzie zczytywać wartość z całej kolumny uruchomi się i powstanie zamknięta pętla ( w kółko będzie się odpalać ) a tego nie chcemy...? ( w kolumnie są już wpisy)


    dziękuję jeszcze raz za pomoc !
  • #15 17479077
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Worksheet_Change uruchamia się tylko w przypadku zmiany wartości jakichś komórek i pracuje tylko na tych zmienionych komórkach więc nie ma ryzyka jakiegoś zapętlenia. Co znaczy "po wybraniu w KOLUMNIE którejś z wartości" - makro ma sprawdzać konkretną kolumnę?
  • #16 17480416
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    mrgaj napisał:
    uruchomi się i powstanie zamknięta pętla

    Jeśli obawiasz się zapętlenia kodu w procedurze zdarzeniowej, to zastosuj instrukcję:
    "Application.EnableEvents = False / True"
    Zapoznaj się w pomocy podręcznej z jej stosowaniem.
  • #17 17484506
    mrgaj
    Poziom 9  
    Posty: 20
    Loker napisał:
    Worksheet_Change uruchamia się tylko w przypadku zmiany wartości jakichś komórek i pracuje tylko na tych zmienionych komórkach więc nie ma ryzyka jakiegoś zapętlenia. Co znaczy "po wybraniu w KOLUMNIE którejś z wartości" - makro ma sprawdzać konkretną kolumnę?


    Rozumiem.

    Tak w kolumnie są do wyboru 3 opcje tekstowe.
    Chciałbym aby makro sprawdzało konkretna kolumnę, i uruchamialo się po wyborze jednej z nich.

    Dziękuję za pomoc
  • #18 17484843
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Podmień

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    na

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Będzie sprawdzało w trzeciej kolumnie.
  • #19 17486158
    mrgaj
    Poziom 9  
    Posty: 20
    Loker napisał:
    Podmień

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    na

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Będzie sprawdzało w trzeciej kolumnie.


    Jak zwyklę w punkt :) dziękuję . Działa
    Jeszcze ostatnia rzecz i stawiam kratę dobrego piwa !

    A czy można (pewnie można) dołożyć warunkowanie które będzie uruchamiało różne makra na podstawie zawartości kolumny A w aktywnym wierszu. Wpisując w kolumnę D=AWARIA lub SPRAWNY lub WARUNKOWO , VBA sprawdza co widnieje w kolumnie A i na podstawie jej zawartości uruchamia odpowiednie makro.

    np.
    Jeżeli komórka w KOLUMNA A = BAZA i D = AWARIA i to uruchom makro BAZA
    Jeżeli komórka w KOLUMNA A = DOM i D = WARUNKOWO i to uruchom makro DOM
    Jeżeli komórka w KOLUMNA A = MAGAZYN i D = SPRAWNY to uruchom makro MAGAZYN

    itd.

    A................... B............ C................. D
    BAZA.................................................. AWARIA
    DOM.................................................. WARUNKOWO
    MAGAZYN....................................... SPRAWNY

    jak zawsze pełen szacunek za pomoc
  • #20 17486638
    Loker
    Poziom 39  
    Posty: 3368
    Pomógł: 575
    Ocena: 720
    Tak na szybko:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Zamiast "MsgBox("Baza") itp. wstaw wywołanie odpowiednich makr.

Podsumowanie tematu

✨ Użytkownik uczy się języka VBA i napotkał problem z uruchamianiem makra na podstawie wyboru słów "TAK" lub "NIE" w wierszu 5 arkusza Excel. Początkowy kod działał tylko dla jednej komórki, ale po sugestiach zmodyfikował go, aby działał na całym wierszu. Ostatecznie użytkownik uzyskał działający kod, który uruchamia makro AUTOWIERSZ po wpisaniu odpowiednich słów w wierszu 5. Pojawił się jednak problem z błędem "Run time error 13" przy większej ilości danych, który został rozwiązany przez ponowne napisanie kodu. Użytkownik dodał również warunkowanie, aby makro uruchamiało się na podstawie wartości w kolumnie A, co zostało zrealizowane w kolejnych modyfikacjach kodu.
Wygenerowane przez model językowy.
REKLAMA