problema con do loop annidati

Creare una macro - Scrivere uno script - Usare le API
Rispondi
squob
Messaggi: 16
Iscritto il: venerdì 20 aprile 2012, 10:29

problema con do loop annidati

Messaggio da squob »

Salve a tutti, sono nuovo del forum e non sono un programmatore ne un grande conoscitore del basic :D
Mi sto cimentando nella creazione di un foglio di calcolo che mi consenta di gestire i miei clienti ed i servizi che per essi svolgo.
In parole povere ho bisogno di copiare dei dati da un foglio all'altro sistemandoli in celle differenti in modo da ottenere una pagina stampabile.
Per fare ciò sto tentando di creare una macro che, partendo dalla cella attiva, legga i dati dal foglio sorgente e li trasferisca sul foglio di stampa.
Non ho avuto problemi fino a quando mi sono cimentato con il comando "do loop"

Devo leggere una tabella composta da n righe e un numero definito di colonne ed ho pensato di sfruttare "do loop" per far leggere le righe della prima colonna fin quando contengono dati, quindi passare alla colonna successiva e ripetere il ciclo per le righe e così via.
Il problema è che lo script termina il primo ciclo, torna alla prima riga, si sposta di una colonna ma non riparte anche se questa contiene testo.

Vi posto lo script così forse è più chiaro.

Ps: Siate clementi, il codice l'ho scopiazzato un po' qua e un po' la e di certo non si può definire "pulito" .... più che altro "arrangiato" :D

Dim Doc As Object
Dim Sheet As Object
Dim RapportoDiProva As Object
Dim Colonna as Integer
Dim Riga as Integer
Dim RigaRP as Integer
DIM ColonnaRP as integer
Dim n as integer

Doc = StarDesktop.CurrentComponent
Sheet = ThisComponent.CurrentController.ActiveSheet
ActiveCell = ThisComponent.CurrentSelection
Colonna = ActiveCell.CellAddress.Column
Riga = ActiveCell.CellAddress.Row
n = 0 'contatore di cicli
Colonna = Colonna + 1
RigaRP = 22
ColonnaRP = 0

Do


Do While ActiveCell.string <> ""

ActiveCell = Sheet.getCellByPosition(Colonna,Riga)
valore= ActiveCell.string
RapportoDiProva = doc.Sheets(100)
ActiveCell = RapportoDiProva.GetCellByPosition(ColonnaRP,RigaRP)
ActiveCell.String = valore
Riga = Riga + 1
RigaRP = RigaRP + 1
n = n+1

Loop

RigaRP = RigaRP-n
Riga = Riga-n
Colonna = Colonna + 1
ColonnaRP = ColonnaRP+1

Loop Until ActiveCell.string = ""


Scusate la lunghezza.... non sono capace ad inserire il codice in finestre come fate voi :(

Edit: mancava una parte di codice e l'ho aggiunta. Questo postato è una parte di tutta la macro.
Libreoffice 7.3 su Kubuntu 20.04
c.spaziani
Messaggi: 21
Iscritto il: lunedì 16 gennaio 2012, 12:48

Re: problema con do loop annidati

Messaggio da c.spaziani »

Io eviterei i cicli individuando le dimensioni dei range da copiare in questo modo:

Codice: Seleziona tutto

Sub CopyValues
	oSheet = ThisComponent.Sheets.getByName("Foglio1")
	oCellCursor = oSheet.createCursor()
	oCellCursor.gotoEndOfUsedArea(False)
	nEndColumn = oCellCursor.getRangeAddress().endColumn
	nEndRow = oCellCursor.getRangeAddress().endRow
	oCopyRange = oSheet.getCellRangeByPosition(0, 0, nEndColumn, nEndRow)
	oSheet = ThisComponent.Sheets.getByName("Foglio2")
	oCellCursor = oSheet.createCursor()
	oCellCursor.gotoEndOfUsedArea(False)
	nPasteEndRow = oCellCursor.getRangeAddress().endRow + 1
	oPasteRange = oSheet.getCellRangeByPosition(0, nPasteEndRow, nEndColumn, nPasteEndRow + nEndRow)
	oPasteRange.DataArray = oCopyRange.DataArray
End Sub
In questo esempio tutti i dati di Foglio1 vengono copiati accodandoli in Foglio2.
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
squob
Messaggi: 16
Iscritto il: venerdì 20 aprile 2012, 10:29

Re: problema con do loop annidati

Messaggio da squob »

Ti ringrazio ma ho provato ad usarlo e mi da un messaggio di errore sull'ultima riga. "errore di runtime basic, si è verificata un'eccezione type:com.sun.star.uno.Runtime.Exception

Comunque, per curiosità, perchè eviteresti i cicli? Sono di solito molto curioso :D E poi, cosa ho sbagliato nel mio codice?
Libreoffice 7.3 su Kubuntu 20.04
c.spaziani
Messaggi: 21
Iscritto il: lunedì 16 gennaio 2012, 12:48

Re: problema con do loop annidati

Messaggio da c.spaziani »

squob ha scritto:Ti ringrazio ma ho provato ad usarlo e mi da un messaggio di errore sull'ultima riga. "errore di runtime basic, si è verificata un'eccezione type:com.sun.star.uno.Runtime.Exception
Nel mio esempio davo x scontato che ci fosse un foglio vuoto aperto! Riprova ad eseguire la macro aprendo prima un nuovo foglio di calcolo...
squob ha scritto:Comunque, per curiosità, perchè eviteresti i cicli? Sono di solito molto curioso :D E poi, cosa ho sbagliato nel mio codice?
Beh, se puoi ottenere un risultato con un passaggio, perché farne (molti) di più?
Se vuoi calcolare l'area di un trapezio, non vai a calcolare l'area del triangolo a sinistra, l'area del rettangolo al centro e l'area del triangolo a destra per poi sommarle.... applichi la sua formula dell'area, giusto?
Così, se devi copiare i dati in un range, non vai a selezionarti le singole celle che lo compongono!
Questo avrebbe senso se ad esempio volessi applicare un formattazione diversa per ogni singola cella, ma nel tuo caso devi solo leggere dei valori, quindi basta individuare i limiti del range, selezionarlo e prendere il data array...
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
Rispondi