Kopiranje naslednjega obsega celic

Pomoč pri izdelavi makrov
Odgovori
drglzr
Prispevkov: 31
Pridružen: Če Feb 21, 2013 10:06 pm

Kopiranje naslednjega obsega celic

Odgovor Napisal/-a drglzr »

Pozdravljeni.

Zanima me, kako bi lahko z enega lista, kjer je zasedenih več zaporednih vrstic in stolpcev, na drug list prenesel le podatke iz obsega npr. 5 vrstic in zasedenih stolpcev, izvedel določeno funkcijo in nato prenesel naslednjih 5 vrstic, spet izvedel funkcijo itd. Predvsem me muči, kako zapisati, da poišče in prenese naslednji obseg celic po izvedbi funkcije. Sedaj pač želene celice vsakič ročno kopiram.

Verjamem, da ni ne vem kako zapleteno, vendar se ne morem domisliti načina :evil: .

Hvala za pomoč.

Drago
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: Kopiranje naslednjega obsega celic

Odgovor Napisal/-a admin »

Pozdravljeni,

Celice iz lista na list kopirate s pomočjo ukaza Copy.

Pri tem je seveda potrebno poznati VBA način dostopa do celice v Excelu. Do celice dostopate preko polja Cells, ki sprejme dva parametra, vrstico in kolono. Torej Cells(5, 8), pomeni peta vrstica, 8 kolona ali celica H5. Če pa želite določiti polje celic, pa uporabite polje Range, ki tudi sprejme dva parametra in sicer gornjo levo celco on spodnjo desno. Torej Range(Cells(3, 1), cells(5, 8)) pomeni: celice od tretje vrstice in prve kolone do pete vrstice in osme kolone, torej A3:H5.

Glede na to znanje lahko recimo z eno VBA vrstico kopirate celice iz lista2 na list1:

Koda: Izberi vse

    Worksheets("List2").Range(Worksheets("List2").Cells(5, 1), Worksheets("List2").Cells(10, 3)).Copy _
      Worksheets("List1").Range(Worksheets("List1").Cells(5, 1), Worksheets("List1").Cells(10, 3))
Če pa podate parameter pa lahko od tega parametra pač kopirate pet vrstic:

Koda: Izberi vse

Sub kopiraj(odVrstice As Integer)
    Worksheets("List2").Range(Worksheets("List2").Cells(odVrstice, 1), Worksheets("List2").Cells(odVrstice + 4, 3)).Copy _
      Worksheets("List1").Range(Worksheets("List1").Cells(1, 1), Worksheets("List1").Cells(5, 3))
End Sub
Sedaj ukaz kopiraj 1 kopira prve tri kolone iz prvih treh vrstic na list1 na območje A1 do C5.
Ukaz kopiraj 13 kopira prve tri kolone iz 13, 14, 15, 16 in 17-te vrstice na list1 na območje A1 do C5.
lp,
Matjaž Prtenjak
Administrator
drglzr
Prispevkov: 31
Pridružen: Če Feb 21, 2013 10:06 pm

Re: Kopiranje naslednjega obsega celic

Odgovor Napisal/-a drglzr »

Pozdravljeni.

Hvala za pomoč. Princip označevanja območja sicer razumem, vendar sem očitno "prekratek", da bi razumel kaj pomenita zapisa "ukaz kopiraj 1" in "ukaz kopiraj 13" oziroma kako ju uporabiti. Kode, če jo vnesem v modul, mi med makroji niti ne pokaže, drugače zagnati pa je ne znam. Njena preureditev z "Dim odVrstice as Integer" in "odVrstice=ActiveCell" pa mi tudi ni dala želenih rezultatov.

Prosil bi za pojasnilo, v čem je zanka, saj bi se rad naučil nekaj novega (in konec koncev uporabil prejeto pomoč).

Sem pa sicer poskusil izdelati drugačno kodo

Koda: Izberi vse

Sub Kopiraj1()
        
    ActiveWorkbook.Sheets(2).Activate
    Range(Cells(1, 1), Cells(5, 3)).Select
    Selection.Copy
        
    ActiveWorkbook.Sheets(1).Activate
    ActiveSheet.Cells(1, 1).PasteSpecial
    
