Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Kopiowanie wszystkich wierszy, gdy wartość w kolumnie jest niepusta- Excel VBA

17 Lip 2019 11:58 273 19
  • Poziom 10  
    Dzień dobry, mam problem, gdyż potrzebuje kodu, który znajdzie mi wszystkie niepuste wartości w kolumnie "B" z Arkusza1, i wklei wszystkie wiersze do Arkusza2, gdy ta wartość w kolumnie "B" jest niepusta.
    Mam coś takiego, lecz nie wiem jak poradzić sobie z kopiowaniem wszystkich wierszy, a nie tylko danej kolumny.
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
  • Poziom 10  
    Dzięki, ja użyłem tego kodu, lecz przy 65000 danych idzie to strasznie wolno, są jakieś inne sposoby?
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
  • Moderator Programowanie
    Wyłącz odświeżanie ekranu (screenUpdating) na czas działania makra.

    Z drugiej strony...
    sheets(1).range("A1:X" & LastRow).copy sheets(2).Range("A1")
    i w pętli usunąć puste

    Może szybciej będzie.

    Jeszcze inna opcja:
    Odfiltrować puste i skopiować cały zakres ("zwykłe" Copy kopiuje tylko widoczne).
  • Poziom 22  
    A jeszcze szybciej będzie jak to sprytnie posortujesz, wtedy te niepuste wiersze będą w kupie i możesz resztę pominąć. Z pewnością przyspieszy, a sortowanie trwa tylko chwilę.
  • Poziom 10  
    Te dane są eksportowane z programu, żadne sortowanie ani filtrowanie nie działa, dlatego jest problem. Zastosowałem metodę kopiowania samych wartości do nowego arkusza, a później w tym arkuszu usuwanie od dołu pustych wierszy. Nie jest to najszybsza metoda, ale nie znalazłem lepszego sposobu na to.
  • Poziom 20  
    W jaki formacie są exportowane
  • Poziom 10  
    Do pliku xls, tak jak na poniższym zdjęciu.

    Mam stworzone makro które kopiuje same wartości do nowego arkusza, tam wszystko porządkuje, a następnie kopiuje do pliku który jest już stworzony, na którym będą działy się wszystkie operacje. Dzieje się to w optymalnym czasie(około 2 minuty) W tą stronę wszystko pasuje, tylko ten plik eksportowany będzie co miesiąc nowy( w takim samym formacie), więc makro muszę umieścić na tym pliku, na którym będą wykorzystywane już gotowe wyczyszczone dane, lecz jeśli tak robię, to makro strasznie długo działa i zadanie się nie wykonuje. Dlaczego tak?

    Kopiowanie wszystkich wierszy, gdy wartość w kolumnie jest niepusta- Excel VBA
  • Poziom 10  
    Tylko teoretycznie, gdyż jeśli program wygeneruje miesiąc później kolejny plik, to znowu będzie go trzeba połączyć.
  • Poziom 20  
    Umieszczasz plik w folderze z poprzednimi plikami i robisz odśwież
  • Poziom 10  
    Ale zawsze ma pobierać wartość z jednego pliku, który będzie powiększony o kolejne dane, a nie wiem jak będzie nazywany, możliwe że za każdym razem inaczej. Mimo wszystko ta opcja da radę?
  • Poziom 20  
    Da radę . Poczytaj trochę na YT o Power Query
    Na YT filmy o PQ ma Excel i Adam oraz PMSOCHO wszystko po polsku fajnie tłumaczą.
  • Poziom 10  
    Oki dzięki za wskazówki, chyba zmierzam ku celowi.
  • Poziom 35  
    patrykm.14 napisał:
    Ale zawsze ma pobierać wartość z jednego pliku, który będzie powiększony o kolejne dane

    W takiej sytuacji możesz spróbować rozwiązania VBA opartego o kwerendę SQL
    i Microsoft Query (po uprzedniej modyfikacji kodu w miejscu: DBQ=O:\Test\Moje\ProtDataFiltr.xlsm;DefaultDir=O:\Test\Moje;-poprzez wymianę Twojej lokalizacji pliku i ścieżki :D , oraz odpowiedniej korekcie kodu kwerendy :cry: ).
    Zaletą rozwiązania jest oczywiście czas działania - dla 700 wierszy danych - kilka sekund :idea:
    ProtDataF..tr.zip Download (102.28 kB)Punkty: 2.5 dla użytkownika
  • Poziom 34  
    patrykm.14 napisał:
    lecz przy 65000 danych idzie to strasznie wolno, są jakieś inne sposoby?

    Do tego kopiujesz całe wiersze
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    więc nic dziwnego że wolno , ogranicz to tylko do faktycznych danych.
  • Poziom 22  
    To pewnie będzie trzeba zmienić podejście. Masz dane z ostatniego miesiąca (ile wierszy?) i potrafisz go przekonwertować do wymaganej postaci, masz z poprzednich miesięcy (znowu ile?) i to wszystko potem musisz złączyć (czy tu nie wejdziemy w ograniczenie Excela?) i przetwarzać? Dobrze to rozumiem?
    Jeżeli potrafisz przekonwertować plik w rozsądnym czasie i masz problem żeby to zmienić, to może zapisz go gdzieś, a potem wczytaj już gotowy. Makro bym umieścił w pliku, gdzie masz dane z poprzednich okresów i ew. coś jeszcze. Dzięki temu operowałoby tylko na jednym skoroszycie. Różne nazwy pliku to nie problem, wystarczy go ręcznie otworzyć i brać dane z już otwartego Excela (moja ulubiona metoda wybierania, z tego co napisałeś możesz szukać otwartego pliku z końcówką nazwy .xls).
  • Poziom 10  
    kinggustav napisał:
    To pewnie będzie trzeba zmienić podejście. Masz dane z ostatniego miesiąca (ile wierszy?) i potrafisz go przekonwertować do wymaganej postaci, masz z poprzednich miesięcy (znowu ile?) i to wszystko potem musisz złączyć (czy tu nie wejdziemy w ograniczenie Excela?) i przetwarzać? Dobrze to rozumiem?
    Jeżeli potrafisz przekonwertować plik w rozsądnym czasie i masz problem żeby to zmienić, to może zapisz go gdzieś, a potem wczytaj już gotowy. Makro bym umieścił w pliku, gdzie masz dane z poprzednich okresów i ew. coś jeszcze. Dzięki temu operowałoby tylko na jednym skoroszycie. Różne nazwy pliku to nie problem, wystarczy go ręcznie otworzyć i brać dane z już otwartego Excela (moja ulubiona metoda wybierania, z tego co napisałeś możesz szukać otwartego pliku z końcówką nazwy .xls).


    Udało mi się wszystko zrobić tak jak chciałem dzięki Power Query, lecz firma nie posiada ( i nie chce posiadać) tego dodatku, gdyż korzystają z Excel 2010. Także muszę zmienić sposób, zrobię makro, które skopiuje dane i stworzy z nich tabelę, oraz odznaczy puste wiersze. Możesz mi podać fragment kodu, który pozwoli na wybór pliku, z którego zacznie kopiować dane?

    Edit:
    Mam kod do otwierania okna wyboru pliku, lecz po wyborze i skopiowaniu odpowiednich rzeczy chciałbym ten plik zamknąć, i nie wiem jak się za to zabrać.

    Sub czyszczenie()
    Dim plik As String

    plik = Application.GetOpenFilename( _
    FileFilter:="Plik raportu w formacie Exela ,*.xl*", _
    Title:=" Wska¿ plik z raportu dziennego")

    If plik = "False" Then
    MsgBox " Anulowano wczytywanie", vbCritical, " U W A G A"
    Else
    MsgBox plik, , " Wczytywanie plku"
    End If

    Workbooks.Open Filename:=plik


    Range("A2:Y4").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    Windows("RAPORT Stacji F1 - Kopia.xlsm").Activate
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

    'tu powinno zamykać plik, Workbooks.Close Filename:=plik ani Workbooks(plik).close nie działa

    End sub

    Edit2: Poradziłem sobie używając set.
  • Poziom 22  
    Ja używam takiej funkcji. Jako parametr podajesz odpowiedni kawałek nazwy pliku. Po wywołaniu sprawdż czy nie jest puste i możesz używać: Workbooks(GetExcel(".xls")).Activate i dalej to już pewnie wiesz co.

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod