RemoveRange OPGELOST

LeoDeWeerdt
Berichten: 41
Lid geworden op: wo jan 06, 2010 4:26 pm

RemoveRange OPGELOST

Bericht door LeoDeWeerdt »

Mijn bedoeling is een macrostukje te maken om, uit een bestaande Spreadsheet, een bepaald bereik ("B2:C6") te verwijderen.

Daarvoor heb ik, uit het document: "Basic Guide Ooo3.0.0.pdf", gevonden op de website, (http://wiki.services.openoffice.org/w/i ... o3.0.0.pdf
het volgende macrootje geplukt.

Code: Selecteer alles

Sub DeleteLines
Dim Doc As Object
Dim Sheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
Doc = ThisComponent
Sheet = Doc.Sheets(1)
CellRangeAddress.Sheet = 1
CellRangeAddress.StartColumn = 1
CellRangeAddress.StartRow = 1
CellRangeAddress.EndColumn = 2
CellRangeAddress.EndRow = 5
Sheet.removeRange(CellRangeAddress,com.sun.star.sheet.CellDeleteMode.UP)
end sub
Als ik dat macrootje laat lopen verwijdert het inderdaad een gebied zo groot als het gevraagde en ook in de juiste kolommen, maar wel onderaan de lijst in plaats van de gevraagde rijen (CellRangeAddress.StartRow = 1 en CellRangeAddress.EndRow = 5) het aantal verwijderde rijen is wel juist.

Daar ben ik nu 4 dagen mee bezig en heb vastgesteld dat mijn huidige kennis over macro's maken in (Linux-Ooo) nog zeer beperkt is. Maar de aanhouder hoopt te kunnen winnen met een extra ruggenstootje
Dank bij voorbaat
Laatst gewijzigd door floris v op ma jun 21, 2010 8:34 pm, 3 keer totaal gewijzigd.
Reden: vinkje toegevoegd
Leo
Het is voor mij een grote troost dat er geen domme vragen zijn.
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: RemoveRange

Bericht door RPG »

Hallo

Is het werken met een opgenomen macro in dit geval niet het gemakkelijkste?

Hier staat een hele lijst met mogelijkheden om opgenomen macro's iets te kunnen aanpassen.

Code: Selecteer alles

sub Main2
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$2:$C$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())
end sub
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
LeoDeWeerdt
Berichten: 41
Lid geworden op: wo jan 06, 2010 4:26 pm

Re: RemoveRange

Bericht door LeoDeWeerdt »

RGP, Dank voor de snelle reactie.
Voor het ogenblik heb ik een opgenomen macro in de totale makro gezet. Het nadeel daarvan is dat, gedurende de loop van het het opgenomen deel van het totale programma alle veranderingen op het scherm voorbij flitsen en daardoor het verloop van het totale pakket veel langer duurt.
Ik weet dat dat flikkeren onder excel (MS) kan onderdrukt worden door, in het begin en op het einde van de macro, een lijn -welke ben ik vergeten (False/True)- toe te voegen. Bestaat er bij uw weten in Ooo ook zoiets?
Leo
Het is voor mij een grote troost dat er geen domme vragen zijn.
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: RemoveRange

Bericht door RPG »

Hallo

Ik denk dat er een oplossing is voor het geflikker maar ik ben er niet zeker van. Ook is er misschine een snellere oplossing.
Beiden kun je hier vinden.

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
LeoDeWeerdt
Berichten: 41
Lid geworden op: wo jan 06, 2010 4:26 pm

Re: RemoveRange

Bericht door LeoDeWeerdt »

De door U opgegeven verwijzing bevat wel een macro voor het wissen van de informatie in de cellen maar niet het verwijderen van de cellen.
(Sub wisdeel...oDoc.lockcontrollers.....routine.......oDoc.unlockControllers..end Sub) onderdrukt het flikkeren van de cellen maar niet van de lijnnummering.
Mag ik er U ook op wijzen dat, op de site "http://wiki.services.openoffice.org/wik ... move_cells", de vermelde Macro (RemoveCells) voor het verwijderen van de cellen bij mij niet werkt .
"Sub RemoveCells
"Dim oRange As New com.sun.star.table.CellRangeAddress
"Dim oSheet
"' first sheet and B2:C3 range
"oRange.Sheet = 0
"oRange.StartColumn = 1
"oRange.StartRow = 1
"oRange.EndColumn = 2
"oRange.EndRow = 2
"oSheet.removeCells( oRange, com.sun.star.sheet.CellRemoveMode.UP )
"End Sub
En de foutmelding bij de voorlaatste lijn: "BASIC runtime error Property or method not found"
Leo
Het is voor mij een grote troost dat er geen domme vragen zijn.
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: RemoveRange

