Visual Basic - VBA usuwanie wypełnienia gdzie ono jest ustawione

Visual Basic - VBA usuwanie wypełnienia gdzie ono jest ustawione

Wątek przeniesiony 2021-01-28 13:22 z Inne języki programowania przez cerrato.

Cisi204
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:232
0

Witam , jeśli piszę w złym dziale proszę o przeniesienie tematu. Otóż mam taki problemik , mam sobie pewne dane w Excelu , które są wypełniane na kolor żółty po znalezieniu określonego słowa przez formatowanie warunkowe , chciałbym aby wszystkie wiersze które mają wypełnienie koloru żółtego został usunięte. Oto mój kod który ma za zadanie czyścić 'celle ' w wierszu gdzie jest wypełnienie żółte

Kod który wypisuje poszczególne oznaczenia na danych kolorów.

Kopiuj
Sub kolory ()
For w = 1 To 56
Cells(w, 7).Value = w
Cells(w, 8).Interior.ColorIndex = w
Next
End Sub

Kod który ma za zadanie znaleźć , wszystkie rekordu ,które mają żólte wypełnienie i usunąć te wiersze.

Kopiuj
Sub rvfcc()
'remove values from colored cells
        Range("A1: AB100").Select
        For Each Cell In Selection
        For w = 1 To 100
        If Cells(w, 3).Interior.ColorIndex=6 (lub 27 bo taki index mają w powyższym kodzie kolory żólte) Then
        Cell.Clear
        End If
        Next

    End Sub

Kod który ma za zadanie usunąć wszystkie wiersze w których są 'pustki '

Kopiuj

Sub Usun_puste_wiersze()
  Dim Zakres As Range, Kolumna As Range, Komorka As Range
  Dim Licznik As Long, LiczbaKomorek As Long, Usunietych As Long

  'UWAGA! Zaznacz dowolną komórkę w zakresie, który ma zostać oczyszczony
  Set Zakres = ActiveCell.CurrentRegion
  Set Kolumna = Zakres.Columns(3)
  LiczbaKomorek = Zakres.Rows.Count

  Usunietych = 0
  For Licznik = 1 To LiczbaKomorek
     Set Komorka = Kolumna.Cells(Licznik - Usunietych, 1)
     If Komorka.Value = 0 Then
        Rows(Licznik - Usunietych).Delete
        Usunietych = Usunietych + 1
     End If
  Next Licznik

  Set Zakres = Nothing
  Set Kolumna = Nothing
  Set Komorka = Nothing
End Sub

Problem jest taki że to nie działa , wiecie może jak to ugryźć , nie jestem jakimś specjalista od VBA lecz taką automatyzację dobrze znać. Wiem że ten kod jest trochę na skróty .

edytowany 2x, ostatnio: Ktos
Lukas Kordel
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:4
0

Napisałbym to w ten sposób.

Ten kod usunie z wcześniej zaznaczonego przez Ciebie obszaru wszystkie wiersze w których występują komórki z ustawionym ColorIndex = 27 i ColorIndex = 6.. Przed usunięciem zaznaczy wiersze do usunięcia i wyśle zapytanie.

Kopiuj
Sub UsunWierszeZKoloremZaznacz()

            Dim toRemove As String

            For Each CELL In Selection
                                 
                Select Case CELL.Interior.ColorIndex
                    
                    Case 6, 27:
                    If InStr(1, toRemove, "A" & CELL.Row) = 0 Then
                        
                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select
                
            Next CELL
            
           If toRemove = "" Then Exit Sub
           
           Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Select
           
           If MsgBox("Czy usunąć zaznaczone wiersze?", vbYesNo) = vbYes Then
                
                 Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete
           End If
           
End Sub

lub użyj tego jeżeli chcesz usunąć bez weryfikacji ...

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String

            For Each CELL In Selection
                                 
                Select Case CELL.Interior.ColorIndex
                    
                    Case 6, 27:
                    If InStr(1, toRemove, "A" & CELL.Row) = 0 Then
                        
                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select
                
            Next CELL
            
           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete
                     
End Sub
Cisi204
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:232
0

