< návrat zpět

MS Excel


Téma: LastCell rss

Zaslal/a 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

Zaslat odpověď >

#009872
avatar
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
#009874
avatar
@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 sloupcicitovat
#009886
avatar
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
#009887
avatar
V prílohe sú oba spôsoby.
Výsledok je rovnaký. Neviem v akých prípadoch by to nemalo fungovať.
Příloha: zip9887_posledna.zip (8kB, staženo 25x)
citovat
#009888
avatar
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
#009889
avatar
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: zip9889_posledna2.zip (9kB, staženo 25x)
citovat
#009908
avatar
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
#009910
avatar
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

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje