< návrat zpět
MS Excel
Téma: LastCell
Zaslal/a kp57 14.10.2012 22:37
Protože s Cells.SpecialCells(xlCellTypeLastCell) jsou opravdu problémy napsal jsem si vlastní funkci.
Problém je, že zatím nebere v potaz formáty.
Ale i to by šlo dodělat. Tak zatím takto.
Sub AdresaPosledniBunky()
Dim celLast As Range, sh As Byte
For sh = 1 To ThisWorkbook.Sheets.Count
With Sheets(sh)
Set celLast = .Cells(PosledniRadek(Sheets(sh)), PosledniSloupec(Sheets(sh)))
If celLast.Address = Cells(1).Address And IsEmpty(.Cells(1)) Then
MsgBox "list je prazdny", , "List" & sh
Else
MsgBox "posledni bunka = " & celLast.Address, , "List" & sh
End If
End With
Next sh
Set celLast = Nothing
End Sub
Function PosledniRadek(ws As Worksheet) As Long
Dim aktOblast As Range, arLast As Long
On Error Resume Next
With ws
arLast = .Cells.RowDifferences(.Cells(1)).Areas.Count
If Err = 0 Then
Set aktOblast = .Cells.RowDifferences(.Cells(1)).Areas(arLast)
PosledniRadek = aktOblast.Row + aktOblast.Rows.Count - 1
Set aktOblast = Nothing
Else
Err.Clear
PosledniRadek = .Cells(.Columns(1).Rows.Count, 1).End(xlUp).Row
End If
End With
On Error GoTo 0
End Function
Function PosledniSloupec(ws As Worksheet) As Long
Dim aktOblast As Range, arLast As Long
On Error Resume Next
With ws
arLast = .Cells.ColumnDifferences(.Cells(1)).Areas.Count
If Err = 0 Then
Set aktOblast = .Cells.ColumnDifferences(.Cells(1)).Areas(arLast)
PosledniSloupec = aktOblast.Column + aktOblast.Columns.Count - 1
Set aktOblast = Nothing
Else
Err.Clear
PosledniSloupec = .Cells(1, .Rows(1).Columns.Count).End(xlToLeft).Column
End If
End With
On Error GoTo 0
End Function
marjankaj(15.10.2012 0:43)#009872 Sub KopirujList()
Set rng = ActiveSheet.UsedRange
Set rng2 = Worksheets("vysledok").UsedRange
riadok = rng2.Cells(1, 1).Row + rng2.Rows.Count - 1
rng.Copy Worksheets("vysledok").Cells(rng.Row + riadok, rng.Column)
End Sub
Toto skopíruje aj formáty. Netestujem prázdny list, skopíruje sa prázdny riadok.
Do cyklu si to už hodíš sám
Asi som to nemal písať sem, ale riadok je posledný použitý riadok. Podobne sa určí aj stlpec.
citovat
Milan-D(15.10.2012 9:41)#009874 @kp57:
Parada, toto opravdu vraci skutecnou posledni bunku. Jeste kdyby to umelo resetovat tu puvodni nesmyslne obrovskou oblast, kterou vraci .UsedRange anebo .Cells.SpecialCells(xlCellTypeLastCell).
@marjankaj: jak uz jsem naznacil, nestava se to bezne, ale obcas k tomu dochazi, totiz ze posledni bunka je uplne jinde (niz) nez by mela byt. Proto radeji pouzivam delsi, ale o to odolnejsi kod, tedy skok odspodu v nejakem sloupci
citovat
kp57(15.10.2012 22:47)#009886 Tak ta fce pro sloupec je špatná.
Je to třeba zpracovat bohužel cyklem.
Sub PosledniPlna()
Dim rdlast As Long, slLast As Long
rdlast = Cells.SpecialCells(xlCellTypeLastCell).Row
slLast = Cells.SpecialCells(xlCellTypeLastCell).Column
Do While WorksheetFunction.CountBlank(Range(Cells(1, slLast), Cells(rdlast, slLast))) = rdlast
slLast = slLast - 1
Loop
Do While WorksheetFunction.CountBlank(Range(Cells(rdlast, 1), Cells(rdlast, slLast))) = slLast
rdlast = rdlast - 1
Loop
MsgBox Cells(rdlast, slLast).Address, , "PosledniPlna"
End Sub
Vymazat tu vatu by šlo v tom cyklu (včetně formátů!), ale EXCEL je nevyzpytatelný. Pokud to nejde přes CLEAR, je nutno List-Sešit kopnout do nového. Dělám to celkem pravidelně.
citovat
marjankaj(15.10.2012 23:32)#009887 V prílohe sú oba spôsoby.
Výsledok je rovnaký. Neviem v akých prípadoch by to nemalo fungovať.
Příloha: 9887_posledna.zip (8kB, staženo 25x) citovat
kp57(15.10.2012 23:46)#009888 Zrovna jsem se na to díval.
Ani SpecialCells(xlCellTypeLastCell) není dobrý, protože bere v potaz jen viditelné buňky.
Máš pravdu s ActiveSheet.UsedRange, ale zkus si na řádku 1000 změnit výšku řádku. Zas je to v prd.
Takže asi kombi.
Sub AdresaPosledniBunky()
MsgBox PosledniPlna(ActiveSheet).Address(, , xlR1C1), , "PosledniPlna"
End Sub
Function PosledniPlna(ws As Worksheet) As Range
Dim uRng As Range, rdLast As Long, slLast As Long
Set PosledniPlna = ActiveSheet.UsedRange
rdLast = PosledniPlna.Row + PosledniPlna.Rows.Count
slLast = PosledniPlna.Column + PosledniPlna.Columns.Count
Do While WorksheetFunction.CountBlank(Range(Cells(1, slLast), Cells(rdLast, slLast))) = rdLast
slLast = slLast - 1
Loop
Do While WorksheetFunction.CountBlank(Range(Cells(rdLast, 1), Cells(rdLast, slLast))) = slLast
rdLast = rdLast - 1
Loop
Set PosledniPlna = Cells(rdLast, slLast)
End Function
citovat
marjankaj(16.10.2012 1:06)#009889 No zrejme záleží, čo si predstavujeme pod pojmom "posledná bunka".
V prílohe je tá žltá bunka ako posledná. Ale v tvojom prípade nie.
Možno aj výška riadku je "posledná použitá bunka". Ale pri zmene šírky stlpca to nefunguje rovnako.
Máš pravdu, je tu trochu nezrovnalosť medzi formátovaním bunky, formátovaním riadkov a formátovaním stlpcov.
Asi bude záležať, čo chceme vlastne dosiahnuť.
Příloha: 9889_posledna2.zip (9kB, staženo 25x) citovat
kp57(16.10.2012 19:46)#009908 V tom máš pravdu. Ale asi všichni známe situace, kdy po úpravách v listu odmažeme vatu a CTRL+END stejně odletí do tramtárie. Pokud v makrech nechceme kopírovat tuto vatu je asi třeba si tu oblast osahat. Pokud je list bez této zaseknuté vaty a chová se jak očekáváme, pak opravdu stačí UsedRange.
citovat
marjankaj(16.10.2012 20:15)#009910 Urobil som pokus. Vyfarbil som jednu bunku "bez výplne". Nič sa vizuálne nezmenilo, ale bola označená ako posledná použitá. Teda ako keby som ju vyfarbil nejakou farbou. Zrušiť sa to dalo vymazať format. Alebo vymazať všetko. Teda v tej bunke.
Pre tvorcov excelu je teda jedno, či sa označí bunka farbou, alebo "bez výplne". Je to vec konvencie.
citovat