lub użyj tego jeżeli chcesz usunąć bez weryfikacji ...

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String

            For Each CELL In Selection
                                 
                Select Case CELL.Interior.ColorIndex
                    
                    Case 6, 27:
                    If InStr(1, toRemove, "A" & CELL.Row) = 0 Then
                        
                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select
                
            Next CELL
            
           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete
                     
End Sub

Dziękuje za szybką a wręcz błyskawiczną odpowiedz , jak na temat 'inny język programowania' :) .Wybieram opcję bez weryfikacji , lecz mam drobny problem z tym kodem ponieważ próbuję ustalić zasięg na jaki ten kod ma działać , w moim przypadku dane wypełnione kolorem zółtym znajduję się w kolumnie 'C' .
Swój kod przerobiłem w ten sposób aby przeszukiwał wszystkie kolumny w danym zakresie.

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String

            Range("A1: AB1").Select
            For Each CELL In Selection

                Select Case CELL.Interior.ColorIndex

                    Case 6, 27:
                    If InStr(1, toRemove, "A" & CELL.Row) = 0 Then

                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select

            Next CELL

           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub

, kod powyżej Szuka w zakresie od A1 do AB1 , i moje pytanie brzmi jak rozumieć ten warunek

Kopiuj
 If InStr(1, toRemove, "A" & CELL.Row) = 0 Then 

jeśli 1 usuń , i co oznacza te 'A' oraz '&Cell.row ' jak to interpretować

Lukas Kordel
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:4
0

, kod powyżej Szuka w zakresie od A1 do AB1 , i moje pytanie brzmi jak rozumieć ten warunek

Kopiuj
 If InStr(1, toRemove, "A" & CELL.Row) = 0 Then 

jeśli 1 usuń , i co oznacza te 'A' oraz '&Cell.row ' jak to interpretować

ten warunek sprawdza czy (w wyznaczonym przez Ciebie obszarze)w wierszu o nr "CELL.Row" znajduje się już komórka z kolorem który wybrałeś. Jeżeli tak to ją zignoruje. Tak żeby w zbudowanym zaznaczeniu nie powtarzały się numery wierszy które mają zostać usunięte.

Literka "A" jest potrzebna aby zbudować zaznaczenie na podstawie którego na końcu skrypt określi które wiersze są do usunięcia.
Inaczej możesz wprowadzić w miejsce tej literki każdą inną literkę. Nie będzie miało to wpływu na działanie skryptu.
(cyfra 1 oznacza że ma przeszukać ciąg licząc od pierwszego znaku)

edytowany 1x, ostatnio: Lukas Kordel
Cisi204
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:232
0

Nie wiem czy dobrze kombinuję mam taki oto kod z którym mam problem, ponieważ nie działa .

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String
            Range("C1:C250").Select
            For Each CELL In Selection

                Select Case CELL.Interior.ColorIndex

                    Case 6, 27:
                    If InStr(1, toRemove, "A" & ("A2:A250")) = 0 Then

                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select

            Next CELL

           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub

Na samym początku zdefiniowałem obszar dla których ma mi sprawdzać kolumny , z uwagi że te dane mam w kolumnie "C" obszar zdefiniowałem aby sprawdzał od "C1:C250" , i chciałbym aby sprawdzał mi wiersze od A2 do A250 . Czy ktoś może doradzić czemu to nie działa ? i jakoś nakierować co jest nie tak i jak to poprawić. Z góry dziękuję za pomoc.

edytowany 1x, ostatnio: Cisi204
Cisi204
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:232
0

Zmniejszyłem trochę zasięg , kod nadal nie działa , tylko zaznacza te obszaru , efektu usunięcia brak.

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String
             Range("C2:C10").Select
            For Each CELL In Selection
            
                Select Case CELL.Interior.ColorIndex

                    Case 6, 27:
                    If InStr(1, toRemove, "A" & Rows("2:10").Select) = 0 Then

                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select

            Next CELL

           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 godziny
  • Postów:2792
0

A to: (trochę uprościłem kod)

Kopiuj
Sub UsunWierszeZKolorem()
Dim toRemove As String
             
For Each cell In Range("C2:C10")

    Select Case cell.Interior.Color
        Case vbYellow: ' ten drugi to nie wiem
           toRemove = toRemove & "A" & cell.Row & ","
    End Select

Next cell

If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub

?

Cisi204
tez niestety nie działa , do case dodałem jeszcze 2,7 , bo w tej palecie barw warunkowe oznaczenie żółte ma takie id koloru "Case 6, 27":
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 godziny
  • Postów:2792
0

Przed końcowym if wpisz:

Kopiuj
MsgBox toRemove

i zobacz, co ci wyświetla.

Cisi204
Wyskakuje tylko puste okno , bez komunikatu z nagłówkiem Microsoft Excel
Marcin.Miga
Skoro tak jest, to odpowiedź jest prosta: Nie masz w danym obszarze żadnych komórek o kolorze tła = 6 lub =27
Lukas Kordel
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:4
0

"> Na samym początku zdefiniowałem obszar dla których ma mi sprawdzać kolumny , z uwagi że te dane mam w kolumnie "C" obszar zdefiniowałem aby sprawdzał od "C1:C250" , i chciałbym aby sprawdzał mi wiersze od A2 do A250 . Czy ktoś może doradzić czemu to nie działa ? i jakoś nakierować co jest nie tak i jak to poprawić. Z góry dziękuję za pomoc."

Obszar przeszukiwania modyfikujesz tylko przed wejściem do pętli. (4 wiersz)
Nie modyfikujesz warunku wewnątrz pętli.

Nie jestem pewien czy dobrze Ciebie rozumiem.
Kod poniżej usunie wszystkie wiersze jeżeli w kolumnie A lub C dla wiersza od 1 do 250 wystąpią komórki z ustawionym "Interior.ColorIndex" 6 lub 27.

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String
            Range("A1:A250,C1:C250").Select 
           
            For Each CELL In Selection

                Select Case CELL.Interior.ColorIndex

                    Case 6, 27:
                    If InStr(1, toRemove, "A" & CELL.Row) = 0 Then

                        toRemove = toRemove & "A" & CELL.Row & ","
                    End If
                End Select

            Next CELL

           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub

jeżeli chcesz przeszukać tylko kolumnę C to w 4 wierszu zmien zaznaczenie na :

Kopiuj
Range("C1:C250").Select 
edytowany 3x, ostatnio: Lukas Kordel
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 godziny
  • Postów:2792
0

Już wiem ....
Twój komentarz mnie nakierował

tez niestety nie działa , do case dodałem jeszcze 2,7 , bo w tej palecie barw warunkowe oznaczenie żółte ma takie id koloru "Case 6, 27"

Skoro, to jest formatowanie warunkowe, to sprawdż:
Cell.DisplayFormat.Interior.ColorIndex
:)

edytowany 1x, ostatnio: Marcin.Miga
Cisi204
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:232
0

Śmiga

Kopiuj
Sub UsunWierszeZKolorem()

            Dim toRemove As String
           Range("C1:C250").Select

            For Each Cell In Selection

                Select Case Cell.DisplayFormat.Interior.ColorIndex

                    Case 6, 27:
                    If InStr(1, toRemove, "A" & Cell.Row) = 0 Then

                        toRemove = toRemove & "A" & Cell.Row & ","
                    End If
                End Select

            Next Cell

           If toRemove <> "" Then Range(Left(toRemove, Len(toRemove) - 1)).EntireRow.Delete

End Sub

Cell.DisplayFormat.Interior.ColorIndex lekiem na całe zło

edytowany 1x, ostatnio: Cisi204
Lukas Kordel
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:4
0

hmm też niedoczytałem że to formatowanie warunkowe

podmien bo bedą błedy (dodałem przecinek do warunku)

Kopiuj
If InStr(1, toRemove, "A" & cell.Row & ",") = 0 Then

... o ile dobrze pamiętam argument dla "range" przyjmuje do 255 znaków więc możesz z łatwością przekroczyć ten limit jeżeli tych żółtych komórek będzie sporo.
Lepiej będzie usunąć je w pętli ...

tak na szybko ....np tak

Kopiuj
            If toRemove = "" Then Exit Sub
                
                toRemove = Replace(toRemove, "A", "")
                Dim rows_() As String: rows_ = Split(toRemove, ",")
                Dim n_row As Integer: n_row = UBound(Split(toRemove, ","))
                
                For i = n_row - 1 To LBound(rows_) Step -1
                    
                      rows(CInt(rows_(i))).Delete
                      
                Next i

nie testowałem ale powinno działać.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)