Mockrát děkuji, vše postupně testuji. To zobrazování řádků je bleskové SUPER
Teď jsem se zasekl na mazání. Předem nevím kde danná karta bude a tak jsem si řekl že dám na tvrdo jméno té karty ale to nějak nejde.
iSheet=Sheets.getByName("FAKTURA") 'číslo listu ve kterém skrývám
Říkám si zda by bylo možné toto: Smazat řádky bez ohledu na to kde daná karta je (buď podle jména nebo aktivní list) a jako bonus by bylo pokud by se před nebo po zpracování přesunula karta na pozici "0" prostě na začátek (je to z důvodu že to pak inportuje účetní program a ten umí číst z excelu pouze první list)
_
Sub NOVE_mazani 'pomocí com.sun.star.Sheet.SheetCellRanges + UNO pro skrýt označené řádky
dim oDoc as object, oSheet as object, oRange as object, oRanges as object, oRangeAddress as new com.sun.star.table.CellRangeAddress, oEnum as object, o as object, data(), i&, iSloupec&, i1&, i2&, iSheet%, aSkryt as variant, oWindow as object
dim oDlg as object, oPrubeh as object, oButton as object, iPrubeh&, bCancel as boolean 'pro ukazatel průběhu
const iStep=30 : iPrubeh=0 'pro ukazatel průběhu
oDoc=ThisComponent
oWindow=oDoc.CurrentController.Frame.ComponentWindow
' oWindow.Visible=false 'tohle kdyžtak skryje vnitřek okna Calcu
iSheet=Sheets.getByName("FAKTURA") 'číslo listu ve kterém skrývám
iSloupec=3 'sloupec dle kterého budu skrývat (A=0, B=1 atd.)
i1=1 : i2=3100 'testované řádky (první řádek=0, druhý=1 atd.)
aSkryt=0 'hodnota pro kterou skrývám řádek (v případě řetězců třeba "0")
oSheet=oDoc.Sheets(iSheet)
oRanges=oDoc.createInstance("com.sun.star.sheet.SheetCellRanges") 'rozsahy vybraných buněk
with oRangeAddress 'sloupce přidávaného rozsahu
.Sheet=iSheet
.StartColumn=iSloupec
.EndColumn=iSloupec
end with
rem ukazatel průběhu
oDlg=progressBarInit(0, i2-i1, oDoc)
oDlg.title="Mažu nulové :-)"
oPrubeh=oDlg.getControl("Pprogress")
oButton=oDlg.getControl("Pbutton")
oRange=oSheet.getCellRangeByPosition(iSloupec, i1, iSloupec, i2) 'data ze sloupce dle kterého skrývám řádky
data=oRange.getDataArray
dim iZac&, iKon&, a as variant, b as boolean
iZac=i1 : iKon=0 : b=false
rem hlavní smyčka
for i=lbound(data) to ubound(data)
rem ukazatel průběhu
iPrubeh=iPrubeh+1
if iPrubeh=iStep then 'vykreslovat až po nějakém počtu kroků
oPrubeh.value=i
iPrubeh=0 'reset aktuálního počtu kroků
end if
if oButton.Model.state=1 then 'stisknuto Cancel v ukazateli průběhu
bCancel=true
exit for
end if
rem porovnávání hodnot a přidávání do oRanges
a=data(i)(0) 'aktuální hodnota ze sloupce -- v ukázce jde o číslo; v případě řetězců třeba a=CStr(data(i)(0))
if a=aSkryt then 'hodnota je skrývaná
if iKon=0 then iZac=i+i1 'nemám žádný počet řádků tedy jde o první řádek rozsahu tak pamatuji číslo řádku
iKon=iKon+1 'zvětšuji počet řádků které budu přidávat do rozsahu
b=true 'až narazí na neskrývaný řádek tak přidá rozsah
elseif b=true then 'řádek nemá hodnotu při které se skrývá
with oRangeAddress 'řádky přidávaného rozsahu
.StartRow=iZac
.EndRow=iZac+iKon-1
end with
oRanges.AddRangeAddress(oRangeAddress,true) 'přidat rozsah
iKon=0
b=false
else 'šlo o neskrývaný řádek takže začátek přidávaného rozsahu bude minimálně na dalším řádku
iZac=iZac+1
end if
next i
rem pro ukazatel průběhu
if bCancel=true then 'stisknuto Cancel v ukazateli průběhu
msgbox("Přerušeno")
goto konec
end if
if iKon>0 then 'poslední řádky ještě mají být skryty
with oRangeAddress 'řádky přidávaného rozsahu
.StartRow=iZac
.EndRow=iZac+iKon-1
end with
oRanges.AddRangeAddress(oRangeAddress,true) 'přidat rozsah
end if
rem skrýt rozsahy přes UNO - rychlé
oDoc.CurrentController.Select(oRanges) 'označit rozsahy
dim document as object, dispatcher as object
document=oDoc.CurrentController.Frame
dispatcher=createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, array()) 'UNO pro skrytí označených řádků
konec:
' oWindow.Visible=true 'zobrazit skrytý vnitřek okna Calcu
oDlg.dispose() 'deaktivovat ukazatel průběhu
End Sub
rem UKAZATEL PRŮBĚHU - zobrazuje se ve středu okna Libre
Function progressBarInit(min&, max&, optional oDoc as object) as object 'vrátí objekt dialogového okna; při chybějícím oDoc ho přichytí k Desktopu
on local error goto chyba
dim oDlg as object, oDlgModel as object, oButtonModel as object, oProgress as object, oWindow as Object
dim oSize as object, oSiz as new com.sun.star.awt.Size, koef as double
const iDlgWidth=140, iDlgHeight=45 'bacha, nejde o pixely jako kdyby se vytvářelo dialogové okno v Basic editoru a pak volalo; dále je pro vystředění okna použita metoda convertSizeToPixel a nastavena proměnná koef
rem model dialogového okna
oDlgModel=CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
with oDlgModel
.Width=iDlgWidth
.Height=iDlgHeight
end with
rem ukazatel průběhu
oProgress=oDlgModel.createInstance("com.sun.star.awt.UnoControlProgressBarModel") 'objekt ukazatele průběhu
with oProgress
.Name="Pprogress" 'jméno pro makro
.ProgressValueMin=min 'minimum
.ProgressValueMax=max 'maximum
.ProgressValue=0 'aktuální hodnota
.Width=120
.Height=15
.positionX=10
.positionY=5
.Border=3 'rámeček
end with
oDlgModel.insertByName("Pprogress", oProgress) 'přidat do modelu
rem tlačítko Zrušit
oButtonModel=oDlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
with oButtonModel
.Name="Pbutton"
.Width=40
.Height=15
.PositionX=50
.PositionY=25
.Label="Zrušit"
.PushButtonType=com.sun.star.awt.PushButtonType.STANDARD
.TabIndex=0
.Toggle=true 'aktivace detekce vlastnosti State tlačítka
end with
oDlgModel.insertByName("Pbutton", oButtonModel)
rem vykreslení dialogového okna
oDlg=CreateUnoService("com.sun.star.awt.UnoControlDialog") 'dialog
oDlg.visible=false 'skrýt dialog ať neproblikává
oDlg.setModel(oDlgModel) 'nastavit model dialogovému oknu
rem přidat dialogové okno k oknu dokumentu nebo Desktopu
oWindow=CreateUnoService("com.sun.star.awt.Toolkit") 'dialogové okno
if isMissing(oDoc) then 'přidat k Desktopu - pozor, systém může po chvíli vypsat že program neodpovídá
oDlg.createPeer(oWindow,null)
else 'přidat okno k oDoc
dim oToolkit as object
oToolkit=oDoc.currentController.frame.containerWindow
oDlg.createPeer(oWindow,oToolkit) 'spojení
end if
rem propočty na vystředění dialogového okna
with oSiz 'rozměr z kterého budu přepočítávat koeficient pro usazení dialogového okna průběhu doprostřed
.Width=iDlgWidth
.Height=iDlgHeight
end with
koef=iDlgWidth / oDlg.convertSizeToPixel(oSiz, com.sun.star.util.MeasureUnit.APPFONT).Width 'koeficient pro korekci dialogového okna
oSize=oDoc.CurrentController.Frame.ContainerWindow.GetPosSize 'rozměry okna Calcu
with oDlgModel
.positionX=fix(koef*(oSize.Width-iDlgWidth/koef)/2) 'pozice X od levého horního rohu okna; šířku dialogu je třeba brát zvětšenou koef, pozici X pak zmenšenou koef
.positionY=fix(koef*(oSize.Height-iDlgHeight/koef)/2) 'pozice Y od levého horního rohu okna
end with
oDlg.visible=true 'zobrazit dialog
progressBarInit=oDlg
exit function
chyba:
msgbox("Error " & Err & ": " & Error$ + chr(13) + "Line: " + Erl , 16 ,"progressBarInit")
End Function