Bericht door RPG »

Hallo

Ik begrijp de reactie onvoldoende.
(Sub wisdeel...oDoc.lockcontrollers.....routine.......oDoc.unlockControllers..end Sub) onderdrukt het flikkeren van de cellen maar niet van de lijnnummering.
Wat betekent dit?


Mijn kennis van macros voor een spreadsheet gering.
Ik denk dat je deze vraag beter op een Engels forum kunt stellen. Hier zijn niet zoveel macro schrijvers. Ik schrijf wel macros maar niet voor spreadsheets.

Maak ook een betere omschrijving van je probleem want je omschrijft het in het begin als een klein iets en ik krijg de indruk dat je met een veel groter probleem bezig bent.

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
LeoDeWeerdt
Berichten: 41
Lid geworden op: wo jan 06, 2010 4:26 pm

Re: RemoveRange

Bericht door LeoDeWeerdt »

RPG Eerst en vooal dank voor uw reacties.
RPG schreef:Hallo
Ik begrijp de reactie onvoldoende.
(Sub wisdeel...oDoc.lockcontrollers.....routine.......oDoc.unlockControllers..end Sub) onderdrukt het flikkeren van de cellen maar niet van de lijnnummering.
Wat betekent dit?
Romke
Hiervoor verwijs ik naar uw email hieronder
RPG schreef:Hallo
Ik denk dat er een oplossing is voor het geflikker maar ik ben er niet zeker van. Ook is er misschine een snellere oplossing.
Beiden kun je hier vinden.
Romke
Wat nu mijn probleem betreft? dat is, wel met een omweg, opgelost op de manier zoals in de macro hieronder.

Code: Selecteer alles

Sub InsertDelete
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
	CellRangeAddress.Sheet = 0
	CellRangeAddress.StartColumn = 1
	CellRangeAddress.StartRow = 5 
	CellRangeAddress.EndColumn = 3
	CellRangeAddress.EndRow = 5
	oSheet.insertCells(CellRangeAddress,com.sun.star.sheet.CellInsertMode.DOWN)

	CellRangeAddress.StartColumn = 1
	CellRangeAddress.StartRow = 2
	CellRangeAddress.EndColumn = 3
	CellRangeAddress.EndRow = 5
	oSheet.removeRange(CellRangeAddress,com.sun.star.sheet.CellDeleteMode.UP)
End sub
ttz, Een lijn toevoegen NA het te verwijderen bereik (B3:D5) en dan het te verwijderen bereik (B3:D5) MET de toegevoegde lijn verwijderen.
Is niet de ideale oplossing maar het werkt zonder dat het betreffende blad op de scherm verschijnt. Wel moet, om het resultaat te zien het betreffende blad geactiveerd worden.
Laatst gewijzigd door floris v op ma jun 14, 2010 9:33 pm, 1 keer totaal gewijzigd.
Reden: code-tags toegevoegd
Leo
Het is voor mij een grote troost dat er geen domme vragen zijn.
LeoDeWeerdt
Berichten: 41
Lid geworden op: wo jan 06, 2010 4:26 pm

Re: RemoveRange

Bericht door LeoDeWeerdt »

Na verder onderzoek, en een kleine aanpassing aan de macro vermeld in mijn eerste vraag, ben ik erin geslaagd het gewenste bereik uit mijn rekenblad te verwijderen zonder toevoeging van een tussenlijn.
Het resultaat staat hier onder. Het bereik ("B2:C3") wordt verwijderd (Deleted)

Code: Selecteer alles

Sub RemoveCells
Dim oSheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
	oSheet = ThisComponent.Sheets(0)
	CellRangeAddress.Sheet = 0
	CellRangeAddress.StartColumn = 1 
	CellRangeAddress.StartRow = 1
	CellRangeAddress.EndColumn = 2
	CellRangeAddress.EndRow = 2
	oSheet.removeRange(CellRangeAddress,com.sun.star.sheet.CellDeleteMode.UP)    
End Sub
Daarmee kan, wat mij betreft deze topic afgesloten worden.
Leo
Het is voor mij een grote troost dat er geen domme vragen zijn.
Plaats reactie