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

vba excell - kopiowanie zaznaczonych rekordów

bezdura 03 Gru 2009 23:48 4305 15
  • #1 03 Gru 2009 23:48
    bezdura
    Poziom 12  

    witam

    Jestem nowicjuszem jeżeli chodzi o vba i potrzebuje od Was pomocy.

    Mam w arkuszu2 kilka kolumn, gdzie jedna G ma wpisy 1 lub 0. I teraz chce aby w zaznaczonym prze ze mnie zakresie rekordów skopiowane zostały do arkusza 1 tylko te rekordy gdzie jest 1 w kolumnie G arkusz2.

    dodatkowo każda kolejna operacja kopiowania ma dodawać w arkuszu1 kolejno jeden pod drugim skopiowane rekordy. czyli jezeli w arkuszu1 jest rekordów 102 to zeby on mi wkleił od 103 itd.


    Mam nadzieje ze wiecie o co mi chodzi i bardzo Was proszę o pomoc.


    dzieki

    0 15
  • Pomocny post
    #2 04 Gru 2009 08:10
    adamas_nt
    Moderator Programowanie

    bezdura napisał:
    w zaznaczonym przeze mnie zakresie
    Nie doczytałem, post zmieniłem
    Code:
    Sub KopiuZaznaczone()
    
    Dim kom As Range, i As Integer, ostWrs As Long
    ostWrs = Sheets(1).Range("G65536").End(xlUp).Row + 1
    For Each kom In Selection
     If Left(kom.Address, 2) = "$G" Then
      If kom.Value = 1 Then
        ActiveSheet.Rows(kom.Row).Copy Sheets(1).Rows(ostWrs)
        ostWrs = ostWrs + 1
      End If
     End If
    Next
    End Sub

    0
  • #3 05 Gru 2009 00:08
    bezdura
    Poziom 12  

    dzięki wielkie, oczywiscie działa jak chciałem.

    W podobny sposób ma to działac dla innych danych,ale napotkałem problem.
    Arkusz2 wyglada tak:

    data nr maszyny ilosc
    12.10.2010 5 5000
    13.10.2010 5
    14.10.2010 4
    14.10.2010 5 3100
    14.10.2010 4 3000
    14.10.2010 4
    14.10.2010 4 3000

    I teraz generalnie to ma działac tak samo z tym że tutaj warunkiem jest kloumna nr maszyny i w zaleznosci od nr kopiuje do innych arkuszy.Nr 5 do innego a nr4 do innego.I teraz problem jest taki ze np w przypadku rekordu1 i 2 to ma byc traktowane jako jedno, tzn kiedy w jednym rekordzie jest wpisana ilośc a w rekordzie poniżej nie,wowczas oba te rekordy są kopiowane jak niby jedna całosc.Bo nie moze byc sytuacji ze te dwa rekordy sie jakoś wymieszaja . dodatkowo bym chciał aby takie "paczki" po skopjowaniu w jakis sposób zostały scalone . Gdyż pożniej ja jest sortuje np po dacie i ta poczka musi byc traktowana jak jeden rekord.


    wiem ze jestto zawiłe ale mam nadzieje ze wiecie o co chodzi. Jeżeli tak to pomóżcie prosze.

    0
  • #4 05 Gru 2009 06:58
    adamas_nt
    Moderator Programowanie

    bezdura napisał:
    dodatkowo bym chciał aby takie "paczki" po skopjowaniu w jakis sposób zostały scalone . Gdyż pożniej ja jest sortuje
    I tu jest sedno. Jeżeli w wierszu w pojedynczej kolumnie scalisz komórki w pionie, to już nie posortujesz.

    Trzeba przyjąć jakiś system. Jeśli data zapisana jest jako tekst (kropka jest kropką a nie separatorem), to najprościej byłoby dopisywać Np liczbę dni do "daty". Dla maszyny Nr 5 wynik wyglądałby tak:

    12.10.2010+1   5000 (i wiadomo, że dwa dni)
    14.10.2010       3100

    Dla Nr 4 (data ta sama, więc suma):
    14.10.2010   6000

    I teraz można sortować...
    Przemyśl i napisz jak Ty to widzisz.

    0
  • #5 08 Gru 2009 21:25
    bezdura
    Poziom 12  

    nie wiem ale chyba się żle zrozumieliśmy albo ja coś zle przedstawiłem.


    Wyglada to tak:

    vba excell - kopiowanie zaznaczonych rekordów

    a powinno być tak po przesortowaniu

    vba excell - kopiowanie zaznaczonych rekordów


    I teraz jak to zrobić, bo nie mam całkowicie pomysłu na to.A zastanawiałem sie nad tym długo.

    0
  • #6 09 Gru 2009 07:08
    adamas_nt
    Moderator Programowanie

    Przyznam, że się pogubiłem :)
    Jeśli chodzi o sortowanie, to masz gotowe narzędzie Excela...
    Co do drugiego tematu postępuj wg schematu:
    =JEŻELI(WYSZUKAJ.PIONOWO(...)<>WYSZUKAJ.PIONOWO(...);...
    Możesz połączyć z PODAJ.POZYCJĘ i WIERSZ lub INDEKS, a nie będzie "dziur" w tabelce.

    0
  • #7 09 Gru 2009 22:24
    bezdura
    Poziom 12  

    No chodzi o to że np rekordy 2 i 3 muszę traktować jak jeden scalony rekord bo mam tam rózne daty i jak posortuje normalnie to mi ten niby scalony rekord rozwali

    0
  • #8 11 Gru 2009 09:00
    adamas_nt
    Moderator Programowanie

    Sortować możesz wg kilku poziomów tak, żeby nie "gubić" rekordów. Nie napisałeś tylko co z wierszami, w których ilość jest zerowa (pusta). Dalej nie wiemy czy to oznacza, że produkcja trwała dwa dni (Rys.2 wiersz 2,3) czy to, że w danym dniu (wrs.3) nic nie wyprodukowano...
    Pozostaje pytanie: Chcesz scalać wiersze, usuwać te z pustą ilością, czy sortować je wg jakiś nietypowych zasad?

    0
  • #9 14 Gru 2009 23:02
    bezdura
    Poziom 12  

    Jeżeli chodzi o te rekordy to generalnie chodzi o to że te rekordy

    vba excell - kopiowanie zaznaczonych rekordów

    muszą być traktowane jak jeden rekord, a problem w tym ze on ma dwie rózne daty i nie moge tak sobie zwyczajnie dać filtr czy też posortować bo mi się te rekordy "rozłączą" Dlatego szukam sposobu jak zrobić aby excell traktował mi jak dwa razem.


    Mam jeszcze jedną prośba do Was. Mianowicie jak w temacie " kopiowanie zaznaczonych rekordów". adamas_nt przesłał kod:

    Code:
    Sub KopiuZaznaczone() 
    
    Dim kom As Range, i As Integer, ostWrs As Long
    ostWrs = Sheets(1).Range("G65536").End(xlUp).Row + 1
    For Each kom In Selection
     If Left(kom.Address, 2) = "$G" Then
      If kom.Value = 1 Then
        ActiveSheet.Rows(kom.Row).Copy Sheets(1).Rows(ostWrs)
        ostWrs = ostWrs + 1
      End If
     End If
    Next
    End Sub


    I teraz ja potrzebuje jeszcze jeden warunek do spełnienia aby skopiowało do drugiego arkusza. Teraz jest tak że kopiuje tylko te jeżeli w kolumnie G jest 1 , a ja potrzebuje zeby kopiował jeżeli w kolumnie G jest 1 oraz w kolumnie H jest "tak".

    Bardzo Was prosze o pomoc bo jest dla mnie bardzo Pilne.
    dzięki

    0
  • #10 15 Gru 2009 07:39
    adamas_nt
    Moderator Programowanie

    bezdura napisał:
    potrzebuje zeby kopiował jeżeli w kolumnie G jest 1 oraz w kolumnie H jest "tak"
    Do zmiennej kom przypisany jest adres, więc można potraktować go offsetem. Np
    Code:
    If kom.Value = 1 And kom.Offset(0, 1).Value = "tak" Then

    Koniecznie chcesz aby Excel "widział" dwa wiersze jako jeden. Odpowiedź Excela brzmi: "nie da się".
    Dalej nie wytłumaczyłeś o co chodzi z ilością (ostatnia kolumna)...
    Dlaczego w jednym wierszu jest liczba, a w następnym pusto? Raz jest to ta sama data, w innym przypadku różna. Z czego wynika taki zapis i co oznacza?

    0
  • #11 15 Gru 2009 09:38
    bezdura
    Poziom 12  

    wracajac do kopiowania tych rekordów , to wyszłoni coś takiego:

    Code:
    Sub Przycisk2_Kliknięcie()
    
    Dim kom As Range, i As Integer, ostWrs As Long
    ostWrs = Sheets(1).Range("C65536").End(xlUp).Row + 1
    For Each kom In Selection
     If Left(kom.Address, 2) = "$C" Then
    If kom.Value = 1 And kom.Offset(0, 1).Value = "tak" Then
       ActiveSheet.Rows(kom.Row).Copy Sheets(1).Rows(ostWrs)
        ostWrs = ostWrs + 1
      End If
     End If


    Next




    End Sub


    tylko nie działa :(

    0
  • #12 15 Gru 2009 09:54
    adamas_nt
    Moderator Programowanie

    bezdura napisał:
    potrzebuje zeby kopiował jeżeli w kolumnie G jest 1 oraz w kolumnie H jest "tak"
    bezdura napisał:
    If Left(kom.Address, 2) = "$C" Then
    Jeśli C i H to zmień parametr kolumny w Offset...

    0
  • #13 15 Gru 2009 10:34
    bezdura
    Poziom 12  

    kurcze wklej proszę cały kod bo nie wiem co mam z tym zrobić. chodzi mi o kolumny E i A

    0
  • #14 15 Gru 2009 12:21
    adamas_nt
    Moderator Programowanie

    Wydaje mi się, że lepiej będzie jak "załapiesz" o co chodzi. Pierwotna wersja pętli

    Code:
    For Each kom In Selection
    
     If Left(kom.Address, 2) = "$G" Then
      If kom.Value = 1 And kom.Offset(0, 1).Value = "tak" Then
        ActiveSheet.Rows(kom.Row).Copy Sheets(1).Rows(ostWrs)
        ostWrs = ostWrs + 1
      End If
     End If
    Next
    Druga linia sprawdza pierwsze dwa znaki adresu (gdyby wiadomo było jaki zakres jest zaznaczany, można by ją pominąć. Ale żeby zminimalizować możliwość błędu jej obecność jest konieczna). Czyli: makro "leci" po komórkach (wierszami od lewej do prawej) zaznaczonego zakresu i jeśli trafi na kolumnę "G", warunek jest spełniony i wykonywana jest następna linia. W naszym przypadku kolejny test: Jeśli wartość tej komórki jest równa jeden. Jeśli chcesz wykonywać testy na innej kolumnie (zaznaczonego zakresu), to po prostu zmień literę...
    Code:
    kom.Offset(0, 1)
    natomiast, to odpowiednik funkcji PRZESUNIĘCIE (poczytaj w helpie). Parametry w nawiasie to liczba wierszy i kolumn o jakie chcesz (w naszym przypadku) przesunąć odczytanie wartości. W przykładzie przesunięcie ma wartość 0 wierszy i 1 kolumna w prawo (kolumna "H" w tym samym wierszu).

    0
  • #15 15 Gru 2009 15:18
    bezdura
    Poziom 12  

    Ok, super dzieki. działa

    Ale chciałbym dodatkowo aby wszystko co ma Tak oraz wszystko inne niz kk kopiowało do innego arkusza na takiej samej zasadzie jak wczesniej.

    zrobiłem cos takiego

    Code:
    Dim kom2 As Range, i2 As Integer, ostWrs2 As Long
    
    ostWrs2 = Sheets("sztanca_sanwa").Range("I65536").End(xlUp).Row + 1
    For Each kom2 In Selection
     If Left(kom2.Address, 2) = "$I" Then
      If kom2.Value <> "kk" And kom2.Offset(0, 13).Value = "tak" Then
        ActiveSheet.Rows(kom2.Row).Copy Sheets("sztanca_sanwa").Rows(ostWrs2)
        ostWrs2 = ostWrs2 + 1
     
     
      End If
     End If
    Next


    ale nie działa. Problem tkwi własnie w tym <>, nie łąpie tego.

    Pomożesz jeszcze raz??

    0
  • #16 15 Gru 2009 16:35
    adamas_nt
    Moderator Programowanie

    Prawie dobrze. Sama pętla jest OK. Może źle liczysz kolumny (Offset).

    Code:
    If kom2.Value <> "kk" And kom2.Offset(0, 13).Value = "tak" Then 
    tu: warunkiem kopiowania jest dowolna wartość z wyjątkiem tekstu "kk" w kolumnie "I" oraz tekst: "tak" w kolumnie "V" (kol. "I"+13), wielkość liter ma znaczenie. Jeśli możliwe jest wpisanie również "Tak" lub "TAK" zabezpiecz to funkcją LCase (zamień litery na małe).
    Code:
    LCase(kom2.Offset(0, 13).Value) = "tak"


    Natomiast pułapką jest przypisanie ostatniego wiersza dla zmiennej "ostWrs2". Warunek <>"kk" oznacza także pustą komórkę. Jeśli takowa znajdzie się (a może) jako ostatnia w kolumnie "I" arkusza docelowego, to wiersz zostanie nadpisany. "Pewniakiem" jest tu kolumna "V", bo w każdym kopiowanym wierszu jest wartość "tak".
    Code:
    ostWrs2 = Sheets("sztanca_sanwa").Range("V65536").End(xlUp).Row + 1 

    0
  Szukaj w 5mln produktów