< návrat zpět

MS Excel


Téma: SpecialCells and UsedRange rss

Zaslal/a 14.12.2013 10:37

OpičákPři použití SpecialCells (zde zvýraznění obsahu buňky)jsem narazil na zvláštní vlastnost, resp. pro mě záhadu. K vysvětlení jsem přiložil soubor. Jde o to, když použiju orámování oblasti tenkou, střední nebo silnou čarou (tlačítka) a poté chci označit prázdné buňky použité oblasti (černý tl.), chová se UsedRange pro každé orámování jinak.
U tenké čáry se chová tak, jako by orámování nebylo, ale při použití střední nebo silné "nafukuje" tuto oblast o horní, resp. i spodní řádek.
Proč ???

Příloha: zip16796_special-cells.zip (41kB, staženo 29x)
Zaslat odpověď >

icon #016805
eLCHa
Asi jste na to přišel sám, ale xlThick rozšiřuje UsedRange nahoru a dolů. Dle mého názoru je to chybné chování, protože pokud by bylo chtěné (netuším proč by mělo být), tak by se oblast musela rozšiřovat i doleva a doprava.

Nicméně je pravda, že použití Cells a UsedRange (a ještě k tomu vaše oblíbené Select), tak jak jej v tom kódu požíváte se nedá označit jinak, než jako prasárna ;)

Cells - tady v žádném případě, v tu chvíli zbytečně pracujete se 17mld buněk, když vlastně chcete pracovat jen s 10!

UsedRange - používat jedině ve výjimečných případech, tady přesně vidíte proč. V tomto kódu by se dalo pouvažovat o nahrazení za Cells, protože chcete vymazat formátování v celém listu, na to UsedRange postačí.
Pokud vím s jakou oblastí pracuji, tak použiji přece ji a ne UsedRange.

Select - no fuj!!!citovat
#016827
Opičák
Já to tušil, že z Select a Selection nebudete dvakrát nadšený (škoda, že ikony neobsaahují palce nahoru, určitě bych nějaký dostal) 3 3 , přesto jsem na vaši odpověď čekal, to se přiznám a děkuji za ní. A říkal jsem si, jestli někdo bude reagovat, pak to bude eLCHa, bo se mu to bude líbit. 3 3 Ale o to jestli je to hnus či ne nešlo, nešlo ani o to že mohu pracovat jen s určitou oblastí. Tu bych mohl ostatně makrem definovat, ale šlo mi o to, zda skutečně jen spojení UsedRange a ohraničení dělá tuto zmíněnou neplechu a jestli se s tím již někdo setkal a proč to je. Zjistil jsem to náhodou, když jsem použil orámování, moje oblíbené,(ale až po Select 9 6 ) a najednou to dělalo něco jiného. A ani jsem to k ničemu nepotřeboval, jen jsem zkoušel SpecialCells a co to může a nemůže. V podstatě jsem došel ke stejnému závěru a to i s tím, že pokud by to měl být úmysl, muselo by se to projevit i do stran, ale proč?citovat
icon #016829
eLCHa
Bo bug ;)

Přiznám se, že jsem vyhledával jen trochu, protože věřím, že jste hledal a nenašel. A to, že jsme nic nenašli naznačuje, že jste buď první, kdo to objevil, ale pravděpodobněji to nikdo neřešil.

Začátečník na to nenarazí, protože ještě nepoužívá UsedRange a když už, tak pravděpodobně ne ve spojení s xlThick.
Pokročilý na to nenarazí, protože nepoužívá UsedRange a když už, tak určitě ne ve spojení s xlThick.
Pochopil jsem, že jen zkoušíte. Ale je to o návycích - proto vám vytýkám ten Select, protože už byste ho neměl použít ani tenkrát, když si jen něco zkoušíte ;)
Pak byste totiž nejdříve udělal:
Dim r as range
Set r = ActiveSheet.UsedRange
'kód
r.SpecialCells...
protože víte, že UsedRange se během kódu může změnit (nejen z tohoto důvodu) a proto si ho nejdříve uložíte ;)
A pak byste na to nenarazil ;)))citovat
#016836
Opičák
Tak už jen pro doplnění.
Problém je asi známý, leč vysvětlení se mi nedostalo.
Nalezení posledního řádku oblasti tímto zůsobem
Set r = ActiveSheet.UsedRange
Cells(5, 3) = r.SpecialCells(xlCellTypeLastCell).Row

vypočítá chybu (je-li tam xlThick)
Ron de Bruin to řeší následovně:
Function LastRow(sh As Worksheet)
On Error Resume Next
LastRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
End Function


takže děkuji za vysvětlení nějakých mých (častých) chyb a s konstatováním že jsem objevil ameriku si připadám jako J. Cimrman. 9 9 9citovat
icon #016844
eLCHa
Vysvětlení se vám dostane možná dotazem přímo na MS, tady asi opravdu ne - my bychom jen spekulovali. Pokud vám teda nestačí to moje "Bo bug", protože to si opravdu myslím ;)))
Já chci ale ještě reagovat na tu fci, kterou jste tady dal. Nic proti ní, ta funguje, ale mícháte tady jablka a hrušky dohromady ;)

Ta fce vám najde poslední řádek, který má vyplněnou nějakou buňku.
UsedRange naproti tomu může zasahovat ještě mnohem dále.
Lehce nasimulujete takto
Do C3 vložte jakoukoliv hodnotu.
Do C15 vložte jakékoliv formátování - třeba spodní ohraničení.
Fce vrátí 3
Usedrange má poslední řádek 15 (pokud jste tam dal xlThick tak asi 16 ;) )citovat
icon #016845
eLCHa
A ta funkce má jednu vlastnost, která se mi nelíbí
A to, že mění Dialog Find
Ten by se měl minimálně resetovat do defaultního nastavení
Např.:Cells.Find What:=vbNullString, _
After:=ActiveCell, _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False


Pokud byste chtěl použít SpecialCells ke zjištění posledního vyplněného řádku, tak to samozřejmě lze
Ten kód bude delší, ale nic nemění
Function fncLastRow(ByRef sh As Worksheet, Optional ByVal sPassword As String = vbNullString) As Long
'by eLCHa, eLCHa@email.cz

Dim bProtection As Boolean
bProtection = sh.ProtectContents
sh.Unprotect sPassword

Dim rDataOnSheet As Range
On Error Resume Next
Set rDataOnSheet = sh.UsedRange.SpecialCells(xlCellTypeConstants)
If rDataOnSheet Is Nothing Then
Set rDataOnSheet = sh.UsedRange.SpecialCells(xlCellTypeFormulas)
Else
Set rDataOnSheet = Union(rDataOnSheet, sh.UsedRange.SpecialCells(xlCellTypeFormulas))
End If
On Error GoTo 0
fncLastRow = rDataOnSheet.SpecialCells(xlCellTypeLastCell).Row

If bProtection Then
sh.Protect sPassword
End If

Set rDataOnSheet = Nothing
End Function
citovat
#016848
Opičák
Děkuji za vyčerpávající odpověď.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