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.

Zaznaczanie wierszy VBA Excel -

27 Jul 2017 09:44 4074 15
  • Level 5  
    Cześć wszystkim, mam 2 małe problemy makrem do zaznaczania wierszy.
    1. Pierwsze makro dodaje mi obramowanie do zaznaczonego wiersza - w tym kodzie chciałbym dodać zakres w jakim ma ono działać (tylko w obrębie tabeli) Od wiersza 42 do 305.

    Code:

      If w > 0 Then
        With Rows(w)
          .Borders(xlEdgeBottom).LineStyle = xlNone
        End With
      End If

      With Target(1).EntireRow
        w = .Row

        With .Borders(xlEdgeBottom)
          .LineStyle = xlContinuous
          .Weight = xlThin
          .Color = RGB(217, 217, 217)
        End With

      End With


    2. To makro dodaje mi kolor wypełnienia wiersza - Jak zrobić by kolor z zaznaczenia wiersza (z kodu VBA) nakładał się na wypełnienie już istniejące z formatowania warunkowego? w tej chwili nie działa to na wypełnione kolorem komórki.

    Code:

    Rows("42:305").Interior.ColorIndex = xlNone
    If Not Intersect(Target, Rows("42:305")) Is Nothing Then Selection.EntireRow.Interior.Color = RGB(249, 249, 249)


    Pomożecie?
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Level 30  
    mpodciwinski wrote:
    ... w tym kodzie chciałbym dodać zakres w jakim ma ono działać (tylko w obrębie tabeli) Od wiersza 42 do 305...
    mpodciwinski wrote:
    With Target(1).EntireRow

    1. W obrębie tabeli ... a co z kolumnami, nieważne ?

    2. Ten fragment powyżej to z Worksheet_SelectionChange(ByVal Target As Range) czy Worksheet_Change(ByVal Target As Range) ?

    W kodzie z twojego pkt nr 2 jest rozwiązanie:
    Code: vbscript
    Log in, to see the code

    poza tym jakby nie patrzeć, to w obydwu powyższych zdarzeniach arkusza jest 'Target', który można wykorzystać - poniżej komunikat pojawi się tylko w zakresie "A1:D10":
    Code: vba
    Log in, to see the code


    mpodciwinski wrote:
    Jak zrobić by kolor z zaznaczenia wiersza (z kodu VBA) nakładał się na wypełnienie już istniejące z formatowania warunkowego?

    Wtedy formatowanie warunkowe nie byłoby już warunkowym ... tylko standardowym.
  • Level 5  
    1. interesują mnie tylko wiersze.
    2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Możliwe, że jest, ale nie wiem jak zmodyfikować ten kod, próbowałem sam, ale ciągle wyskakują błędy.

    lanzul wrote:
    Kod: vba Rozwiń Zaznacz wszystko
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Not Intersect(Target, Range("a1:d10")) Is Nothing Then
            w = Target.Row
            k = Target.Column
            MsgBox "Wiersz = " & w & " ; Kolumna = " & k
        End If
    End Sub


    Ten kod działa, ale musi to jeszcze odwracać te procedurę, czyli po kliknięciu w inne miejsce poprzednie wypełnienie wiersza musi zniknąć (pozostawiając wypełnienie standardowe)
    Jak to zrobić?

    Kolejne pytanie, czy można te dwa kody złączyć w jeden? by w jednym kodzie było wypełnienie i obramowanie?
  • Level 30  
    mpodciwinski wrote:
    ale musi to jeszcze odwracać te procedurę

    Poniższy kod działa w zakresie wierszy od 42 do 305
    Code: vba
    Log in, to see the code

    zaś poniższy działa poza zakresem tych wierszy, tj. poza wierszami z zakresu 42 do 305:
    Code: vbscript
    Log in, to see the code
  • Level 5  
    Dzięki za odpowiedź, ale odwoływanie coś mi nie działa.
    Wiem, że dla Ciebie to pestka, ale ja jestem początkujący w VBA i mam nadal problem..

    Code:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim w As Long
    Dim zakres As String

        zakres = "42:305"
       
        If Not Intersect(Target, Range(zakres)) Is Nothing Then
            '...
            'jakieś instrukcje, która mają
            'zadziałać w zakresie wierszy od 42 do 305
            'np.:
            Selection.EntireRow.Interior.ColorIndex = 19
            '...
        End If
       
        If Intersect(Target, Range(zakres)) Is Nothing Then
            '...
            'jakieś instrukcje, która mają
            'zadziałać poza zakresem wierszy od 42 do 305
            'np.:
            .Interior.ColorIndex = xlNone
            '...
        End If
    End Sub


    Tak zrobiłem, ale wyskakuje mi błąd..
    Czy mogę Cie prosić o sklecenie mi takiej gotowej formuły z wypełnieniem i obramowaniem? i jej odwołaniem?
    Z góry dziękuje.
  • Level 30  
    mpodciwinski wrote:
    czy można te dwa kody złączyć w jeden?

    Można, poprzez warunek If ... Else ... End If
    Code: vba
    Log in, to see the code

    Jeśli w zakresie '42:305' ma działać kod nr 1 oraz część kodu nr 2 z wpisu nr 1, to trzebo go tam wsadzić, inna sprawa, że nie wiadomo skąd zmienna 'w' bierze tam swoją wartość, skoro jest napisane, że:
    Code: vba
    Log in, to see the code

    przecież, jeśli 'w = Target.Row', to zawsze będzie to większe od "0", nie ma bowiem wiersza = "0", ani tym bardziej wiersza "ujemnego".
    Tak więc, mielibyśmy, na przykład, z kodu nr 1 oraz z części kodu nr 2:
    Code: vba
    Log in, to see the code


    Natomiast w sytuacji odwrotnej - poza zakresem '42:305'
    mpodciwinski wrote:
    musi to jeszcze odwracać te procedurę, czyli po kliknięciu w inne miejsce poprzednie wypełnienie wiersza musi zniknąć (pozostawiając wypełnienie standardowe)

    Część kodu:
    Code: vba
    Log in, to see the code

    wejdzie w:
    Code: vba
    Log in, to see the code


    Po uporządkowaniu, oraz przy założeniu, że 'w' jest tożsame z nr wiersza, w którym jest zaznaczona komórka (czyli z 'Target'), mogłoby to wyglądać całościowo, tak:
    Code: vba
    Log in, to see the code

    chociaż, są tu jakieś rozbieżności - jaki właściwie ma być styl linii - oraz jaka ma być w sumie kolorystyka wypełnienia komórek (?).
    Chyba, że jeszcze o coś innego chodzi ?
  • Level 30  
    mpodciwinski wrote:
    nie odwraca to zaznaczenia wiersza

    ? jak nie odwraca ... odwraca, poniżej próbka na przykładowej kolorystyce:

    https://filmy.elektroda.pl/49_1501844650.mp4
    (Filmik na pewno odtwarza się poprzez MPC-HC (programik darmowy))

    Z kodów (kod nr 2 wpis nr 1), które zamieściłeś wynika, że zaznaczenie komórki w zakresie "42:305" nakłada barwę wypełnienia komórek na "RGB(249, 249, 249)", czyli "prawie biały" (biały = 255/2555/255):
    Code: vba
    Log in, to see the code

    Natomiast zaznaczenie dowolnej komórki poza zakresem "42:305" ma nakładać na ten zakres "format standardowy", czyli brak wypełnienia:
    Code: vba
    Log in, to see the code

    lub również tak:
    Code: vba
    Log in, to see the code
    Code: vba
    Log in, to see the code

    oraz info:
    mpodciwinski wrote:
    ... ale musi to jeszcze odwracać te procedurę, czyli po kliknięciu w inne miejsce poprzednie wypełnienie wiersza musi zniknąć (pozostawiając wypełnienie standardowe)

    Ponieważ "prawie biały" (249/249/249) prawie się równa "brakowi koloru", czyli białemu (255/255/255), to "prawie nic nie widać" ... :-> ...
    Najlepiej to nagraj kawałek makra z kolorkami jakie chciałbyś mieć przy zaznaczaniu komórek w zakresie "42:305" i poza tym zakresem i zamieść tutaj lub po prostu podaj barwy jakie mają być.
  • Level 5  
    Ja widzę każdą zmianę kolor, mam monitor graficzny, ale nie w tym rzecz.
    Tutaj filmik z innym kolorem:
    https://www.dropbox.com/s/a63ox30nj10wcaa/2017-08-06_13h54_10.mp4?dl=0
    jak widzisz nie jest to problem z kolorem.
    Być może mówimy o innym działaniu, bo u ciebie kasowało całe wypełnienie tabeli
    A powinno to działać w ten sposób:
    https://www.dropbox.com/s/nazbiwwll08uoug/2017-08-06_13h55_47.mp4?dl=0
    Czyli zaznacza się cały wiersz i tylko on, zaraz po kliknięciu w inne miejsce, to poprzednio zaznaczone wraca do normalnego stanu i podświetla się to w które klikałeś (wiersz)
  • Level 30  
    mpodciwinski wrote:
    A powinno to działać w ten sposób:
    https://....
    Czyli zaznacza się cały wiersz i tylko on, zaraz po kliknięciu w inne miejsce, to poprzednio zaznaczone wraca do normalnego stanu i podświetla się to w które klikałeś (wiersz)

    W porządku, tyle tylko, że widzę iż już sobie poradziłeś ze sprawą, tak więc co jeszcze jest na rzeczy ?
  • Level 5  
    To jest stara formuła która działa tylko z wypełnieniem, wkleiłem ja na początku wątku (2).
    Nie działa ona z obramowaniem.. :/
    Jesteś w stanie mi pomóc z tym problemem? ;)
  • Level 30  
    mpodciwinski wrote:
    Nie działa ona z obramowaniem

    Opis działania:
    1. W zakresie wierszy '42:305' zaznaczenie dowolnej komórki ma wywoływać:
    a. wypełnienie całego wiersza, z zaznaczoną komórką, "jakimś kolorem" (na tę chwilę nieważne jakim)
    b. nałożenie obramowania wiersza (przynajmniej na dolną krawędź)
    c. usunięcie wypełnienia wiersza spoza zakresu '42:305', w którym to wierszu była wcześniej zaznaczona jakaś komórka

    2. Poza zakresem wierszy '42:305' zaznaczenie dowolnej komórki ma wywoływać:
    a. wypełnienie całego wiersza, z zaznaczoną komórką, "jakimś kolorem" (na tę chwilę nieważne jakim)
    b. zdjęcie obramowania wiersza (przynajmniej z dolnej krawędzi) z zakresu '42:305'
    c. usunięcie wypełnienia wiersza z zakresu '42:305', w którym to wierszu była wcześniej zaznaczona jakaś komórka

    Tak, czy jeszcze jakoś inaczej ? Jeśli inaczej napisz w punktach.
  • Level 5  
    tak powinno działać makro:
    1. W zakresie wierszy '42:305' zaznaczenie dowolnej komórki ma wywoływać:
    a. wypełnienie całego wiersza, z zaznaczoną komórką, "jakimś kolorem" (na tę chwilę nieważne jakim)
    b. nałożenie obramowania wiersza (przynajmniej na dolną krawędź)
    c. usunięcie wypełnienia z wcześniej zaznaczonego wiersza z zakresu '42:305'
    d. usunięcie obramowania z wcześniej zaznaczonego wiersza z zakresu '42:305'
    2. poza zakresem nic się nie dzieje.
  • Level 30  
    mpodciwinski wrote:
    tak powinno działać makro:
    1. W zakresie wierszy '42:305' zaznaczenie dowolnej komórki ma wywoływać:
    a. wypełnienie całego wiersza, z zaznaczoną komórką, "jakimś kolorem" (na tę chwilę nieważne jakim)
    b. nałożenie obramowania wiersza (przynajmniej na dolną krawędź)
    c. usunięcie wypełnienia z wcześniej zaznaczonego wiersza z zakresu '42:305'
    d. usunięcie obramowania z wcześniej zaznaczonego wiersza z zakresu '42:305'
    2. poza zakresem nic się nie dzieje.

    Poniżej kod arkusza:
    Code: vba
    Log in, to see the code

    Poniżej zaś, jeszcze "ewentualny" kod do wklejenia do "ThisWorkbook", gdybyś chciał sobie poeksperymentować z odblokowywanymi komentarzami w kodzie powyżej i zobaczyć jak to działa w różnych "układach":
    Code: vba
    Log in, to see the code

    Można to wszystko jeszcze "ubrać" w konstrukcję "With ... End With", ale wtedy wszystko się bardzo "wydłuży" i może być mniej zrozumiałe.

    Ps: To jest moje "rozumienie" tematu, inni koledzy z forum z pewnością zrobiliby to inaczej, pewnie prościej i lepiej, tak więc jeśli nie trafiłem, poczekaj, może odezwie się np.: kolega JRV, adamas_nt, Prot, inni których nie wymieniłem ...
  • Level 5  
    Można by powiedzieć, ze działa z jednym wyjątkiem. Po kliknięciu w inne miejsce zostaje jasnoniebieskie obramowanie z góry i z dołu którego koloru nie ma w kodzie nawet.
    Zaznaczanie wierszy VBA Excel -

    I mam pytanie, co to jest "pamietnik" odwołujący sie do komórki A1?
  • Level 30  
    mpodciwinski wrote:
    co to jest "pamietnik ... komórki A1"

    Wartość wyjściowa dla makra, nie przeszkadza
    mpodciwinski wrote:
    w inne miejsce zostaje jasnoniebieskie obramowanie

    Nie wiem ... przy zdjętych linach siatki (Narzędzia\Opcje\Linie siatki) nic nie zostaje ...