

Excel makro pre kopirovanie riadkov v dvoch zositoch.
Ahojte..., potreboval by som macro, ktore by vykonalo nasledovne: Dajme tomu, ze v exceli mam dva zosity (1 a 2). Zo zosita cislo 1 potrebujem skopirovat bunky (A3 az G3) do zosita cislo 2 v rozsahu stlpcov A az G s nasledovnymi podmienkami: Ak prve tri bunky (A3,B3,C3) zo zosita 1 budu zhodne s prvymi tromi bunkami uz existujuceho riadku v zosite 2, tak bunky D3 az G3 (ciselne hodnoty) zosita 1 sa pripocitaju ku hodnotam danemu riadku zosita 2. Ak tieto prve tri bunky nebudu zhodne s uz existujucim zaznamom v zosite 2, tak sa cely riadok (A3 az G3) zo zosita 1 skopiruje do zosita 2 na posledny volny riadok. Snad je to ako tak zrozumitelne. Dakujem!
1. bunky D3 až G3 hárka 1 pripočítať k bunkám D3 až G3 hárka 2?
2. asi si chcel povedať skopírovať do hárka 2 na prvý voľný riadok?
R
Takto:
Sheet 1:
19.8.2013 volvo green 1 1 1
Sheet 2:
15.8.2013 audi green 1 1 1
16.8.2013 bmw black 1 1 1
19.8.2013 volvo green 1 1 1
19.8.2013 toyota black 1 1 1
result after script:
Sheet 2:
15.8.2013 audi green 1 1 1
16.8.2013 bmw black 1 1 1
19.8.2013 volvo green 2 2 2
19.8.2013 toyota black 1 1 1
Alebo ked prve tri bunky zo zosita 1 sa nebudu rovnat prvym trom bunkam z nejakeho uz existujuceho riadka v zosite dva, tak cely riadok zo zosita jedna sa prida ako posledny volny riadok do zosita 2. Tu cast skriptu kedy sa prida cely riadok mam vyriesenu, ale neviem ako vyriesit porovnanie tych troch prvych buniek zo zosita 1 so vsetkymi riadkami zosita 2 a tam kde je zhoda, tak zvysne bunky s ciselnymi hodnotami sa pripocitaju ku prislusnemu riadku v zosite 2.
Stĺpec A som z príkladu pochopil ako dátum, B ako značku a C ako farbu...
potom ale sčítaval len D,E a F. G tam už nie je. Ak som to zle pochopil, tak treba kód upraviť v tom zmysle ako to potrebuješ.
A urobil som to tak, že v hárku 1 môžeš mať zoznam, nielen jeden riadok. Týmpádom prejde celý zoznam na hárku 1 a urobí, čo treba na hárku 2. Potom je možné zoznam na 1. hárku zmazať
Sub Makro1()
PR1 = Sheets(1).Range("A3").End(xlDown).Row
PR2 = Sheets(2).Range("A3").End(xlDown).Row
For i = 3 To PR1
For j = 3 To PR2
If Sheets(1).Range("A" & i) = Sheets(2).Range("A" & j) And Sheets(1).Range("B" & i) = Sheets(2).Range("B" & j) And Sheets(1).Range("C" & i) = Sheets(2).Range("C" & j) Then
Sheets(2).Range("D" & j) = Sheets(2).Range("D" & j) + Sheets(1).Range("D" & i)
Sheets(2).Range("E" & j) = Sheets(2).Range("E" & j) + Sheets(1).Range("E" & i)
Sheets(2).Range("F" & j) = Sheets(2).Range("F" & j) + Sheets(1).Range("F" & i)
GoTo DalsieI
End If
Next j
Sheets(1).Range("A" & i & ":F" & i).Copy (Sheets(2).Range("A" & (PR2 + 1)))
PR2 = PR2 + 1
DalsieI:
Next i
End Sub
Robo velke dik za snahu, ale prave to testujem a vzdy ked ten skript spustim, tak zamrzne cely excel. Pouzivam verziu 2010. Jasne, ten pocet buniek nie je podstatny, to si uz upravim, ale zatial som to nerozchodil...
A samozrejme to, ze ten riadok je v zosite dva tiez na pozicii A3... je len nahoda, ja potrebujem v zosite dva prehladat vsetky existujuce zaznamy (riadky).
trochu vylepšené
No Robo tie tvoje subory mi funguju. Prikladam vzorku toho mojho, ktory mi stale mrzne...dik moc!
425084133
jasné, že mrzne, lebo v hárku 1 máš len 1 riadok a príkaz xlDown pre neho v tom prípade znamená skok na úplne posledný riadok excelu a to je 1 048 576. riadok ;)
Zato som ti vravel, že aj v hárku 1 môžeš mať zoznam a nie len jeden riadok.
Dopĺňam ti preto makro tak, aby ani takýto stav neviedol do chyby (ale samozrejme, riadok s údajmi musí byť v hárku 1 v 3. riadku)
Okrem toho sa porovnávajú len prvé tri stĺpce! Ak chceš na zhodu porovnávať aj 4. stĺpec, potrebné doplniť do kódu.
Sefe diky moc, funguje to presne ako som potreboval. Super!
ok, teší ma ;)
Ja mam taky problem v exceli:
mam napriklad 4 harky Prvy harok je moj archiv druhy je posta Kosice druhy posta Presov treti posta Nitra.
Ak zadan do archivu
meno cislo zasielky a posta kosice(posta kosice) aby mi automaticky cely riadok skopirovalo na druhy harok ktory ma nazov posta Kosice?
Neviem ci som to zrozumitelne napisal dik za odpoved
v prílohe posielam riešenie
Prenos želaných údajov do svojho hárka nastáva tak, že sa označí bunka riadka, ktorý sa má preniesť (je jedno, ktorý stĺpec) a stlačí sa tlačidlo prenosu.
Makro vyhodnotí, ktorá bunka je aktívna, zistí z nej riadok a celý ten riadok prekopíruje do hárka, názov ktorého si zistí zo stĺpca D riadka s aktívnou bunkou. Riadok je do cieľového hárka nakopírovaný do nasledujúceho voľného riadka.
Okrem toho, makro zistí, či pošta uvedená v stĺpci D aktívneho riadka už má svoj vlastný hárok. Pokiaľ ešte hárok s takou poštou neexistuje, založí nový a pomenuje podľa obsahu bunky D aktívneho riadka archívu. Preto je dôležité, aby v Archíve neboli v názve pošty preklepy. Ak totiž omylom napíšeš Košie, tak ti založí nový hárok s názvom Košie a obsah prekopíruje tam.
Toto makro nezisťuje, či už niektorý z riadkov nebol do cieľového hárka prenesený, t.j. daný riadok sa tam zapíše toľkokrát, koľkokrát si ho stlačením tlačidla prenosu tam odoslal.
Samozrejme, dá sa ošetriť aj to, ale na to teraz nemám čas, tak som dal aspoň prefarbiť riadky, u ktorých prenos už bol vykonaný
P.S. pri spúšťaní zošita je samozrejme nutné povoliť makrá!
mozem ti poslat moj dokument pre lepsiu predstavu?
das mi tvoj email adresu?
da sa to spravit aj tak, ze ked vytvorim bunku s overovanim udajov a tam dam moznosti kosice nitra presov a ked v tej bunke zvolim kosice prekopiruje sa to do listu kosice?
nie, pretože sa nedá priradiť spúšťajúca udalosť len k bunkám určitého stĺpca. Dá sa urobiť to, že sa to makro spustí pri každej zmene v zošite ale my nechceme, aby sa to spustilo aj keď zadávam meno, číslo zásielky a pod, ale len pri zadaní pošty... Takže pri takomto riešení síce overíš, že tam nebudeš mať preklep ale treba následne obslúžiť tlačidlo prenosu.
Súbor môžeš priložiť aj sem, ale ak chceš cez mail, tak môj mail ti pošlem na tvoj, keď ho tu zverejníš.
Inak... to čo chceš, by sa dalo cez užívateľský formulár, t.j. aj vpisovanie do tvojho archívu by sa dialo cez okno s nadefinovanými textovými poliami a tam by sa zároveň ošetrilo aj to, že akonáhle ho zapíšeš do archívu, prenesie sa i do svojho príslušného hárku. Nie je problém...
a teraz ma napadá, že by sa to hádam dalo aj tak, ako si vravel... ono by sa pri každej zmene v zošite spustilo makro ale doň by sa dala podmienka, že prenos nastane len ak máš aktívny hárok "Archív" a sú už všetky údaje v danom riadku zapísané. Potom by sa však stalo aj to, že by si chcel opraviť niektorý už existujúci riadok v archíve... napríklad by si opravil číslo zásielky a keď ukončíš jeho opravu stlačením Enter, makro bude automaticky spustené a opravený riadok by sa preniesol znovu do svojho hárku. Síce do správneho (podľa pošty) ale raz by tam už bol s nesprávnym číslom zásielky a tiež by sa teraz vpísal na koniec zoznamu, tentokrát so správnym číslom zásielky... Dalo by sa to zas ošetriť tým, že by tam existovalo tlačidlo, ktoré by slúžilo na to, že sa v archíve postavíš na riadok, ktorý chceš opraviť a stlačíš to tlačidlo. To by spravilo to, že si v príslušnom hárku nájde ten záznam a zmaže ho a následne by si ten riadok opravil a on by ho vradil na miesto, kde bol pôvodný... Dá sa všetko :D
moj email
aberto.anton@gmail.com
môj mail odoslaný... došiel?