Condividi:        

Macro per copiare testo e salvare in blocco note in formato

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro per copiare testo e salvare in blocco note in formato

Postdi kiuba » 27/01/21 17:25

Buongiorno,
Vorrei sapere se è possibile creare una macro che copia un testo di un documento Word e lo incolla in un file aperto con blocco note, per poi salvarla in formato xml.

Grazie anticipatamente!
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Sponsor
 

Re: Macro per copiare testo e salvare in blocco note in form

Postdi Anthony47 » 27/01/21 18:39

Puoi provare a spostarti da word a notepad usando AppActivate; es
Codice: Seleziona tutto
AppActivate "trzA645.tmp - Blocco note di Windows"

Vedi https://docs.microsoft.com/it-it/office ... -statement

Questa attiva il notepad che ha contiene il file trzA645.tmp
Per spostarti nel testo e interagire con notepad devi usare SendKeys per inviare sequenze che siano comandi accettati da notepad; ma sappi che e' tutto molto precario e difficile da debuggare.
Potresti invece valutare di salvare il file in formato txt; o aprire il txt in word (magari usando AppActivate + SendKeys per salvare e chiudere il file se aperto in Notepad), inserire quel che serve e salvare.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 27/01/21 20:59

Ti ringrazio.
Provo a descriverti qualche particolare in più, perché purtroppo con i suggerimenti che mi hai dato comprendo che si può realizzare il tutto, ma non saprei da dove cominciare.

Ho creato un file word che con stampa unione completa il testo da convertire in xml prendendo i dati da un foglio excel. Fin qui riesco a gestire il tutto con una macro che preleva i dati dalla prima riga di excel, salva i dati e poi passa alla riga successiva. Il salvataggio in file xml fatto da word però aggiunge molti dettagli al file rendendolo ingestibile.
Passando il testo in NotePad (il testo intero, non una selezione) e salvando in xml da lì ottengo invece esattamente quello che mi serve.

Riusciresti a darmi un esempio del codice da usare per incollare il testo copiato su word in NotePad e salvare il file di NotePad in formato xml?

Ti ringrazio per gli ottimi suggerimenti che riesci a darmi in ogni situazione
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 27/01/21 21:16

Non serve più! grazie!!
In realtà mi hai risolto il problema con il suggerimento del salvataggio in txt. Così il file è perfetto e poi tramite macro cambio il nome al file da .txt a .xml. Funziona perfettamente, grazie ancora!
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 28/01/21 21:06

Ho creato un file primofile.docm collegato ad un file secondofile.xlsx per realizzare una stampa unione. Tramite macro parto dal file .docm e lo salvo come txt, passo alla lettera successiva, salvo il file come .xml e ricomincio.

La macro è la seguente:
Codice: Seleziona tutto
Sub cambia_nome()
Dim I As Long
StartPath = "C:\Users\MiaCartella\"
For I = 1 To 10
    ' Salvo il file txt
    ChangeFileOpenDirectory "C:\Users\MiaCartella\"
        ActiveDocument.SaveAs2 FileName:="Mio file_" & I & ".txt", FileFormat:= _
            wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
            WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
             SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
            False, Encoding:=1252, InsertLineBreaks:=False, AllowSubstitutions:=False _
            , LineEnding:=wdCRLF, CompatibilityMode:=0

      'passo alla lettera successiva
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
        ChangeFileOpenDirectory "C:\Users\MiaCartella\"
     
      'Cambio nome al file attivo
        ActiveDocument.SaveAs2 FileName:="MioFile.txt", FileFormat:= _
            wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
            WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
             SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
            False, Encoding:=1252, InsertLineBreaks:=False, AllowSubstitutions:=False _
            , LineEnding:=wdCRLF, CompatibilityMode:=0
   
     ' cambio nome al primo file
    Name StartPath & "Mio file_" & I & ".txt" As StartPath & "Mio file_" & I & ".xml"
Next I
End Sub

Fin qui tutto bene..

Ora vorrei modificarla e salvare i file con un nome che non sia legato a I, ma ad una parte del testo del file primofile.docm, o (molto meglio) ad una cella del file secondofile.xlsx. é possibile? Potresti fornirmi un esempio in cui nella macro si preleva del testo da un file docm oppure da un file diverso da quello in cui è salvata la macro (nello specifico da un file xlsx)?

Un'altra cosa che vorrei fare è far proseguire il ciclo FOR fino all'ultima cella della colonna M del file secondofile.xlsx che non sia vuota. Immagino che risolto il problema precedente questo si risolva allo stesso modo, ma chiedo per scrupolo.

Grazie!
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi Anthony47 » 28/01/21 23:30

La gestione del testo in Word e' molto meno flessibile che nell'organizzazione tabellare di Excel; quindi se puoi cerca in Excel.

Da quel che dici devi aprire il file Percorso\secondofile.xlsx e poi "ci lavori sopra" indirizzandolo in modo esplicito. Es (il modo piu' elementare):
Codice: Seleziona tutto
miaVar = Workbooks("secondofile.xlsx").Sheets("Foglio1").Cells(I,"C").Value


Ma non sono certo di aver capito l'esatta difficolta' che hai incontrato...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 29/01/21 00:07

Credo che tu abbia capito bene, ma provo a spiegarmi meglio..
Vorrei prendere il valore di una cella di un foglio excel e usarla all'interno di una macro di un documento word.

Però se inserisco miaVar come proposto nel ciclo For mi dice Errore di compilazione, sub o function non definita.
Nel debug mette in evidenza la prima riga (Sub Cambia_nome()) e la parola Workbooks
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi Anthony47 » 29/01/21 00:53

Mah, avevo avuto l'impressione che la tua macro fosse incompleta e gia' in qualche modo interagissi con altro foglio Excel.
Se non e' cosi' allora devi crearti una sessione excel, all'interno della quale potrai operare con le classiche istruzioni del vba excel.

Insomma qualcosa come
Codice: Seleziona tutto
Dim WXL as Object, WWb as Object            'Dichiarazioni
'..
'..
Set WXL = CreateObject("Excel.Application")                    'Crea una sessione nascosta di XL
Set WWb = WXL.Workbooks.Open("C:\Percorso\NomeFile.xlsx")      'Apre il file e

Ora WWb fa riferimento al tuo "secondo file" (equivale a Workbook("NomeFile.xlsx"))

Quindi potrai usare, riprendendo l'esempio di prima
Codice: Seleziona tutto
miaVar = WWb.Sheets("Foglio1").Cells(I,"C").Value


In coda ricordati di inserire
Codice: Seleziona tutto
WWb.Close False              'Chiudi il file senza salvare
WXL.Quit                     'Chiudi la sessione Excel
Set WXL = Nothing            'Piu' per consuetudine che per bisogno...
Set WWb = Nothing            'Idem


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 29/01/21 19:13

Speravo di cavarmela così.. In colonna P ci sono i nomi, vorrei che il ciclo finisse quando trova la prima cella vuota in P.

Codice: Seleziona tutto
Sub crea_xml()
'
' crea_xml Macro
Dim I As Long
Dim WXL As Object, WWb As Object

Set WXL = CreateObject("Excel.Application")                   
Set WWb = WXL.Workbooks.Open("C:\Users\XXXX.xlsx")     
StartPath = "C:\Users\"
For I = 2 To WWb.Sheets("CALENDARIO").Cells(Rows.Count, "P").End(xlUp).Row
   
    ' Salvo il file txt
    ChangeFileOpenDirectory "C:\Users\"
        ActiveDocument.SaveAs2 FileName:="n_T-" & I & "-2021.txt", FileFormat:= _
            wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
            WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
             SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
            False, Encoding:=1252, InsertLineBreaks:=False, AllowSubstitutions:=False _
            , LineEnding:=wdCRLF, CompatibilityMode:=0

      'passo alla lettera successiva
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
        ChangeFileOpenDirectory "C:\Users\"
     
      'Cambio nome al file attivo
        ActiveDocument.SaveAs2 FileName:="n.txt", FileFormat:= _
            wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
            WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
             SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
            False, Encoding:=1252, InsertLineBreaks:=False, AllowSubstitutions:=False _
            , LineEnding:=wdCRLF, CompatibilityMode:=0
   
     ' cambio nome al primo file
   
    Name StartPath & "n_T-" & I & "-2021.txt" As StartPath & "n_T-" & I & "-2021.xml"
Next I
WWb.Close False             
WXL.Quit                     
Set WXL = Nothing           
Set WWb = Nothing           
End Sub


Mi comunica: Errore di Run Time "424": Necessario oggetto ed evidenzia la riga
Codice: Seleziona tutto
For I = 2 To WWb.Sheets("CALENDARIO").Cells(Rows.Count, "P").End(xlUp).Row


Anche provando ad impostare come variabile miaVar come suggerito mi crea problemi se cerco di utilizzarla per definire il nome del file da salvare alla fine, in quel caso mi dice che non trova il file.
Dopo aver definito la variabile miaVar come String nelle dichiarazioni, averla inserita dentro al ciclo For nel modo che mi hai indicato e cambiando ad esempio la riga
Codice: Seleziona tutto
Name StartPath & "n_T-" & I & "-2021.txt" As StartPath & "n_T-" & I & "-2021.xml"

in
Codice: Seleziona tutto
Name StartPath & "n_T-" & I & "-2021.txt" As StartPath & "n_T-" & miaVar & "-2021.xml"

mi dà come errore file non trovato..

Sono già soddisfatto del risultato ottenuto, in definitiva devo solo indicare nel ciclo For quanto vale I finale e tutto funziona, mi piacerebbe comunque riuscire a completare la macro..

Grazie infinite ancora una volta. Ciao
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi Anthony47 » 29/01/21 21:25

Per l'errore 424, il problema sta in Rows.Count e xlUp, perche' non sono "agganciati" al vba excel; usa 50mila (per il num righe) e -4162 al posto della costante xlUp (...Cells(60000, "P").End(-4162).Row) e dovresti trovarti bene (salvo che il tuo foglio abbia piu' di 60mila righe)

Per l'elenco e i valori delle costanti definite dal vba di excel: https://docs.microsoft.com/en-us/office ... merations)
(In particolare per quelle di "direzione": https://docs.microsoft.com/en-us/office ... direction)

Quanto all'uso di "miaVar" all'interno dell'istruzione di rinomina file, se esce il messaggio "file non trovato" allora il problema dovrebbe stare non nel nome di destinazione ma in quello di origine... a meno che miaVar non indichi anche un nuovo percorso che non esiste.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 30/01/21 09:04

Benissimo, ora funziona tutto. Anche l'utilizzo della variabile nel nome del file finale. Probabilmente c'era qualche errore di punteggiatura.. ho riscritto i comandi e ora non dà problemi.
Grazie, sei un riferimento impareggiabile!
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi kiuba » 31/01/21 22:10

Ciao, ancora un dubbio.

Come devo fare per dire al programma di fare qualche pausa? Se inserisco il solito comando

Codice: Seleziona tutto
Application.Wait (Now + TimeValue("0:00:01"))


mi porta al seguente errore:

Errore di compilazione. Impossibile trovare il metodo o il membro dei dati.

Secondo te è più sicuro inserire una pausa tra i vari salvataggi dei file? La macro è esattamente quella che ho postato, con le modifiche che mi hai suggerito, ma non compie altri passaggi. é destinata a lavorare con qualche centinaio di righe ad ogni utilizzo.

Grazie,
kiuba
Avatar utente
kiuba
Utente Junior
 
Post: 54
Iscritto il: 30/11/20 21:24

Re: Macro per copiare testo e salvare in blocco note in form

Postdi Anthony47 » 01/02/21 00:27

Nel nostro contesto, l'oggetto "Application" appartiene a WXL; quindi, ad esempio:
Codice: Seleziona tutto
WXL.Application.wait (Now + TimeValue("0:00:05"))


OPPURE usi la funzione di Windows "Sleep", previa la dichiarazione in testa al modulo vba:
Codice: Seleziona tutto
#If VBA7 Then       '!!! ON  TOP  OF  THE  VBA  MODULE   !!!!
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Poi potrai usare ad esempio
Codice: Seleziona tutto
Sleep 500                          'Attesa 500 msec


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Macro per copiare testo e salvare in blocco note in formato ":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti