[Risolto] Codice per eseguire Ctrl + Su

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

[Risolto] Codice per eseguire Ctrl + Su

Messaggio da Biagio91 »

Buongiorno,

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?

Codice: Seleziona tutto

'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::::
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Codice per eseguire Ctrl + Su

Messaggio da patel »

prova queste

Codice: Seleziona tutto

 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
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Codice per eseguire Ctrl + Su

Messaggio da Biagio91 »

Grazie mille,
 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

Codice: Seleziona tutto

ThisComponent.CurrentController.Select(oSheet.GetCellbyPosition(1, Riga))
possibile? 
ma non esiste tipo un modo molto più "diretto" di arrivarci?
Su un altro famoso programma si utilizza per esempio:

Codice: Seleziona tutto

Selection.End(xlUp).Select
C'è questa possibilità anche qui?

Grazie mille
Ciao
Ultima modifica di Biagio91 il lunedì 4 luglio 2022, 14:16, modificato 3 volte in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Rafkus_pl
Messaggi: 52
Iscritto il: domenica 19 settembre 2021, 15:45

Re: Codice per eseguire Ctrl + Su

Messaggio da Rafkus_pl »

L'ultima riga può essere trovata utilizzando la funzione definita GetLastUsedRow dalla libreria TOOLS:

Codice: Seleziona tutto

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.
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Codice per eseguire Ctrl + Su

Messaggio da patel »

Biagio91 ha scritto: giovedì 30 giugno 2022, 15:44 C'è questa possibilità anche qui?
Non che io sappia, dovresti già aver notato che questo linguaggio è molto più farraginoso del VBA.
-------------------
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
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Codice per eseguire Ctrl + Su

Messaggio da patel »

Ciao Rafkus_pl, traduzione perfetta !!
-------------------
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
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Codice per eseguire Ctrl + Su

Messaggio da Biagio91 »

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::::
Rafkus_pl
Messaggi: 52
Iscritto il: domenica 19 settembre 2021, 15:45

Re: Codice per eseguire Ctrl + Su

Messaggio da Rafkus_pl »

Piccola imbottitura: se vuoi ottenere il valore (o il testo) da una colonna specifica, aggiungi queste due righe di codice:

Codice: Seleziona tutto

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.
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Codice per eseguire Ctrl + Su

Messaggio da Biagio91 »

Ho risolto inserendo il comando per selezionare la cella cercata.

Codice: Seleziona tutto

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::::
Rispondi