[Risolto] Perdita Model.Source.Name con la selezione di una cella

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

[Risolto] Perdita Model.Source.Name con la selezione di una cella

Messaggio da Biagio91 »

Salve,
Sto utilizzando un codice che mi verifica il nome del pulsante tramite Model.Source.Name.
Il codice in questione funziona.

Si è voluto inserire una chiamata ad una sub che trova l'ultima riga utilizzata di un elenco presente in un foglio diverso da quello in cui risiede il Pulsante.
Per poter trovare l'ultima riga usata ho adoperato il codice seguente:

'-----------------
'Creazione della finestra di dialogo e chiamata alla Sub Prova ↓
'-----------------

Codice: Seleziona tutto

Sub Main(Evento)

'Creazione finestra di dialogo
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dlg_Prova)

	Call Prova
	
NomePulsante = Evento.Source.Model.Name
PRINT NomePulsante

End Sub
'-----------------
'Sub Ricerca ultima riga di un elenco in un altro foglio ↓
'-----------------

Codice: Seleziona tutto

Sub Prova
Doc = ThisComponent
FoglioDiversoDalFoglioContenenteIlPulsante = Doc.Sheets.GetByName("Foglio2")

Rem ---------- Spostare la selezione sulla cella A1 del foglio desiderato
		Cella = FoglioDiversoDalFoglioContenenteIlPulsante.getCellRangeByName("A1")
		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)
			UltimaRigaUsata_FoglioDiversoDalFoglioContenenteIlPulsante = UltimaRigaUsata
			PRINT UltimaRigaUsata_FoglioDiversoDalFoglioContenenteIlPulsante
End Sub
'-----------------
'Function RicercaUltimaRigaUsata ↓
'-----------------

Codice: Seleziona tutto

Function UltimaRigaUsata As Integer
Dim oSheet As Object
If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If	
oSheet = ThisComponent.getSheets().getByIndex(ThisComponent.CurrentSelection.cellAddress.Sheet)
UltimaRigaUsata = GetLastUsedRow(oSheet)  
'PRINT UltimaRigaUsata
End Function
Evento.Source.Model.Name Non viene più riconosciuto, si genera un errore
Presumo che il problema sia dovuto al cambio di selezione operato dalla sub Prova, che compromette il Source.Model.Name , quindi come potrei fare per raggiungere lo stesso obiettivo?
Esiste un metodo per ottenere l'ultima riga usata del foglio in questione senza cambiare la selezione e operando solo sul codice di questa libreria?
 Editato: Forse ci sono arrivato, sto provando a trovare il modo per riportare la selezione sul pulsante di partenza, che però avrà lo stesso nome altri pulsanti uguali sullo stesso foglio, quindi dovrò usare una proprietà diversa dal Model.Name  
Grazie mille
Ciao
Allegati
Perdita ModelSourceName.ods
(11.89 KiB) Scaricato 55 volte
Ultima modifica di Biagio91 il mercoledì 6 luglio 2022, 17:25, modificato 1 volta 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: Perdita Model.Source.Name con la selezione di una cella

Messaggio da Rafkus_pl »

Hai sbagliato sequenza di azioni nella procedura "MAIN", prima leggi la variabile NomePulsante e poi fai Call Prova.

Questa espressione "ThisComponent.CurrentSelection.cellAddress.Sheet" restituisce l'indice del foglio attualmente visualizzato. Per fare riferimento a un altro specifico, cambia l'oggetto oSheet in:

Codice: Seleziona tutto

oSheet = ThisComponent.getSheets().GetByName("NomeDiQualcheToglio")

Codice: Seleziona tutto

Sub Main(Evento)

'Creazione finestra di dialogo
  DialogLibraries.LoadLibrary("Standard")
  Dlg = CreateUnoDialog(DialogLibraries.Standard.Dlg_Prova)	
	
  NomePulsante = Evento.Source.Model.Name
  Call Prova
  PRINT NomePulsante

End Sub


'-----------------
'Nuovo sub
'-----------------

Sub Prova

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If	

  Doc = ThisComponent
  FoglioDiversoDalFoglioContenenteIlPulsante = Doc.Sheets.GetByName("Foglio2")

Rem ---------- Spostare la selezione sulla cella A1 del foglio attivo
	Cella = FoglioDiversoDalFoglioContenenteIlPulsante.getCellRangeByName("A1")
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)
	UltimaRigaUsata_FoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(FoglioDiversoDalFoglioContenenteIlPulsante)
	PRINT UltimaRigaUsata_FoglioDiversoDalFoglioContenenteIlPulsante
