logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Jak usunąć wiele kolumn po nazwach nagłówków w VBA?

Wieru 19 Lut 2024 18:01 933 18
REKLAMA
  • #1 20969060
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9
    Cześć, potrzebuję stworzyć makro które będzie usuwało kolumny po nazwie nagłówka. Liczba kolumn w arkuszu może się zmieniać ale nazwy kolumn będą te same. Dodaję przykładowy plik w którym chciałbym usunąć kolumny o nazwie "warunek" i "licznik". Myślałem o takim kodzie ale może można zrobić coś prostszego? Nie za bardzo też wiem jak poprawnie tym sposobem dodać kilka nazw kolumn do usunięcia.

    Set Data = Range("A1:F4")
    For Each cell In Data
    If cell.Value = "warunek" Then cell.EntireColumn.Delete
    Next
    Załączniki:
    • makro1.xlsx (8.61 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 20969330
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 822
    Ocena: 479
    Możesz użyć np. takiego makra:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • #4 20969379
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8735
    Pomógł: 350
    Ocena: 919
    PRL napisał:
    ;)

    Tak mnie naszło, że obecnie mało tematów o VBA tutaj i pewnie dlatego, że jest łatwo dostępna SI. I bardzo dobrze. Mi się to podoba. :)
    Witaj na forum!

    Masz absolutnie rację, w ostatnich latach dostępność narzędzi opartych na Sztucznej Inteligencji (SI) znacznie wzrosła, co wpływa na sposób, w jaki podejmujemy się różnych zadań, w tym programowania. VBA (Visual Basic for Applications) przez długi czas był jednym z głównych narzędzi dla wielu osób pracujących z aplikacjami Microsoft Office, takimi jak Excel czy Access, pozwalając na automatyzację zadań i tworzenie zaawansowanych skryptów. Jednakże, rozwój SI i dostępność nowych narzędzi może zmieniać ten krajobraz.

    Jedną z przyczyn, dla których SI może wydawać się bardziej atrakcyjna niż tradycyjne podejścia takie jak VBA, jest zdolność narzędzi SI do uczenia się i adaptowania do nowych warunków bez bezpośredniej interwencji programisty. To otwiera nowe możliwości, szczególnie w analizie danych i automatyzacji zadań, które wcześniej wymagały znacznych wysiłków programistycznych.

    Choć narzędzia SI mogą zmieniać sposób, w jaki podchodzimy do zadań automatyzacji i analizy danych, istotne jest również zrozumienie, że VBA nadal ma swoje miejsce. Dla wielu zastosowań, zwłaszcza w środowisku korporacyjnym, gdzie aplikacje Microsoft Office dominują, VBA nadal oferuje potężne możliwości. Pozwala na tworzenie niestandardowych funkcji, formularzy i makr, które mogą znacznie zwiększyć produktywność pracy.

    Kluczowe jest zrozumienie, że wybór między SI a tradycyjnymi metodami programowania, takimi jak VBA, powinien być podyktowany specyfiką zadania. Oba podejścia mają swoje zalety i ograniczenia. Na przykład, podczas gdy narzędzia SI mogą oferować bardziej zaawansowane możliwości analizy danych, mogą również wymagać większych zasobów obliczeniowych i danych treningowych. Z drugiej strony, VBA może być bardziej przystępny dla osób z ograniczonym doświadczeniem programistycznym, oferując szybkie i proste rozwiązania dla typowych zadań automatyzacji w aplikacjach Office.

    Podsumowując, nie ma wątpliwości, że SI zmienia krajobraz technologiczny i sposób, w jaki podchodzimy do rozwiązywania problemów. Jednakże technologie takie jak VBA nadal posiadają wartość i są odpowiednie dla wielu zastosowań. Dzisiejszy świat technologii wymaga elastyczności i gotowości do wykorzystania narzędzi, które najlepiej pasują do danego zadania.

    Czy masz jakieś konkretne pytania dotyczące VBA lub zastosowań SI, przy których moglibyśmy Ci pomóc? Czy interesuje Cię jakieś konkretne zastosowanie, które omówilibyśmy bardziej szczegółowo?
    Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
  • #5 20969393
    PRL
    Poziom 41  
    Posty: 6868
    Pomógł: 953
    Ocena: 888
    @ElektrodaBot se pogadajmy.
    Napisz program do obsługi firmy, gdzie jest sprzedaż, fakturowanie, magazyny. Stwórz to w czym chcesz.
    Projekt wyślij na adres(_at_)moj.pl. ;)
    Pomogłem? Kup mi kawę.
  • #6 20969400
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8735
    Pomógł: 350
    Ocena: 919
    PRL napisał:
    se pogadajmy.
    Napisz program do obsługi firmy, gdzie jest sprzedaż, fakturowanie, magazyny. Stwórz to w czym chcesz.
    Projekt wyślij na adres
    Z przyjemnością poruszę temat projektowania systemu do obsługi firmy, skupiając się na sprzedaży, fakturowaniu i zarządzaniu magazynem. Z racji swojej roli, niestety, nie jestem w stanie bezpośrednio wysłać projektu na adres e-mail, ale mogę przedstawić Ci ogólną koncepcję i kierunki, które możesz podjąć, aby zrealizować taki projekt.

    ### 1. Wybór technologii

    Dla aplikacji webowej:
    - Backend: Node.js z Express.js / Django / Flask
    - Frontend: React.js / Angular / Vue.js
    - Baza danych: PostgreSQL / MySQL / MongoDB

    Dla aplikacji desktopowej:
    - Język programowania: Python z PyQt lub Tkinter, C# z WPF lub WinForms
    - Baza danych: SQLite / MySQL / PostgreSQL

    Dla aplikacji mobilnej:
    - Platforma: React Native / Flutter
    - Baza danych: Firebase / Realm

    ### 2. Projektowanie bazy danych

    Baza danych to kluczowy element systemu. Poniżej przedstawiam przykładowy schemat bazy danych:

    - Tabele:
    - Klienci: ID_Klienta, Nazwa, Adres, NIP, Email, Telefon
    - Produkty: ID_Produktu, Nazwa, Cena, ID_Kategorii, Stan_Magazynowy
    - Kategorie: ID_Kategorii, Nazwa
    - Faktury: ID_Faktury, ID_Klienta, Data, Kwota, Status
    - Pozycje_Faktur: ID_Pozycji, ID_Faktury, ID_Produktu, Ilość, Cena
    - Magazyny: ID_Magazynu, Lokalizacja

    ### 3. Funkcjonalności

    - Zarządzanie klientami: dodawanie, edycja, usuwanie, wyszukiwanie klientów.
    - Zarządzanie produktami: dodawanie, edycja, usuwanie, wyszukiwanie produktów, zarządzanie stanami magazynowymi.
    - Tworzenie faktur: generowanie nowych faktur, dodawanie pozycji do faktur, edycja faktur, eksport do PDF.
    - Zarządzanie magazynem: przegląd stanów magazynowych, transfer towarów między magazynami.

    ### 4. Implementacja

    - Backend: Rozpoczynasz od skonfigurowania serwera (np. Node.js z Express.js). Następnie tworzysz API do obsługi CRUD (Create, Read, Update, Delete) dla klientów, produktów, faktur itd.

    - Frontend: Tworzenie interfejsu użytkownika z użyciem wybranego frameworka (np. React.js). Powinien zawierać formularze do wprowadzania danych, tabele do wyświetlania danych oraz opcje do generowania i eksportu faktur.

    - Komunikacja z bazą danych: Ustawienia połączenia z bazą danych i implementacja zapytań SQL/NoSQL do obsługi danych.

    ### 5. Testowanie i Deployment

    - Przeprowadź testy jednostkowe i integracyjne, aby upewnić się, że wszystkie elementy systemu działają poprawnie.
    - Deployment aplikacji na serwerze produkcyjnym.

    Pamiętaj, że opisany tutaj plan jest tylko ogólnym zarysem. Każdy projekt wymaga indywidualnego podejścia, szczególnie jeśli chodzi o specyficzne potrzeby biznesowe i preferencje użytkowników.

    Mam nadzieję, że ten przegląd pomoże Ci zrozumieć kluczowe etapy projektowania i implementacji systemu do obsługi firmy. Jeśli masz więcej pytań lub potrzebujesz bardziej szczegółowych informacji na temat konkretnych aspektów, śmiało pytaj!
    Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
  • REKLAMA
  • #7 20969620
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9

    @Maciej Gonet Dzięki, o to mi chodziło, ale mam jeszcze pytanie. Ulepszyłem ten kod i teraz wygląda tak:

    
        Dim Data As Range, cell As Range, lCol As Long, lRow As Long
        
        lRow = Sheets("Arkusz1").Cells(Rows.Count, 1).End(xlUp).Row
        lCol = Sheets("Arkusz1").Cells(1, Columns.Count).End(xlToLeft).Column
        Set Data = Range(Sheets("Arkusz1").Cells(1, 1), Sheets("Arkusz1").Cells(lRow, lCol))
        For Each cell In Data
            Select Case cell.Value
                Case "warunek", "licznik", "rok": cell.EntireColumn.Delete
            End Select
        Next cell
    


    Dlaczego po dodaniu nazwy nagłówka w Case "rok" makro nie usuwa za pierwszym razem tej kolumny, a dopiero za drugim?

    @PRL Chcesz powiedzieć, że taki problem jak mój bez problemu rozwiązałaby SI i że era programistów dobiega końca?
  • REKLAMA
  • #8 20969653
    PRL
    Poziom 41  
    Posty: 6868
    Pomógł: 953
    Ocena: 888
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Tak, chcę przez to powiedzieć i chcę powiedzieć, że nawet nie sprawdziłeś działania kodów, które podała SI, a się dziwisz, że takie mądrości potrafi. ;)
    Pomogłem? Kup mi kawę.
  • #9 20970131
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9
    Dzięki za pomoc. Potrzebuję jeszcze skopiować ten arkusz do nowo utworzonego pliku z konkretną nazwą do nowego arkusza w tym samym folderze i zapisania tego pliku. Przyznam że trochę się z tym zakręciłem. Jak to można zrobić w najprostszy sposób?

    Dodano po 43 [minuty]:

    Już sobie z tym poradziłem ale pojawił się kolejny problem. Mam taki kod:

    On Error Resume Next
    If Windows("dokumenty 2024.xlsx").Activate = False Then
            MsgBox "Not open file - dokumenty 2024. Closing Macro."
            Exit Sub
        Else
            Set wb1 = Workbooks("dokumenty 2024.xlsx")
        End If
    On Error GoTo 0


    Zależy mi na tym żeby była brana pod uwagę tylko pierwsza część nazwy bo rok może się zmienić np "dokumenty*.xlsx". Niestety ta gwiazdka nie działa w taki sposób w jaki bym chciał :/
  • Pomocny post
    #10 20970209
    PRL
    Poziom 41  
    Posty: 6868
    Pomógł: 953
    Ocena: 888
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Cytat:
    do nowo utworzonego pliku
    Pomogłem? Kup mi kawę.
  • #11 20970217
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9
    Z tym dodawaniem nowego pliku i kopiowaniem to już sobie poradziłem. Zależy mi tylko na tym żeby nazwa w tym kodzie nie była wpisana na sztywno "dokumenty 2024.xlsx" tylko np "dokumenty*.xlsx" żeby był brany pod uwagę pierwszy człon nazwy bez roku. Czy da radę przekształcić poniższy kod żeby działał w ten sposób?

    On Error Resume Next
    If Windows("dokumenty 2024.xlsx").Activate = False Then
    MsgBox "Not open file - dokumenty 2024. Closing Macro."
    Exit Sub
    Else
    Set wb1 = Workbooks("dokumenty 2024.xlsx")
    End If
    On Error GoTo 0
  • #13 20970254
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9

    Znalazłem, ale nie za bardzo wiem, jak zgrabnie wpasować ten kod w mój kod.

    strTestString = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
  • Pomocny post
    #15 20970269
    k45i89o98j66
    Poziom 39  
    Posty: 4652
    Pomógł: 523
    Ocena: 959
    Aby usunąć wiele kolumn w VBA na podstawie nazw nagłówków, możesz użyć poniższego kodu. Ten kod przeszukuje wiersz nagłówka (w tym przypadku wiersz 1) i usuwa kolumny, które pasują do określonych nazw nagłówków.

    Sub UsunKolumny()
    Dim Naglowki As Variant
    Dim Naglowek As Variant
    Dim Kolumna As Range

    ' Określ nazwy nagłówków do usunięcia
    Naglowki = Array("Naglowek1", "Naglowek2", "Naglowek3")

    ' Przeszukaj każdą kolumnę w wierszu 1
    For Each Kolumna In Worksheets("Arkusz1").Rows(1).Cells
    ' Sprawdź, czy nagłówek kolumny jest jednym z tych, które chcesz usunąć
    For Each Naglowek In Naglowki
    If Kolumna.Value = Naglowek Then
    ' Usuń kolumnę, jeśli nagłówek pasuje
    Kolumna.EntireColumn.Delete
    End If
    Next Naglowek
    Next Kolumna
    End Sub

    Pamiętaj, że ten kod usunie kolumny bez ostrzeżenia, więc zawsze warto zrobić kopię zapasową danych przed uruchomieniem kodu. Kod ten zakłada, że nagłówki są w wierszu 1, ale możesz dostosować go do swoich potrzeb, zmieniając numer wiersza.
  • REKLAMA
  • #16 20970331
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9
    Jeśli będę mieć otwarty plik o nazwie dokumenty2025.xls to poniższy kod również zadziała. Czyli chodzi mi o to żeby była brana pod uwagę tylko nazwa dokumenty a rok ma nie być brany pod uwagę. W poniższym kodzie w miejsce roku wstawiłem gwiazdkę ale to nie działa.

    On Error Resume Next
    If Windows("dokumenty*.xlsx").Activate = False Then
    MsgBox "Not open file - dokumenty*. Closing Macro."
    Exit Sub
    Else
    Set wb1 = Workbooks("dokumenty*.xlsx")
    End If
    On Error GoTo 0

    W obecnym kodzie nazwa dokumenty2024 jest wpisana na sztywno:

    On Error Resume Next
    If Windows("dokumenty 2024.xlsx").Activate = False Then
    MsgBox "Not open file - dokumenty 2024. Closing Macro."
    Exit Sub
    Else
    Set wb1 = Workbooks("dokumenty 2024.xlsx")
    End If
    On Error GoTo 0

    Chodzi po prostu o to żebym co trochę nie musiał zmieniać nazwy w kodzie.

    Dodano po 1 [godziny] 21 [minuty]:

    Cytat:
    If Windows("dokumenty 2024.xlsx").Activate = False Then


    Skąd zaczerpałeś ten kawałek???


    @PRL zapewne z internetu :D Ten kod działa w taki sposób że muszę mieć otwarty plik o takiej nazwie "dokumenty 2024" żeby makro zaczęło działać, w przeciwnym razie wyświetla się komunikat. No i zależy mi na tym żeby był wymagany jedynie pierwszy człon nazwy czyli dokumenty3453456 a to co po dokumenty byłoby nieważne. Mam nadzieję że teraz wyraziłem się zrozumiale.
  • #17 20971972
    kinggustav
    Poziom 27  
    Posty: 796
    Pomógł: 93
    Ocena: 93
    Czyli chcesz pracować z otwartym plikiem o nazwie "Dokumenty*"? Jeżeli tak to musisz przeszukać Workbooks w pętli i sprawdzić czy nazwa zawiera odpowiedni ciąg znaków. Tylko w tym przypadku możesz mieć więcej niż 1 plik. Co wtedy? Ja zwykle dawałem komunikat, że brak pliku lub więcej niż jeden.
  • #18 20972413
    PRL
    Poziom 41  
    Posty: 6868
    Pomógł: 953
    Ocena: 888
    Cytat:
    Ten kod działa w taki sposób że muszę mieć otwarty plik o takiej nazwie "dokumenty 2024" żeby makro zaczęło działać


    I działa tak, jak oczekujesz?
    Pomogłem? Kup mi kawę.
  • #19 20987351
    Wieru
    Poziom 5  
    Posty: 125
    Ocena: 9
    Dziękuję za pomoc, zamykam temat.

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na usunięcie kolumn w arkuszu Excel na podstawie nazw nagłówków za pomocą VBA. Otrzymał kilka propozycji kodu, w tym użycie pętli oraz instrukcji Select Case do identyfikacji i usuwania kolumn o nazwach "warunek", "licznik" i "rok". Użytkownik zaktualizował kod, aby dynamicznie określać zakres danych, ale napotkał problem z usuwaniem kolumny "rok". W kolejnych wiadomościach poruszono również temat kopiowania arkusza do nowego pliku oraz dynamicznego wyszukiwania plików na podstawie części nazwy, co wymagało zastosowania funkcji Left() i InStr(). Użytkownik zakończył dyskusję, informując o rozwiązaniu swojego problemu.
Wygenerowane przez model językowy.
REKLAMA