Pagina 1 di 1
[Risolto] Nome file in macro
Inviato: martedì 19 maggio 2020, 11:45
da amax
Sto registrando una macro per il copia ed incolla speciale di un foglio ecc, ho notato però che questa sezione di macro indica il il nome del file di quando si è registrata
Codice: Seleziona tutto
rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = "Senza nome 1"
args1(1).Name = "Index"
args1(1).Value = 32767
args1(2).Name = "Copy"
args1(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
quindi se salvo il file dandogli un nome diverso la macro non funziona.
Se inserisco il nome del file in una cella, come posso cambiare "Senza nome 1" in tipo "Foglio.A1" (la dove ho inserito il nome del file)?
Grazie
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 11:50
da patel
prima di registrare la macro salva il file col nome corretto
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 12:16
da amax
certo che posso salvare il file prima di registrare la macro, però il file è un modello ed ogni volta ha un nome diverso, per questo ho detto di poter utilizzare il contenuto di una cella al posto del nome.
Grazie
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 13:30
da patel
Mettere le mani su un codice registrato non è semplice, allega un file di esempio con anche il risultato desiderato e spiegazioni.
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 15:10
da amax
Lo so che è difficile, allego il documento con il risultato ottenuto, se c'è chi sa come fare senza registrare macro ma con i comandi giusti sarebbe il massimo (così imparo anche)
Grazie
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 18:54
da patel
Non ho capito niente di cosa vuoi fare, avevi detto di voler fare il copia ed incolla speciale di un foglio, ma nel file allegato non vedo niente del genere, nessuna spiegazione di cosa vuoi copiare e come
Re: Nome file in macro
Inviato: martedì 19 maggio 2020, 22:57
da unlucky83
Ho evitato di scaricare il file dato l'ultimo commento di @patel
Io userei
al posto di
Prova e fai sapere
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 8:32
da amax
Purtroppo la soluzione di unlucky83 non ha funzionato, riposto il file perché credo che nell'altro la macro non compresa.
Comunque ho un file .ots per i preventivi, ad ogni cliente il suo file .ods. Ogni cliente ha più preventivi nel corso dell'anno, vorrei avere un solo file per anno e non uno per preventivo. Quindi il file .ots ha un foglio con gli articoli, un foglio per scegliere gli articoli, un foglio con il preventivo impaginato. La macro deve salvare i preventivi senza formula per evitare che ogni volta che si modificano i valori nel foglio "Componi" cambino anche per i preventivi precedenti.
Spero di essere stato chiaro, è difficile per me spiegare è come se parlassi male una lingua straniera
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 10:14
da patel
Scaricalo tu unlucky, io rinuncio
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 10:18
da amax
patel ha scritto:Scaricalo tu unlucky, io rinuncio
Scusa, che intendi?
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 12:04
da patel
che ancora non ho capito quale foglio vuoi copiare, dove vuoi copiarlo, nel tuo allegato ci sono molti fogli e nessuna spiegazione per me comprensibile, ma può darsi sia colpa mia
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 12:43
da amax
patel ha scritto:che ancora non ho capito quale foglio vuoi copiare, dove vuoi copiarlo, nel tuo allegato ci sono molti fogli e nessuna spiegazione per me comprensibile, ma può darsi sia colpa mia
Io mi spiego male, ma credevo che leggendolo l'ultimo post fosse esaustivo, voglio copiare il foglio PREVENTIVO nello stesso file e voglio che nella copia del foglio PREVENTIVO non ci siano le formule.
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 13:41
da patel
Codice: Seleziona tutto
Sub CopiaFoglio
Doc = ThisComponent
Sheet=Doc.Sheets("Preventivo")
shname = Sheet.Name
newname = shname & "_1"
Doc.Sheets.copyByName(shname, newname, 1)
Sheet = ThisComponent.Sheets(newname)
Sheet.getCellRangeByName("A1:B10").setDataArray(Sheet.getCellRangeByName("A1:B10").getDataArray)
End Sub
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 16:02
da amax
Patel sei assolutamente fuori strada, o non hai letto i post o (cosa molto probabile) non sono stato in grado di spiegarmi.
La mia richiesta principale era quella di inserire nella macro il nome del file corrente e non quello della registrazione della stessa. A richiesta ho provato a spiegare a cosa serviva quella macro, ma alla fine ci si è focalizzati su un problema che era già risolto all'origine.
Ti ringrazio ugualmente, ma spesso ho l'impressione che si risponde ad una richiesta di aiuto senza avere una reale soluzione allontanandosi dal problema reale.
Re: Nome file in macro
Inviato: mercoledì 20 maggio 2020, 16:56
da unlucky83
amax ha scritto:
La mia richiesta principale era quella di inserire nella macro il nome del file corrente e non quello della registrazione della stessa.
La risposta è thisComponent.title
Se metti questo comando nel codice della macro del file modello, quando fai doppio click sul modello ti si apre un file temporaneo che ha il nome “Senza nome 1”, che ha anch’esso le macro del modello. Il file corrente è il file temporaneo “Senza nome 1”.
La prima cosa da fare è salvare il file con il nome “Pippo.ods” per esempio, poi eseguire là macro. Il comando thisComponent.title ti restituirà “Pippo”
Allego un file modello. Fai le giuste prove.
p.s.
Da notare che ho allegato un file ots e non ods. Se il tuo problema era con il file modello, avresti fatto bene ad allegare un file modello.
se si scartano le risposte esatte è normale che poi la discussione procede per altre vie
Re: Nome file in macro
Inviato: venerdì 22 maggio 2020, 8:03
da amax
Grazie, ma secondo te come posso integrarlo al codice che ho io?
Ci ho provato, ma non ne sono stato in grado, dovrebbe sostituire il parametro "Senza nome 1" alla riga
Codice: Seleziona tutto
sub Salva
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(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = "Senza nome 1"
args1(1).Name = "Index"
args1(1).Value = 32767
args1(2).Name = "Copy"
args1(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$1:$K$54"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())
rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVDT"
args5(1).Name = "FormulaCommand"
args5(1).Value = 0
args5(2).Name = "SkipEmptyCells"
args5(2).Value = false
args5(3).Name = "Transpose"
args5(3).Value = false
args5(4).Name = "AsLink"
args5(4).Value = false
args5(5).Name = "MoveMode"
args5(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args5())
rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "ToPoint"
args8(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args8())
Dim Sh As Object
Dim NomeSh As String
Sh = ThisComponent.getSheets()
Rem Assegno alla variabile NomeSh il valore della cella A1 del Foglio Attivo
NomeSh = ThisComponent.getCurrentController().getActiveSheet().getCellByPosition(11, 0).String
Rem controlliamo se la cella a1 è compilata e se il nome non è già stato usato
If NomeSh = "" Then MsgBox "Manca il nome del foglio" : Exit Sub
If Not Sh.hasByName(NomeSh) Then
ThisComponent.getCurrentController().getActiveSheet().setName(NomeSh)
Else
MsgBox "Nome Fogio già presente"
End If
end sub
Grazie
Re: Nome file in macro
Inviato: lunedì 25 maggio 2020, 19:24
da charlie
Re: Nome file in macro
Inviato: lunedì 25 maggio 2020, 23:39
da unlucky83
Hai aperto la discussione dicendo che
amax ha scritto:
quindi se salvo il file dandogli un nome diverso la macro non funziona.
Nella mia prima risposta (
vedi qui) ti ho spiegato come inserire il comando Thiscomponent.Title
amax ha scritto:Purtroppo la soluzione di unlucky83 non ha funzionato
Questa tua risposta mi ha sorpreso. Poi dopo che ho risposto per la seconda volta ci hai riprovato
amax ha scritto:Grazie, ma secondo te come posso integrarlo al codice che ho io?
Ci ho provato, ma non ne sono stato in grado, dovrebbe sostituire il parametro "Senza nome 1" alla riga
Che posso dirti...io ho fatto proprio questa sostituzione
Codice: Seleziona tutto
sub Main
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(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = ThisComponent.Title
args1(1).Name = "Index"
args1(1).Value = 4
args1(2).Name = "Copy"
args1(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Nr"
args2(0).Value = 3
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$A$1:$F$20"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Nr"
args6(0).Value = 4
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args6())
rem ----------------------------------------------------------------------
dim args7(5) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Flags"
args7(0).Value = "SVDT"
args7(1).Name = "FormulaCommand"
args7(1).Value = 0
args7(2).Name = "SkipEmptyCells"
args7(2).Value = false
args7(3).Name = "Transpose"
args7(3).Value = false
args7(4).Name = "AsLink"
args7(4).Value = false
args7(5).Name = "MoveMode"
args7(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args7())
rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "ToPoint"
args8(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args8())
end sub
L'ho messa nel tuo allegato ods e ho rinominato il file un paio di volte, avviando la macro ogni volta e non mi da nessun errore.
Siccome la sostituzione del codice non è così complicata non vedo dove sia il problema.
Per la cronaca, la risposta a quest'altra domanda:
Se inserisco il nome del file in una cella, come posso cambiare "Senza nome 1" in tipo "Foglio.A1" (la dove ho inserito il nome del file)?
è sostituire
con
Codice: Seleziona tutto
args1(0).Value = ThisComponent.Sheets.getbyname("Foglio").getcellrangebyname("A1").string
Re: Nome file in macro
Inviato: martedì 26 maggio 2020, 1:06
da unlucky83
Probabilmente l'errore che riscontri è nell'inserimento della copia del foglio perchè il registratore di macro li si perde per strada.
Ho deciso di ristrutturare il codice in modo che sia comprensibile a tutti, il 99% è frutto del registratore di macro ma ho preferito spezzare la registrazione in tante macro quindi il risultato è una pagina di codice aumentata di parecchio.
Ho poi aggiunto una macro che rinomina il foglio temporaneo. Con questa versione non hai bisogno del foglio vuoto in ultima posizione.
Codice: Seleziona tutto
sub Main
Call PosizionePreventivo
call InserisciFoglioTemporaneo
Call copiaFoglioInPosizione4
Call PosizionePreventivo
Call SelezionaArea
Call Copia
Call PosizionePreventivoSenzaFormule
Call IncollaSpeciale
Call RinominaTemporaneo
end sub
sub PosizionePreventivo
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 = "Nr"
args1(0).Value = 3
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
end Sub
sub copiaFoglioInPosizione4
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(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = ThisComponent.Title
args1(1).Name = "Index"
args1(1).Value = 4
args1(2).Name = "Copy"
args1(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
end sub
sub SelezionaArea
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 = "$A$1:$F$20"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
end Sub
sub Copia
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
end Sub
sub PosizionePreventivoSenzaFormule
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 = "Nr"
args1(0).Value = 4
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
end Sub
sub IncollaSpeciale
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")
dim args7(5) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Flags"
args7(0).Value = "SVDT"
args7(1).Name = "FormulaCommand"
args7(1).Value = 0
args7(2).Name = "SkipEmptyCells"
args7(2).Value = false
args7(3).Name = "Transpose"
args7(3).Value = false
args7(4).Name = "AsLink"
args7(4).Value = false
args7(5).Name = "MoveMode"
args7(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args7())
end Sub
sub InserisciFoglioTemporaneo
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")
dim args11(1) as new com.sun.star.beans.PropertyValue
args11(0).Name = "Name"
args11(0).Value = "temporaneo"
args11(1).Name = "Index"
args11(1).Value = 4
dispatcher.executeDispatch(document, ".uno:Insert", "", 0, args11())
end Sub
Sub RinominaTemporaneo
Numerazione=inputbox("Imposta numero del Preventivo")
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 = "Name"
args1(0).Value = "Preventivo_" & Numerazione
dispatcher.executeDispatch(document, ".uno:RenameTable", "", 0, args1())
end sub*
Re: Nome file in macro
Inviato: venerdì 29 maggio 2020, 11:10
da amax
Grazie per l'ottimo lavoro e la pazienza che avete avuto, alla fine ho utilizzato
Codice: Seleziona tutto
args1(0).Value = ThisComponent.Sheets.getbyname("Foglio").getcellrangebyname("A1").string
mantenendo la mia macro perché quella da te ricompilata non manteneva la formattazione del foglio copiato.
Grazie veramente di cuore perché così ho dato tante risposte a molte mie domande sulle macro.
Grazie Massimo