Paolo Mantovani wrote:
Alle 11:42, venerdì 3 febbraio 2006, Michele Zarri ha scritto:
[....]
Ciao Bart,
Mi dispiace per la brutta giornata.
Mi piace il modo per estrarre la riga (io ho un debole per il codice
ultra complicato come avrai capito).
Purtroppo una delle funzionalita' richieste dalla macro e' di
selezionare la colonna B, ma questo si aggiusta in un secondo.
Quello che invece ancora non mi convince e' l'uso del metodo Select in
quanto il risultato e' diverso dalla chiamata fatta con il dispatcher.
Select seleziona tutta la cella (che non voglio) mentre il dispatcher
rende attiva la cella (bordo ingrossato).
Ieri era un po' tardi percio' provo a riformulare la domanda:
Esiste un equivalente in StarBasic di
uno:GoToCell
?
Scusate l'invasione ma proprio in questi giorni, io e Laurent Godard abbiamo
sollevato questo stesso problema in lista [EMAIL PROTECTED]
Dunque in primo luogo l'API di Calc attualmente non copre il concetto di cella
attiva, dove "attiva" <> da "selezionata", come hai ben sottolineato tu.
Il problema è comunque conosciuto e verrà sicuramente risolto in futuro.
Dal punto di vista pratico esiste ovviamente la strada del dispatcher, ma solo
per quanto riguarda l'impostazione della cella attiva.
Esistono poi un paio di hack, per settare e ottenere la cella attiva senza
fare uso del dispatcher:
Il primo è proprio di Laurent, non è mai stato pubblicato in quanto ne abbiamo
discusso in solo privato.
In fondo al post ho riportato la mia implementazione in python :
Per rendere attiva una cella senza selezionarla invece, esiste un piccolo
trucco, che riporto in fondo al post.
In pratica si tratta semplicemente di effettuare una selezione "nulla" dopo
aver selezionato la cella desiderata.
Tengo a precisare che simili soluzioni, per quanto possano funzionare senza
problemi non sono "garantite" in quanto non sono elencate nella
documentazione ufficiale, perciè iun futuro potrebbe pure succedere che
smettano di funzionare per via di qualche cambiamento interno ad openoffice.
Tornando alla macro che state elaborando (sempre nel caso che non lo abbiate
già modificato) rimane un dettaglio che potrebbe causare errori.
La macro infatti assume che la selezione sia di una cella sola, e
probabilmente questa è una cosa logica e giustificatissima nell'ambito
dell'applicazione in questione, ma ahimè, (e qui mi metto la tuta da
programmatore) come ben sappiamo l'utente non fa MAI quello che sarebbe
logico e giusto aspettarsi che faccia, perciò, una controllatina alla
selezione o meglio ancora una gestione degli errori sarebbe (secondo me)
opportuna.
saluti
Paolo
----------------------------------------
REM ***** BASIC *****
sub Test
setActiveCell(ThisComponent, "B4")
end sub
Function SetActiveCell(oDocModel As Object, sCellName As String ) As Object
Dim oDocView As Object
Dim oActiveSheet As Object
oDocView = oDocModel.CurrentController
oActiveSheet = oDocView.ActiveSheet
oCellRange = oActiveSheet.getCellRangeByName(sCellName)
oDocView.select(oCellRange)
oDocView.select(Nothing)
SetActiveCell = oCellRange
End Function
-----------------------------------------------
-----------------------------------------------
def get_active_cell_address(doc_model):
# get the active cell address in a Calc document.
# since there is no API's for that, this function uses a great
# hack suggested from Laurent Godard <[EMAIL PROTECTED]>
doc_controller = doc_model.CurrentController
viewdata = doc_controller.ViewData
# unpack the viewdata
viewdata = viewdata.split(';')
# after the third element there are information about sheets
viewdata = viewdata[3:]
# find the index of the active sheet
sh_name = doc_controller.ActiveSheet.Name
sheetnames = list(doc_model.Sheets.ElementNames)
sh_index = sheetnames.index(sh_name)
# get the viewdata for the active sheet
sh_data = viewdata[sh_index]
# data are in delimited strings (delimiter = /)
sh_data.replace('+', '/') # ...but sometime the + is used as separator,
instead of the /
sh_data = sh_data.split('/')
# first 2 elements are the row/col position of the active cell
cell_row = sh_data[0]
cell_col = sh_data[1]
# get the actual cell
active_cell =
doc_controller.ActiveSheet.getCellRangeByPosition(cell_row,cell_col,
cell_row,cell_col)
return active_cell.RangeAddress
----------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Ciao Paolo,
Effettivamente, per quanto non sia un programmatore, la prima versione
della macro faceva un po' ribrezzo anche a me in quanto venivano date
per scontate parecchie cose (utente sul primo foglio, singola cella
selezionata, colonna minore di 27 etc...)
D'altra parte ha prevalso il pragmatismo: il "cliente" su
[email protected] voleva solo andare sulla colonna B e sulla riga
sotto a quella sulla quale immetteva i dati. Se proprio mi trovo con un
po' di tempo libero generalizzero' la macro (forse un tasto per "andare
a capo" e' dopo tutto utile), ma non credo...
Riguardo la problematica che ci hai presentato mi sento di trarre un
sospiro di sollievo. Ho passato non poco tempo sul forum e sugli archivi
di users a cercare se esistesse un equivalente del viewcursor in writer
e finalmente posso mettermi il cuore in pace :)
Ciao,
Michele
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]