EXCEL: Kopírování listů v rámci sešitu (ve VBA)

Programy pro práci s textem, tabulkami, prezentacemi

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Mistr81 29. 5. 2009 12:28

Zdravím,

potřeboval bych (ve VBA) v rámci jednoho sešitu zkopírovat úplný obsah jednoho listu do druhého. Poradíte mi, prosím, kterak na to?

Děkuji.

Nějakým výpočtem totiž sestavím List3. Ten obsahuje nadpis a asi 800 řádků, které mají vždy v šesti sloupcích (A až F) číslo. Následně bych potřeboval obsah tohoto Listu3 přenést na List4 a tam hodnoty seřadit podle sloupce E, a to od nejvyššího po nejnižší.

Ale klidně je vše možné udělat na stisk jednoho tlačítka; jak to sestavení Listu3, tak překopírování a seřazení na Listu4.

Nebo vás napadá nějaké jiné řešení?
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 29. 5. 2009 16:06

Nize uvedena subrutina prekopiruje blok dat - hodnoty z listu na list a na cilovem listu setridi sestupne podle sloupce, blok ma zahlavi:
Kód: Vybrat vše
Option Explicit

Sub KopirovatCelyListHodnotySeradit()
  Dim SBlok As Range, TBlok As Range
  ' zdrojovy list
  Set SBlok = Worksheets("list1").UsedRange
  ' cilovy list
  Set TBlok = Worksheets("list2").Range(SBlok.Address)
  ' kopirovat blok - hodnoty
  TBlok.Value = SBlok.Value
  Worksheets("list2").Select
  ' setridit podle sloupce E:E sestupne, zahlavi bloku
  TBlok.Sort Key1:=Range("E2"), Order1:=xlDescending, Header:=xlGuess, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

List3 si tedy sestav "nejakym vypoctem" - treba ve VBA a zavolej vyse uvedenou subrutinu, ve ktere zmen nazvy listu.
obcasny_navstevnik
Junior

Odeslat příspěvekod Mistr81 1. 6. 2009 07:57

Díky za návrh.

Když jsem si jej zkopíroval, do svého Excelovského programu a upravil názvy listů:
  • List2 = list sestaven "nějakým výpočtem"
  • List4 = list, který bude řazen od největšího po nejnižší hodnotu


Při běhu programu ovšem nastala chyba. Zobrazilo se okno s hláškou:
Obrázek

a v programu se zažlutil níže zvýrazněný řádek:
Kód: Vybrat vše
Dim SBlok As Range, TBlok As Range
  ' zdrojovy list
  Set SBlok = List2.UsedRange
  ' cilovy list
  Set TBlok = List4.Range(SBlok.Address)
  ' kopirovat blok - hodnoty
  TBlok.Value = SBlok.Value
  List4.Select
  ' setridit podle sloupce E:E sestupne, zahlavi bloku
  TBlok.Sort Key1:=Range("E3"), Order1:=xlDescending, Header:=xlGuess, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

___
Tak on se zde v diskusi nezvýraznil. V kódu se zažlutil řádek
Kód: Vybrat vše
  TBlok.Sort Key1:=Range("E3"), Order1:=xlDescending, Header:=xlGuess, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

___

Může na to mít vliv skutečnost, že v řádcích 1 a 2 je hlavička, která právě ve sloupci E má sloučené buňky v prvním a druhém řádku v jeden celek?
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 1. 6. 2009 10:22

Pokud jsou v hlavicce slucovane bunky, je nutno upravit v kodu v inkriminiovanem radku jak adresu sloupce tak i zda je hlavicka.
Nejlepe si nahrej makro pri setridovani konkretni tabulky a podle spravneho vysledku uprav proceduru.
obcasny_navstevnik
Junior

Odeslat příspěvekod Mistr81 1. 6. 2009 13:26

obcasny_navstevnik píše:Nejlepe si nahrej makro pri setridovani konkretni tabulky a podle spravneho vysledku uprav proceduru.

Zní to rozumně. Tak jsem tak učinil. Data se seřadila podle mých představ.

