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

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

patrykm.14 17 Lip 2019 11:58 1476 19
REKLAMA
  • #1 18065453
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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
  • REKLAMA
  • #3 18065793
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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
  • REKLAMA
  • #4 18066911
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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).
  • REKLAMA
  • #5 18067037
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    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ę.
  • #6 18067072
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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.
  • #7 18067212
    Andrzej59
    Poziom 20  
    Posty: 251
    Pomógł: 49
    Ocena: 43
    W jaki formacie są exportowane
  • #8 18067248
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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
  • REKLAMA
  • #10 18067526
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    Tylko teoretycznie, gdyż jeśli program wygeneruje miesiąc później kolejny plik, to znowu będzie go trzeba połączyć.
  • #11 18067557
    Andrzej59
    Poziom 20  
    Posty: 251
    Pomógł: 49
    Ocena: 43
    Umieszczasz plik w folderze z poprzednimi plikami i robisz odśwież
  • #12 18067632
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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ę?
  • #13 18067658
    Andrzej59
    Poziom 20  
    Posty: 251
    Pomógł: 49
    Ocena: 43
    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ą.
  • #14 18067687
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    Oki dzięki za wskazówki, chyba zmierzam ku celowi.
  • #15 18067861
    Prot
    Poziom 38  
    Posty: 2580
    Pomógł: 574
    Ocena: 297
    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 (102.28 kB)Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 18067987
    clubs
    Poziom 38  
    Posty: 2219
    Pomógł: 629
    Ocena: 406
    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.
  • #17 18068759
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    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).
  • #18 18068914
    patrykm.14
    Poziom 11  
    Posty: 47
    Ocena: 7
    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.
  • #19 18068988
    Prot
    Poziom 38  
    Posty: 2580
    Pomógł: 574
    Ocena: 297
    Widziałem, że masz kłopoty z uruchomieniem mojego pliku :cry: Utworzyłem go w Excel 2007 pod WinXP, więc przeniosłem go na laptopa z Excel 2016 pod Win10 i po wskazanej wcześniej modyfikacji ścieżki dostępu pliku :!: wszystko działa bezproblemowo :spoko:
    Kopiowanie wszystkich wierszy, gdy wartość w kolumnie jest niepusta- Excel VBA2019-07...png (95.17 kB)Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 18069296
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    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

Podsumowanie tematu

✨ Użytkownik poszukiwał kodu VBA do skopiowania wszystkich wierszy z Arkusza1 do Arkusza2, gdy wartość w kolumnie "B" jest niepusta. Otrzymał kilka propozycji kodu, które poprawiały wydajność operacji, w tym wyłączenie odświeżania ekranu oraz użycie metod kopiowania całych wierszy. Wskazano również na możliwość użycia Power Query, jednak użytkownik miał ograniczenia związane z wersją Excela (2010). W odpowiedziach zasugerowano różne techniki optymalizacji, takie jak sortowanie danych przed kopiowaniem oraz użycie SQL w VBA. Użytkownik ostatecznie zdecydował się na stworzenie makra, które skopiuje dane i utworzy tabelę, a także zamknie plik po jego przetworzeniu.
Wygenerowane przez model językowy.
REKLAMA