Vorrei tradurre in linguaggio a me più comprensibile la seguente macro registrata con lo strumento nativo di registrazione macro.
Il codice deve semplicemente selezionare una data cella vuota (in questo caso A5000) e poi eseguire il classico Ctrl+↑ per arrivare fino alla prima cella non vuota superiore. Come potrei fare?
'Macro per individuare l'ultimo lotto nel foglio attivo
Sub UltimaCella
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 = "A5000"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfData", "", 0, args2())
End Sub
Grazie mille
Ciao
Ultima modifica di Biagio91 il lunedì 4 luglio 2022, 13:20, modificato 2 volte in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Sub CercaPrimaVuotaB
Dim oCell
Dim oSheet
Dim oRanges
oSheet = ThisComponent.getSheets().getByIndex(0)
Do While oSheet.getCellByPosition(1, Riga).String <> ""
Riga = Riga + 1
Loop
oCell = oSheet.GetCellbyPosition(1, Riga)
ThisComponent.CurrentController.Select(oCell)
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)
End Sub
Sub CercaPrimaVuotaB_2
Dim Riga As Long
Dim oSheet As Object
Dim Range As Object, oRangeVuota As Object
oSheet = ThisComponent.getSheets().getByIndex(0)
Range = oSheet.getCellRangeByName("B1:B250")
oRangeVuota = Range.queryEmptyCells.RangeAddresses
Riga = oRangeVuota(0).StartRow
ThisComponent.CurrentController.Select(oSheet.GetCellbyPosition(1, Riga))
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Editato: Certamente raggiungono l'obiettivo prefissato
CercaVuotaB ne ho capito il concetto, ma si ferma alla prima cella NonVuota, basta cambiare da <> a = molto probabimente ma mi sembra sia un poco limitata in quanto se trova una cella vuota non partendo dalla prima riga andando verso l'ultima, non è detto che la prima cella vuota sia per forza l'ultima riga usata. Mentre partendo dal basso e premendo Ctrl+Su si arriva alla prima riga utilizzata in quella colonna.
La seconda parte di codice CercaVuotaB2 a me non funziona mica sai. Si verifica la situazione di selezione multipla, come quando si tiene premuto shift; presumo sia dovuto a questa riga di codice
If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If
oSheet = ThisComponent.getSheets().getByIndex(ThisComponent.CurrentSelection.cellAddress.Sheet)
riga= GetLastUsedRow(oSheet)
OpenOffice 4.1.6 / LibreOffice 7.1.6.2 (x64)/ Windows 10
Sto scrivendo con google traduttore mi scuso per eventuali errori.
Rafkus_pl ha scritto: ↑giovedì 30 giugno 2022, 17:02
L'ultima riga può essere trovata utilizzando la funzione definita GetLastUsedRow dalla libreria TOOLS:
Grazie mille, ci proverò.
patel ha scritto: ↑giovedì 30 giugno 2022, 17:24
Non che io sappia, dovresti già aver notato che questo linguaggio è molto più farraginoso del VBA.
Grazie mille, si l'ho notato, speravo che magari (essendo un comando così usato) ci fosse una possibilità.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
oCell = oSheet.getCellByPosition(kol , riga )
i=oCell.value 'o quando c'è del testo nella cella i=oCell.String
NOTA: la variabile kol è il numero della colonna da cui si vuole leggere il valore. Ricorda che le colonne (e le righe) vengono contate da 0, cioè la colonna A = 0, B = 1, C = 2 ...
OpenOffice 4.1.6 / LibreOffice 7.1.6.2 (x64)/ Windows 10
Sto scrivendo con google traduttore mi scuso per eventuali errori.
Option Explicit
Sub Main
Dim Doc, FoglioAttivo, oSheet, Riga, Cella, Range As Object
Doc = ThisComponent
If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If
oSheet = Doc.getSheets().getByIndex(Doc.CurrentSelection.cellAddress.Sheet)
Riga= GetLastUsedRow(oSheet)
Cella =Doc.CurrentController.ActiveSheet.GetCellByPosition(0,riga)
REM Seleziona la cella identificata
Doc.CurrentController.Select(Cella)
REM Selezionane il range vuoto
Range = Doc.CreateInstance("com.sun.star.sheet.SheetCellRanges")
Doc.CurrentController.Select(Range)
End Sub
Grazie mille
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::