Salve a tutti, sono nuovo del forum e non sono un programmatore ne un grande conoscitore del basic
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"
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.
problema con do loop annidati
problema con do loop annidati
Libreoffice 7.3 su Kubuntu 20.04
-
- Messaggi: 21
- Iscritto il: lunedì 16 gennaio 2012, 12:48
Re: problema con do loop annidati
Io eviterei i cicli individuando le dimensioni dei range da copiare in questo modo:
In questo esempio tutti i dati di Foglio1 vengono copiati accodandoli in Foglio2.
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
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
Re: problema con do loop annidati
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 E poi, cosa ho sbagliato nel mio codice?
Comunque, per curiosità, perchè eviteresti i cicli? Sono di solito molto curioso E poi, cosa ho sbagliato nel mio codice?
Libreoffice 7.3 su Kubuntu 20.04
-
- Messaggi: 21
- Iscritto il: lunedì 16 gennaio 2012, 12:48
Re: problema con do loop annidati
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: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
Beh, se puoi ottenere un risultato con un passaggio, perché farne (molti) di più?squob ha scritto:Comunque, per curiosità, perchè eviteresti i cicli? Sono di solito molto curioso E poi, cosa ho sbagliato nel mio codice?
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)
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)