End Sub
, ki mi kopira določeno območje, vendar pa je ne znam urediti tako, da bi se za kopiranje aktiviralo naslednje, enako veliko območje (konkretno iz A1:C5 v A6:C10) - verjetno bi moral dinamično opredeliti stolpec A (ala odVrstice). Prosil bi za usmeritev (pojasnilo oz. pomoč) tudi pri tem.

Hvala.

Drago
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: Kopiranje naslednjega obsega celic

Odgovor Napisal/-a admin »

Pozdravljeni,

Dobro bi bilo, da si izposodite kakšno knjigo o VAB programiranju (lahko tudi mojo :)) in si tam preberete osnove, saj morate poznati osnove preden lahko gradite. Torej...

Jaz sem vam napisal proceduro, ki sprejme parameter in ta prameter je prva vrstica območja. Ker procedura sprejme parameter, je ne boste videli v seznamu makrov, saj so tam samo procedure, ki ne sprejemajo parametrov.

V računalništvu namreč poznamo funkcije in procedure. Na hitro povedano je razlika med prvimi in drugimi v tem, da funkcije vrnejo nek rezultat (klasična funkcija je npr. sin(x), ki vrne sinus kota x), procedure pa samo nekaj naredijo, nekaj izvedejo in ne vrnejo rezultata.

Funkcije in procedure seveda v večini primerov sprejmejo parametre s pomočjo katerih potem nekaj naredijo. Funkcije in procedure, ki ne sprejmejo parametrov so v manjšini (jih je zelo malo) in tisto, kar vi poznate pod besedico 'makro' je procedura, ki ne sprejme parametrov. In tu je torej že začatek vašega problema, ne morete napisati makra, ki naj bi nekaj naredil od X-te vrstice dalje, če mu te X-te vrstice ne podate…

In ravno to sem vam napisal jaz. Proceduro, ki vam podatke kopira iz enega na drug list od neke vrstice dalje.

Takšno proceduro izvedete tako do jo zapišete v okno Immediate in pritisnete ENTER. To je to.

In tisto kar vi iščete je potem procedura, ki je v »kvazi programskem jeziku zapisana kot:

Koda: Izberi vse

TrenutnaVrstica = 1
Dokler nisi prišel do konca podatkov
	Kopiraj TrenutnaVrstica
	Obdelaj podatke
	TrenutnaVrstica = TrenutnaVrstica + 5
Ponavljaj
Seveda pa, da bi to razumeli in znali napisati potrebujete osnove programiranja in slednje dobite ali v knjigah (jih je veliko v slovenščini) ali na spletnih tečajih, ki pa so večinoma v angleščini.
lp,
Matjaž Prtenjak
Administrator
drglzr
Prispevkov: 31
Pridružen: Če Feb 21, 2013 10:06 pm

Re: Kopiranje naslednjega obsega celic

Odgovor Napisal/-a drglzr »

Precej pozen odziv. Pa vendar, hvala za pomoč. Potreboval sem prav princip, ki ste ga navedli.

Ker pa bo morda še kdo želel podobno in da ne iščem le pomoči, je spodaj moja rešitev. Verjamem, da je mogoče zadevo izpeljati tudi bolj "elegantno", vendar meni deluje. Ob upoštevanju zgoraj navedenega principa, sem za lažje delo najprej določil imeni delovnih listov (ws1 in ws2), nato pa ob začetni vrstici še zadnjo vrstico.

Še enkrat hvala.

Koda: Izberi vse

    Dim TrenutnaVrstica As Long: TrenutnaVrstica = 1
    Dim ZadnjaVrstica As Integer: ZadnjaVrstica = 20

ws2.Activate    
      While (TrenutnaVrstica <= ZadnjaVrstica)
        ws1.Range("at3:aw7").Value = ws2.Range(Cells(TrenutnaVrstica, 1), Cells(TrenutnaVrstica + 4, 4)).Value

' koda, ki naj se izvede pred "kopiranjem" naslednjega obsega celic (meni se izvaja v ws1)

ws2.Activate
   TrenutnaVrstica = TrenutnaVrstica + 5
      Wend
Odgovori