Když jsem si pak kód zkopíroval z Makra do tlačítka CommandButton1 do procedury tlačítka Click:
Kód: Vybrat vše
    Sheets("List5").Select
    Range("A1:E1").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Sort Key1:=Range("E1"), Order1:=xlDescending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal


hází mi to chybovou hlášku:
Obrázek

Už nevím, co s tím. :-(

Je možné, že by pro třídu Range byl problematický její rozměr? Přeci jen je to 6 sloupečků a asi 800 řádků.
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 1. 6. 2009 14:28

Mel bys zacit sve programy ladit.
Vloz na prvni prikazovy radek Breapoint, spust tlacitkem proceduru a pak krokuj (F8), zobraz si LocalsWindow, sleduj co procedura vykonava na listu, zkoumej stav promennych, tam kde bude odchylka od ocekavaneho stavu, je chyba. A jsou i dalsi nastroje pro ladeni k dispozici.
Jeste nikdo nepsal program, aby v nem nebyla alespon jedna chyba. :-P
Pozn.: Potazenim mysi nahoru zlute sipky indikujici vykonavany radek se v procedure muzes vratit zpet.
obcasny_navstevnik
Junior

Odeslat příspěvekod Mistr81 1. 6. 2009 15:22

Koukal jsem, že problém je v tom, že já neumím nadefinovat, pokud mám spouštěcí tlačítko celého řadicího procesu třeba na Listu 4, původní data jsem měl přitom na Listu 1 a kopíroval jsem je na List 2, na němž pak také probíhalo to řazení.

Zkrátka, že já neumím (nebo nevím jak) nastavit do řadicí procedury skutečnost, že spouštěcí tlačítko je na jiném listě, než kde probíhá vlastní řazení.
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 1. 6. 2009 21:18

Neuvadis, na kterem radku kodu je chyba, ale Selection.Sort vyzaduje, aby byl list, na kterem se ma sortovat, aktivni. Takze v procedure CommandButton1_Click na listu 4 je nutno pred prikaz sortovani vlozit Worksheets("list2").Select, pokud se ma sortovat na listu2, kam byla data prenesena z listu1.
obcasny_navstevnik
Junior

Odeslat příspěvekod Mistr81 2. 6. 2009 08:47

obcasny_navstevnik píše:Neuvadis, na kterem radku kodu je chyba, ale Selection.Sort vyzaduje, aby byl list, na kterem se ma sortovat, aktivni. Takze v procedure CommandButton1_Click na listu 4 je nutno pred prikaz sortovani vlozit Worksheets("list2").Select, pokud se ma sortovat na listu2, kam byla data prenesena z listu1.


Aktivní ten list snad byl. Jen mne tam zaujala jiná věc, po jejíž úpravě to pak začalo fungovat.
Mám v Excelu List5, který je pojmenovaný třeba Ahoj. Pokud jsem zapsal
Kód: Vybrat vše
List5.Range("D3").Select

tak to neběhalo. Ale zapsal-li jsem
Kód: Vybrat vše
Worksheets("Ahoj").Range("D3").Select

už to běhalo.

Domníval jsem se, že je to jedno. Nebo v tom je nějaký rozdíl?
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 2. 6. 2009 10:49

Neni to jedno.
List3.Select - je vybran objekt List3("nejakynazev"), koukni v editoru VBA na pole Project - VBAProject

Worksheets("Ahoj").Select - je vybran list s nazvem "Ahoj" bez ohledu na jeho poradi v okne Excelu

Worksheets(1).Select - je vybral list, ktery je v okne Excelu v poradi prvni zleva (bez ohledu na jeho nazev nebo objekt)
obcasny_navstevnik
Junior

Odeslat příspěvekod Mistr81 2. 6. 2009 13:14

A samozřejmě, občasný_návštěvníku, mockrát Ti děkuji za rady a za pomoc! :tleskani Bez Tebe bych to určitě nezvládnul. :-) A to to sem nepíšu z nějakého vlezdoprdelismu. :-)
Nechval dne před večerem...
Mistr81
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků