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.

makro - przekreślenie tekstu

zbysiomysio 21 Cze 2017 11:36 834 12
  • #1 21 Cze 2017 11:36
    zbysiomysio
    Poziom 6  

    Witam
    Czy jest możliwość, aby makro dokonało przekreślenia części tekstu w komórce? Chodzi o to, że np w komórce A2 mam tekst "TAK NIE" i jeżeli komórka A1=1 to, żeby makro przekreślało fragment tekstu NIE, a jeżeli jest inna wartość przekreślało fragment tekstu TAK.
    Od razu uprzedzę, że to co powyżej napisałem jest tylko pewnym uproszczeniem, gdyż tekst w A2 jest znacznie dłuższy i nie mogę rozbić go na dwie komórki
    Pozdrawiam i będę wdzięczny za wszelkie podpowiedzi.

    0 12
  • #2 21 Cze 2017 12:02
    Maciej Gonet
    Poziom 31  

    Fragmentowi tekstu w komórce można nadać atrybuty, na przykład przekreślenie, pod warunkiem że jest to stała tekstowa, a nie wynik działania formuły. W opisanym przypadku musiałaby to być procedura obsługi zdarzenia Change, która reagowałaby na zmiany w komórce A1 i stosownie do nich modyfikowała zawartość lub atrybuty tekstu w A2.

    0
  • #3 21 Cze 2017 12:23
    zbysiomysio
    Poziom 6  

    Maciej Gonet napisał:
    Fragmentowi tekstu w komórce można nadać atrybuty, na przykład przekreślenie, pod warunkiem że jest to stała tekstowa, a nie wynik działania formuły. W opisanym przypadku musiałaby to być procedura obsługi zdarzenia Change, która reagowałaby na zmiany w komórce A1 i stosownie do nich modyfikowała zawartość lub atrybuty tekstu w A2.
    W tym problem, że to przekreślenie musi być zależne od wartości komórki A1, a więc musiałoby być powiązane z formułą. Nie wchodzi też w rachubę formatowanie warunkowe, bo tam można dokonać przekreślenia całego tekstu. Natomiast nie bardzo wiem jak poradzić sobie z tą procedurą Change

    0
  • Pomocny post
    #4 21 Cze 2017 12:29
    Maciej Gonet
    Poziom 31  

    Zobacz, jak to może wyglądać. Nie napisałeś jasno, czy wartość do komórki A1 jest wprowadzana ręcznie, czy jest wynikiem formuły. Ja założyłem, że ręcznie.

    0
  • #5 21 Cze 2017 12:41
    zbysiomysio
    Poziom 6  

    Maciej Gonet napisał:
    Zobacz, jak to może wyglądać. Nie napisałeś jasno, czy wartość do komórki A1 jest wprowadzana ręcznie, czy jest wynikiem formuły. Ja założyłem, że ręcznie.
    Dzięki wielki . Makro działa. Rzeczywiście nie napisałem o tym, że wartość komórki A1 jest wynikiem formuły. Co należałoby więc w tej procedurze zmienić, aby makro działało jeżeli wartość w A1 zmieni się pod wpływem formuły, a nie ręcznego wpisania wartości?

    0
  • Pomocny post
    #6 21 Cze 2017 12:49
    JRV
    Specjalista - VBA, Excel

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dodano po 5 [minuty]:

    zbysiomysio napisał:
    w A1 zmieni się pod wpływem formuły
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #7 21 Cze 2017 13:16
    Maciej Gonet
    Poziom 31  

    Rozumiem, że wszystko jasne. JRV czuwa na posterunku i mnie wyręczył. Trzeba zmienić zdarzenie Change na Calculate i pamiętać, że Calculate nie ma argumentu Target, więc odwołania do komórek muszą być wprost.

    0
  • #8 21 Cze 2017 13:44
    zbysiomysio
    Poziom 6  

    Maciej Gonet napisał:
    Rozumiem, że wszystko jasne. JRV czuwa na posterunku i mnie wyręczył. Trzeba zmienić zdarzenie Change na Calculate i pamiętać, że Calculate nie ma argumentu Target, więc odwołania do komórek muszą być wprost.

    Dzięki za wszelkie pomoce. Makro podane przez JRV działa bez zarzutów. Jednak mam problem z przerobieniem go do własnych potrzeb (tak jak pisałem tekstu w komórce A2 jest więcej i musi być wybiórczo przekreślany). Nie potrafię więc go przerobić. Chyba bardziej zrozumiała jest dla mnie twoja procedura, ale nie do końca wiem jak przerobić ją na Calculate. Wykombinowałem jakoś tak j.n., ale to nie chodzi
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
    [/code][/quote]

    0
  • Pomocny post
    #9 21 Cze 2017 14:04
    JRV
    Specjalista - VBA, Excel

    zbysiomysio napisał:
    jest więcej i musi być wybiórczo przekreślany
    Podaj choc w stylu "aaaaaa aaaaa aa bbbbbbbbbbbbbb bbb'

    0
  • Pomocny post
    #10 21 Cze 2017 14:09
    Maciej Gonet
    Poziom 31  

    Pisałem, że w procedurze Calculate nie ma zmiennej Target, więc nie ma sensu jej używać, chyba że się ją zadeklaruje samemu.

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    Jeżeli tekst w komórce A2 będzie inny, musisz odpowiednio zmodyfikować/wyliczyć argumenty właściwości Characters. Pierwsza liczba oznacza numer pierwszego znaku do modyfikacji, druga ile kolejnych znaków ma mieć taki sam atrybut.

    0
  • #11 21 Cze 2017 14:31
    zbysiomysio
    Poziom 6  

    Maciej Gonet napisał:

    Jeżeli tekst w komórce A2 będzie inny, musisz odpowiednio zmodyfikować/wyliczyć argumenty właściwości Characters. Pierwsza liczba oznacza numer pierwszego znaku do modyfikacji, druga ile kolejnych znaków ma mieć taki sam atrybut.

    Dzięki. Coś jednak szwankuje w makrze, ponieważ arkusz jest cały czas przeliczany, aż po pewnym czasie zamyka mi program. Mój kod wygląda j.n.:
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    Wygląda to tak jakby makro się "zapętliło". Jeżeli to jest problem, że makro cały czas próbuje przeliczać to może da się to inaczej obejść, , bo komórka E16, w której może być wartość pracownik, może pojawić się tylko po zmianie danych w komórce E12. Czy jest więc możliwość tak zmienić to makro, aby po zmianie danych w komórce E12 sprawdziło czy w komórce jest wartość "Pracownik" i w zależności od tego wykonałoby stosowne czynności z przekreślaniem.

    0
  • #12 22 Cze 2017 01:44
    lanzul
    Poziom 23  

    zbysiomysio napisał:
    Wygląda to tak jakby makro się "zapętliło". Jeżeli to jest problem, że makro cały czas próbuje przeliczać to może da się to inaczej obejść, , bo komórka E16, w której może być wartość pracownik, może pojawić się tylko po zmianie danych w komórce E12. Czy jest więc możliwość tak zmienić to makro, aby po zmianie danych w komórce E12 sprawdziło czy w komórce jest wartość "Pracownik" i w zależności od tego wykonałoby stosowne czynności z przekreślaniem.

    Dużą rolę odgrywać tu może kolejność zdarzeń w arkuszu.
    Przykładowo - jeśli w arkuszu mamy dwa zdarzenia: 'Calculate' i 'Change' i w zdarzeniu 'Calculate' jakiś proces wpisuje jakąś wartość do danej komórki, to uruchamia to w międzyczasie zdarzenie 'Change', następnie wykonywany jest kod zdarzenia 'Calculate' i po jego zakończeniu znowu uruchamiany jest proces 'Change', co w konsekwencji - jeśli jest dużo pewnych 'wywołań' zdarzeń - prowadzić może do 'zapętlenia' procesów. Być może w pewnych miejscach kodu trzeba wstawić, na czas wprowadzania do komórek jakichś wartości, opcję 'Application.EnableEvents = False', aby powstrzymać 'niechciane uruchamiania'. Można też 'poddać przeliczaniu' tylko fragmenty danego arkusza czy wybiórczo komórki danego obszaru arkusza - przykładowo 'ThisWorkbook.Sheets("Arkusz1").UsedRange.Columns("A:C").Calculate'.
    A najlepszą metodą na uzyskanie odpowiedzi byłoby załączenie jakiegoś (np.: okrojoneo) 'przykładu' do analizy zachowania kodu.
    Zresztą można samemu to prześledzić poprzez, chociażby 'Stop' i F8.

    0
  • #13 22 Cze 2017 10:25
    zbysiomysio
    Poziom 6  

    Ale chyba częściowe wyłączenie aktualizacji nic nie da, bo program już po włączeniu i uruchomieniu makra (bez wprowadzania danych) zaczyna się "pętlić" Wygląda to tak, że jak usunę kilka zakładek, w których jest dużo obliczeń wszystko chodzi jak trzeba, natomiast z tymi zakładkami (arkuszami) program zaczyna się pętlić. Nadmienię, że w całym tym skoroszycie nie ma więcej żadnych innych makr. Dlatego wymyśliłem, że może makro uruchamiałoby się po zmianie wartości komórki i następnie sprawdzeniu zawartości innej komórki. Szczegóły są już w innym wątku, do którego załaczam Link

    0