Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

zmiana koloru komórki po kliknięciu w nią

14 Jun 2018 13:21 2310 22
  • Level 4  
    Witam, jestem początkująca w VBA. Potrzebuję kodu , który spowoduje, że po kliknięciu w komórkę zmieni się jej kolor np. na zielony po kliknięciu dwukrotnie na czerwony itd. Czy to w ogóle możliwe?
    Potrafię nagrać zmianę koloru i podpiąć pod przycisk, ale to nie to:/
  • Helpful post
    Level 35  
    Witam
    Wklej do kodu arkusza
    Code: vbscript
    Log in, to see the code
  • Level 4  
    Ok działa!
    Tylko jeszcze jak spowodować żeby to było zapętlone?
    Po każdym kliknięciu zmiana koloru kolejno na zielony, żółty i czerwony i bez konieczności klikania w inną komórkę po kolejnym kliknięciu znowu zielony itd.?

    Dodano po 35 [minuty]:

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Target.Interior.ColorIndex = 3
    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Interior.ColorIndex = 6
    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Interior.ColorIndex = 10

    End Sub


    Tu już śmigają 3 kolory, ale nie potrafię tego zapętlić. I czy konieczne jest podwójne kliknięcie? Może da się je zmieniać po prostu po każdym pojedynczym kliknięciu?
  • Helpful post
    Level 32  
    Spróbuj czegoś w tym stylu:
    Spoiler:
    Code: vbscript
    Log in, to see the code

    //edit, poprawiono z Color na ColorIndex
    //edit2, po ponownym kliknięciu też działa
    Code: vbscript
    Log in, to see the code
  • Level 4  
    Niestety kod działa tylko na kolor czerwony
  • Level 35  
    kejt09 wrote:
    Tylko jeszcze jak spowodować żeby to było zapętlone?

    A co to ma być "kolorofon"? :D One maja migać na zmianę.?
  • Level 32  
    Nie wiem po co ci to tak działające, ale niech ci będzie - poprawiłem poprzedni post (tym razem kod jest przetestowany)
  • Level 4  
    Dziękuję! Działa idealnie:D Chyba! Sprawdzę to w poniedziałek, chodzi o to, żeby na ekranie dotykowym działało to w wygodny sposób, żeby zaznaczać w formularzu, czy dane spotkanie odbyło się czy też nie, zgodnie z legendą :twisted:

    Dodano po 17 [minuty]:

    Ostatnie pytanie:>
    Chciałam żeby działało na 4 kolory, ale zepsuło się i działa tylko na żółty i szary

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    For Each d In Target
    Select Case d.Interior.ColorIndex
    Case 3
    d.Interior.ColorIndex = 6
    Case 6
    d.Interior.ColorIndex = 10
    Case 10
    d.Interior.ColorIndex = 16

    Case Else
    d.Interior.ColorIndex = 3



    End Select
    Application.Union(Target, ActiveSheet.Range("NUA10000")).Select
    Next d
    End Sub
  • Helpful post
    Moderator of Programming
    Tak się zastanawiam... A dlaczego pętla? Target, to target.
    Po drugie: żebym sobie mógł klikać w tę samą komórkę/zakres, trzeba odejść z focusem na z góry upatrzoną "komórkę neutralną".
    Po trzecie: pożyteczny byłby też jakiś wyłącznik. Tu z wykorzystaniem komórki neutralnej. Jeśli =1, kolorowanie wyłączone.
    Code: vba
    Log in, to see the code


    Edit: Hmm, być może pętla, żeby zmieniały się kolory w wielokomórkowym zaznaczeniu. Wtedy:
    Code: vba
    Log in, to see the code
  • Level 32  
    Pętla pełni dwie funkcje (po pierwsze nie odznaczam klikniętej komórki - pozwala to na wprowadzenie tekstu - co twoje rozwiązanie uniemożliwia), jeśli masz zaznaczone dwie komórki to bez pętli (a raczej dostania się do każdej komórki indywidualnie) .Interior.ColorIndex jest nullem. No a drugą opcją jest masowe zaznaczanie (co może być pożądane a może nie, chociaż autor nic o tym nie wspomniał)

    Generalnie wprowadzając wyłącznik (o czym ja w swoim lenistwie nie pomyślałem) da się obejść wspomniany problem z wprowadzeniem danych inny sposób (wg mnie to lepsze rozwiązanie, bo wprowadzanie tekstu może być nieumyślnie uruchomione). Ew można by też wprowadzić przycisk i formularz do wprowadzania danych.
  • Level 4  
    Adamas nie widzę różnicy między pierwszym a drugim rozwiązaniem, w obu przypadkach zmieniają się kolory przy zaznaczeniu wielu komórek :> Niesamowite, działa świetnie, tylko w takim razie czemu mój dopisany 4 kolor przestał działać, kod wygląda podobnie?:D
    Skąd najlepiej uczyć się VBA?
    Dzięki!

    Dodano po 7 [minuty]:

    I co do przycisku, da się wrzucić ten "wyłącznik/gumkę" w przycisk?
    I czy oprócz klikania w komórki, da się też zastosować ten kod do klikania w obiekty? (żeby wypełniały się też kształty)
    Jestem zafascynowana :D
  • Helpful post
    Moderator of Programming
    Och, jest różnica :) Patrz posty kolegi drobok -
    zmień sobie kolory na różne w kilku sąsiadujących komórkach, następnie zaznacz je wszystkie razem...

    Gdzie się uczyć VBA? Po opanowaniu podstaw (Np Link), najwięcej "złapiesz" na rozwiązywaniu własnych pomysłów/realizowaniu potrzeb. Jak już całkiem się zaplątasz, klikasz elektroda.pl ;)

    Całkiem dobrym "podpowiadaczem" jest rejestrator makr, tudzież klawisz [F1].
  • Helpful post
    Level 32  
    Dobiłaś mnie tą informacją - serio. Nie wiem jakim cudem, ale w wypadku gdy case jest dłuższy event odpada się 2 razy (nie mam pojęcia jakim cudem, tym bardziej po przeniesieniu zaznaczania kolejnej komórki na początek). Rozwiązaniem (trochę na około, ale działającym), jest opcja wyłączenia eventów
    Code: vbscript
    Log in, to see the code

    Co do reszty wypowiedzi, weź sobie dodaj zakładkę developer na wstążce, dajesz insert button, i przypisujesz makro do danego przycisku. W wypadku gumki musisz zapisać fakt kliknięcia tego przycisku do zmiennej i używać jej do wybrania między gumką a zmienianiem kolorów w kodzie z drugiej części - spróbuj sama. Jak coś to cię wspomożemy.
  • Level 4  
    ok dodałam 2 przyciski wszystko działa pięknie:D
    Teraz ostatnie pytanie - mam nadzieję


    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim kom As Range, komN As String

    komN = "A1" 'komórka "neutralna"
    If Target.Address(0, 0) = komN Then Exit Sub 'focus na neutralnej, więc wychodzimy

    If Range(komN) = 1 Then 'przełącznik/gumka
    Target.Interior.ColorIndex = Empty
    Exit Sub
    End If

    For Each kom In Target
    With kom
    Select Case .Interior.ColorIndex
    Case 43
    .Interior.ColorIndex = 3
    Case 3
    .Interior.ColorIndex = 44
    Case 44
    .Interior.ColorIndex = 16
    Case Else
    .Interior.ColorIndex = 43
    End Select
    End With
    Next

    Range(komN).Select

    End Sub




    gdzie tu dodać zakres komórek, które mają się kolorować? Nie chciałabym żeby to działało w całym arkuszu
  • Level 32  
    If InRange(Target, Range("A1:A10")) Then
    'tu dajesz to co ma działać w danym zakresie
    End If
  • Level 4  
    Witam ponownie i wracam z nowymi problemami
    Kolorki już opanowałam bawię się nimi do woli
    Co teraz, gdy zamiast zmiany koloru potrzebuję wstawić jakiś symbol? Nadal po stuknięciu (kliknięciu) w komórkę - tu bez żadnych udziwnień wydaje się proste, ale nie wiem jakiego polecenia użyć?
  • Level 35  
    kejt09 wrote:
    Co teraz, gdy zamiast zmiany koloru potrzebuję wstawić jakiś symbol?

    Co to za symbol?
  • Level 4  
    Krzyżyk albo 'ptaszek'
  • Helpful post
    Level 35  
    Zainteresuj się funkcją chr ,chrw
    Code: vbscript
    Log in, to see the code
  • Level 4  
    Okej, ale nie potrafię wstawić go po kliknięciu w komórkę


    Code:
    Sub symbol()
    

        ActiveCell.FormulaR1C1 = ChrW(&H2713)
        Range("G9").Select
    End Sub


    To wrzuciłam do przycisku i działa, ale nie o to mi chodziło
    Mogę prosić o jakieś dalsze wskazówki?
  • Helpful post
    Level 32  
    Code: vbscript
    Log in, to see the code
  • Level 4  
    Dokładnie o to chodziło, dziękuję!

    Code:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    

    [b]If Intersect(Target, Range("A1:H30")) Is Nothing Then Exit Sub[/b]
    Application.EnableEvents = False
    Application.Union(Target, ActiveSheet.Range("NUA10000")).Select
    For Each d In Target
        If d.FormulaR1C1 = ChrW(&H2713) Then
            d.FormulaR1C1 = ""
            Else
            d.FormulaR1C1 = ChrW(&H2713)
        End If
    Next d
    Application.EnableEvents = True
    End Sub

    dodałam jeszcze ograniczenie co do zakresu komórek, ale mam problem, gdy klikam w daną kolumnę lub wiersz - wypełnia się cała kolumna lub wiersz do końca arkusza i w efekcie excel się zawiesza. Da radę to zablokować?
  • Helpful post
    Level 35  
    kejt09 wrote:
    Da radę to zablokować?

    Dodaj
    Code: vbscript
    Log in, to see the code