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

Codice: Seleziona tutto

args1(0).Value = ThisCOmponent.Title
al posto di

Codice: Seleziona tutto

args1(0).Value = "Senza nome 1"
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 8-)

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

args1(0).Value = "Senza nome 1"

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

Codice: Seleziona tutto

args1(0).Value = "Senza nome 1"
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