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.

Excel - VBA - Uruchamianie makra poprzez VBA na podstawie tekstu

mrgaj 21 Wrz 2018 14:33 420 19
  • #1 21 Wrz 2018 14:33
    mrgaj
    Poziom 6  

    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 :

    Code:
    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

    0 19
  • Pomocny post
    #2 21 Wrz 2018 14:39
    adamas_nt
    Moderator Programowanie

    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.

    0
  • #3 21 Wrz 2018 14:46
    mrgaj
    Poziom 6  

    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:

    Code:

    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

    0
  • Pomocny post
    #4 21 Wrz 2018 14:54
    Loker
    Poziom 38  

    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

    0
  • #5 21 Wrz 2018 14:58
    mrgaj
    Poziom 6  

    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

    0
  • Pomocny post
    #6 21 Wrz 2018 15:01
    adamas_nt
    Moderator Programowanie

    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.

    0
  • Pomocny post
    #7 21 Wrz 2018 15:06
    Loker
    Poziom 38  

    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

    0
  • #8 21 Wrz 2018 15:18
    mrgaj
    Poziom 6  

    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 :)

    0
  • Pomocny post
    #9 21 Wrz 2018 15:49
    Loker
    Poziom 38  

    Zamiast MsgBox ("1")

    0
  • #10 21 Wrz 2018 15:56
    mrgaj
    Poziom 6  

    Dzięki tam też wstawiłem.

    Chciałem zostawić ten msg :) wpisałem sobie komunikat. Dlatego spytałem.

    0
  • #11 21 Wrz 2018 16:13
    Loker
    Poziom 38  

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • #12 24 Wrz 2018 15:39
    mrgaj
    Poziom 6  

    [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

    0
  • #13 27 Wrz 2018 12:12
    Loker
    Poziom 38  

    A co jest w komórce, na której makro się "wykłada"?
    I co dokładnie robi AUTOWIERSZ?

    0
  • #14 03 Paź 2018 09:32
    mrgaj
    Poziom 6  

    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 :(

    Code:
    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 !

    0
  • #15 05 Paź 2018 12:34
    Loker
    Poziom 38  

    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ę?

    0
  • #16 06 Paź 2018 00:24
    lanzul
    Poziom 28  

    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.

    0
  • #17 08 Paź 2018 12:16
    mrgaj
    Poziom 6  

    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

    0
  • #18 08 Paź 2018 15:36
    Loker
    Poziom 38  

    Podmień

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    na

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    Będzie sprawdzało w trzeciej kolumnie.

    0
  • #19 09 Paź 2018 08:50
    mrgaj
    Poziom 6  

    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

    0
  • #20 09 Paź 2018 13:26
    Loker
    Poziom 38  

    Tak na szybko:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


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

    0