End Sub
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: Perdita Model.Source.Name con la selezione di una cella

Messaggio da Biagio91 »

Rafkus_pl ha scritto: martedì 5 luglio 2022, 13:25 Hai sbagliato sequenza di azioni nella procedura "MAIN", prima leggi la variabile NomePulsante e poi fai Call Prova.
Fatto, funziona.
 Editato:  Quello che volevo fare era proprio riuscire a farla leggere successivamente al Call Prova in quanto [...]  
[...]Durante la sub si cambiava il nome al pulsante dandogli un nome random, e quindi prima di uscire dalla sub ritornavo a dare il nome originale al pulsante nell'EerrorHandler , tramite il Evento.Source.Model.Name = NomeIniziale
quindi qui si genera di nuovo l'errore.
Mi sembra di avere risolto col codice successivo:

Codice: Seleziona tutto

Doc = ThisComponent
FoglioAttivo = Doc.CurrentController.ActiveSheet
NumeroPulsanti = FoglioAttivo.DrawPage.Count
Pagina = FoglioAttivo.DrawPage
NomePulsante = Evento.Source.Model.Name
NomeIniziale = NomePulsante

'PRINT NomePulsante & " " & TagPulsante
'STOP

	For i = 0 To NumeroPulsanti-1
	  FoglioAttivo.DrawPage.GetByIndex(i).Control.Tag = i
	Next i

TagPulsante = Evento.Source.Model.Tag
	Call Prova

'ErrorHandler:
FoglioAttivo.DrawPage.GetByIndex(TagPulsante).Control.Name = NomeIniziale
'NomePulsante = Evento.Source.Model.Name
PRINT NomePulsante
Rafkus_pl ha scritto: martedì 5 luglio 2022, 13:25 Questa espressione "ThisComponent.CurrentSelection.cellAddress.Sheet" restituisce l'indice del foglio attualmente visualizzato. Per fare riferimento a un altro specifico, cambia l'oggetto oSheet in:

Codice: Seleziona tutto

oSheet = ThisComponent.getSheets().GetByName("NomeDiQualcheToglio")
Effettivamente nel sub Prova riportavo poi la selezione al foglio di partenza, quindi poi la function girava correttamente sul foglio di partenza.
Grazie per la correzione, correggo anche il codice già scritto precedentemente.

Codice: Seleziona tutto

Sub Main(Evento)

'Creazione finestra di dialogo
  DialogLibraries.LoadLibrary("Standard")
  Dlg = CreateUnoDialog(DialogLibraries.Standard.Dlg_Prova)	
	
  NomePulsante = Evento.Source.Model.Name
  Call Prova
  PRINT NomePulsante

End Sub


'-----------------
'Nuovo sub
'-----------------

Sub Prova

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If	

  Doc = ThisComponent
 FoglioIniziale = Doc.Sheets.GetByName("Foglio1")
  aFoglioDiversoDalFoglioContenenteIlPulsante = Doc.Sheets.GetByName("Foglio2")
bFoglioDiversoDalFoglioContenenteIlPulsante = Doc.Sheets.GetByName("Foglio3")
cFoglioDiversoDalFoglioContenenteIlPulsante = Doc.Sheets.GetByName("Foglio4")


'-----------------------(**)		inizio
Rem ---------- Spostare la selezione sulla cella A1 del foglio aFoglioDiversoDalFoglioContenenteIlPulsante 
	Cella = aFoglioDiversoDalFoglioContenenteIlPulsante.getCellRangeByName("A1")
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)
	UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(aFoglioDiversoDalFoglioContenenteIlPulsante)
	PRINT UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante

Rem ---------- Spostare la selezione sulla cella A1 del foglio bFoglioDiversoDalFoglioContenenteIlPulsante 
	Cella = bFoglioDiversoDalFoglioContenenteIlPulsante.getCellRangeByName("A1")
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)
	UltimaRigaUsata_bFoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(bFoglioDiversoDalFoglioContenenteIlPulsante)
	PRINT UltimaRigaUsata_bFoglioDiversoDalFoglioContenenteIlPulsante
	
	
Rem ---------- Spostare la selezione sulla cella A1 del foglio cFoglioDiversoDalFoglioContenenteIlPulsante 
	Cella = cFoglioDiversoDalFoglioContenenteIlPulsante.getCellRangeByName("A1")
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)
	UltimaRigaUsata_cFoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(cFoglioDiversoDalFoglioContenenteIlPulsante)
	PRINT UltimaRigaUsata_cFoglioDiversoDalFoglioContenenteIlPulsante
	
'-----------------------(**)		fine
	
Rem ---------- Spostare la selezione sulla cella A1 del foglio iniziale
	Cella = FoglioIniziale.getCellRangeByName("A1")
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
Purtroppo il trovare l'ultima riga del foglio, devo farlo per svariati FogliElenchi (**), quindi forse dovrei andare a modificare la function della libreria tools?

Grazie mille
Ciao
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: Perdita Model.Source.Name con la selezione di una cella

Messaggio da Rafkus_pl »

Non capisco cosa stai cercando di ottenere. Per ora, penso che tu stia creando una specie di Frankenstein, un conglomerato di vari frammenti di macro. Perché vuoi selezionare una cella? Puoi usare questa macro per controllare l'ultima riga scritta in tutti i fogli di lavoro:

Codice: Seleziona tutto

Sub Prova

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If	

  Doc = ThisComponent
  nCount = Doc.getSheets().getCount()  
  
'-----------------------(**)		inizio

  for i=0 to nCount-1
    oSheets = Doc.getSheets().getByIndex(i)
    Cella = oSheets.getCellRangeByName("A1")
 '   Doc.CurrentController.Select(Cella)
    print oSheets.name    
    Cella.value = Cella.value+1
    UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(oSheets)
    print UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante
    oCell = oSheets.getCellByPosition(1 , UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante+1 )
    oCell.value  =  UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante+1
  next i 
	
'-----------------------(**)		fine
End Sub
Nota che questa volta cambia il valore nelle celle A1 e aggiunge un'altra riga a tutti i fogli senza uscire da dove è stata chiamata.

Per controllare solo alcuni fogli, puoi farlo in questo modo:

Codice: Seleziona tutto

Sub Prova

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If	

  Doc = ThisComponent
  List = array("Foglio2", "Foglio3")

'-----------------------(**)		inizio

  for each sNameFogilo in  List
    oSheets = Doc.getSheets().getByName(sNameFogilo)
    Cella = oSheets.getCellRangeByName("A1")
 '   Doc.CurrentController.Select(Cella)
    print oSheets.name    
    Cella.value = Cella.value+1
    UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante = GetLastUsedRow(oSheets)
    print UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante
    oCell = oSheets.getCellByPosition(1 , UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante+1 )
    oCell.value  =  UltimaRigaUsata_aFoglioDiversoDalFoglioContenenteIlPulsante+1
  next 
	
'-----------------------(**)		fine	
End Sub
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: Perdita Model.Source.Name con la selezione di una cella

Messaggio da Biagio91 »

Sto cercando di ottenere la possibilità di richiamare

Evento.Source.Model.Name

dopo aver eseguito il codice per trovare l'ultima riga di un determinato foglio, o di più determinati fogli.

evento.source.model.name <- viene riconosciuto
codice
evento.source.model.name <- non viene più riconosciuto

Penso di avere risolto usando il seguente stratagemma:
evento.source.model.name <- viene riconosciuto
codice
FoglioAttivo.DrawPage.GetByIndex(TagPulsante).Control.Name = NomeIniziale <- viene riconosciuto.

p.s. per caso ti viene in mente come fare a trovare l'ultima colonna usata di un foglio? perché effettivamente nella libreria tools non lo trovo e nemmeno in rete trovo nulla. Apro un altra discussione.
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: [RISOLTO] Perdita Model.Source.Name con la selezione di una cella

Messaggio da Rafkus_pl »

Per determinare l'area del foglio utilizzata:

Codice: Seleziona tutto

oDoc= ThisComponent.getSheets()
  oSheets = oDoc.getByName("Foglio2")

  cursore = oSheets.createCursor()
  cursore.gotoStartOfUsedArea(False)
  cursore.gotoEndOfUsedArea(True)
  Cible = cursore.getRangeAddress()
  
  print "Indice dei fogli: " & Cible.Sheet
  print "prima colonna scritta: " & Cible.StartColumn
  print "prima riga scritta: " & Cible.StartRow
  print "L'ultima colonna: " & Cible.EndColumn
  print  "L'ultima riga: " & Cible.EndRow
OpenOffice 4.1.6 / LibreOffice 7.1.6.2 (x64)/ Windows 10

Sto scrivendo con google traduttore mi scuso per eventuali errori.
Rispondi