Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

applicare Macro a tutti file contenuti in una cartella

886 views
Skip to first unread message

Lino

unread,
Jan 9, 2016, 9:17:57 AM1/9/16
to
Ho creato una sempliceissima Macro (taglia del testo) per poter
applicarla ad un file aperto con estensione .csv
Ho Excel 2013 e la macro funziona senza problemi.


Domanda:

Se io volessi applicarla ad una serie di files in una cartella come
potrei fare?



Ho provato il link sotto che dovrebbe fare al caso mio, ma (con le
modifiche apportate) non funziona

[http://nclabs.blogspot.it/2012/01/macro-excel-eseguire-una-macro-tutti-i.html]

(qui sotto riporto la mia macro con aggiunte le modifiche - i files in
questione sono nella cartella c:\test1)



------------------------------------------------
Sub Smecut ()
'mia macro
.........
.........
.........

End Sub



Sub ExecuteApplyMacroToAllFiles()

'Change the path to the main folder
Call ApplyMacroToAllFiles("C:\test1")

End Sub



Sub ApplyMacroToAllFiles(ByVal MyPath As String)

Dim FileSys As Object
Dim objFolder As Object
Dim objSubFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook

Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(MyPath)

Application.ScreenUpdating = False

For Each objSubFolder In objFolder.SubFolders
For Each objFile In objSubFolder.Files
Set wkbOpen = Workbooks.Open(filename:=objFile)
'Change the name of your macro
Call SMEcut
wkbOpen.Close savechanges:=True
Next
Call ApplyMacroToAllFiles(objSubFolder.Path)
Next

Application.ScreenUpdating = True

End Sub

----------------------------------------------------------

Grazie per chi volesse aiutarmi.

--
[Kufon's soul is back]

casanmaner

unread,
Jan 9, 2016, 9:30:08 AM1/9/16
to
Ma non funziona perché non apre i file?
O è la tua macro che una volta richiamata non riesce a lavorare i file aperti?

casanmaner

unread,
Jan 9, 2016, 9:39:32 AM1/9/16
to
Inoltre a me pare che la procedura non lavori i file presenti nella "Folder" (directory principale) ma in tutte le sue "SubFolder" (sottodirectory della directory princiaple).

Prova così:

Sub ApplyMacroToAllFiles(ByVal MyPath As String)
Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook

Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(MyPath)

Application.ScreenUpdating = False
For Each objFile In objFolder.Files
Set wkbOpen = Workbooks.Open(Filename:=objFile)

'Change the name of your macro
'Call Call SMEcut
Debug.Print wkbOpen.Name

wkbOpen.Close SaveChanges:=True

Lino

unread,
Jan 9, 2016, 9:40:35 AM1/9/16
to
soto c'è pure la mia semplicisima macro al'inizio (che prima non ho
messo)


Sub SMEcut()

' Ctrl + s per macro StockMarketEye

Rows("1:1").Select
Selection.Delete Shift:=xlUp
Columns("B:AG").Select
Selection.Delete Shift:=xlToLeft

End Sub

Sub ExecuteApplyMacroToAllFiles()

'Change the path to the main folder
Call ApplyMacroToAllFiles("C:\test1")

End Sub

Sub ApplyMacroToAllFiles(ByVal MyPath As String)

Dim FileSys As Object
Dim objFolder As Object
Dim objSubFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook

Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(MyPath)

Application.ScreenUpdating = True

For Each objSubFolder In objFolder.SubFolders
For Each objFile In objSubFolder.Files
Set wkbOpen = Workbooks.Open(Filename:=objFile)
'Change the name of your macro
Call SMEcut
wkbOpen.Close savechanges:=True
Next
Call ApplyMacroToAllFiles(objSubFolder.Path)
Next

Application.ScreenUpdating = True

End Sub

Lino

unread,
Jan 9, 2016, 9:42:24 AM1/9/16
to
ok ora provo grazie

Lino

unread,
Jan 9, 2016, 9:48:00 AM1/9/16
to
perfetto (c'era un errore nel testo tuo riportato ['call call]

grazie! forse mi servirai ancora in futuro :)

Lino

unread,
Jan 9, 2016, 9:54:49 AM1/9/16
to
c'è un altro problema...

facendo eseguire la macro, in ogni carella excel, la seconda colonna
riporta dei numeri (che io non voglio).

COme potrei risolvere?

Lino

unread,
Jan 9, 2016, 10:51:33 AM1/9/16
to
Ho visto ora che questo problema sorge solo su un file ".CSV"
Se è ".XLSX" è tutto a posto.

possibii suggerimenti su come posso ovviare al problema ci sono?

Grazie

casanmaner

unread,
Jan 9, 2016, 11:07:49 AM1/9/16
to
Devi vedere come viene aperto il file .csv e come vengono disposti i relativi dati.
Prova a far andare la procedura passo passo (F8) e fermarti subito dopo l'apertura del file per vedere come sono disposti i dati e poi adattare la tua macro a quella situazione.

Lino

unread,
Jan 9, 2016, 11:30:06 AM1/9/16
to
Ho provato F8, ma non noto nulla di strano.
Ti mando un file di prova che è nella cartella temp1. Se vuoi e quando
hai tempo puoi fare un prova.

[http://wikisend.com/download/170600/prova.csv]

Lino

unread,
Jan 9, 2016, 11:34:46 AM1/9/16
to
ho sbagliato file, te lo rimando. scusa. 1 minuto riposto il link

Lino

unread,
Jan 9, 2016, 11:36:45 AM1/9/16
to

casanmaner

unread,
Jan 9, 2016, 12:01:08 PM1/9/16
to
E' strano che tu non trovi nulla di strano :-)
Se apri il file csv con il doppio click Excel automaticamente lo "riconosce" e lo apre incolonnando i dati.
Se viene aperto tramite vba invece non "elabora" i dati, riportandoli nelle colonne, ma semplicemente crea tante stringe di testo (una per ogni riga) con i testi "divisi" dal ";" (che è il carattere utilizzato nel csv)
Es. della prima riga di intestazioni.
Symbol;Last;Percent;Volume;Vol Avg 3M;Bid;Ask;Name;Market Cap;Shares Outstanding;Day Low;Day High;Last Trade DateTime;Exchange;Open;Symbol;Last;Book Value;Price/Book;Price/Sales;Sales/Share;P/E;Dividend;Yield;EPS;50 Day Moving Average;200 Day Moving Average;Short Ratio;EBITDA;52Wk Low;52Wk High;52Wk %


Lino

unread,
Jan 9, 2016, 12:12:57 PM1/9/16
to
mi era passato per la mente, ma il fatto che la macro elimini tutte le
colonne lasciando le prime 2 colonne (e non solo la prima come vorrei)
non l'avevo preso in considerazione.

questo fatto del ";" non dovrebbe valere per tutte le colonne?

Non sono esperto :)

casanmaner

unread,
Jan 9, 2016, 12:27:27 PM1/9/16
to
Il problema è che i file csv, se aperti da VBA con il comando workbook.open, non vengono letti come "testo" a cui applicare il delimitatore.
Se ad es. tu cambiassi l'estensione ai csv in txt e poi aprissi i file con il comando

Set wkbOpen = Workbooks.Open(Filename:=objFile, Delimiter:=4)

noteresti che per i file con estensione csv non viene effettuata la suddivisione per colonne in base al delimitatore ";" mentre per quelli con estensione testo vedresti che vengono suddivisi.

Lino

unread,
Jan 9, 2016, 12:27:32 PM1/9/16
to
ho appena provato a cambiare il separatore con il pipe "|" ma da' lo
stesso problema.

Quindi non penso sia dovuto al separatore, almen così mi appare,
ma è dovuto alla macro che dovrebbe essere modificata per adattarla al
formato .CSV.

vado ad intuito... :)

Lino

unread,
Jan 9, 2016, 12:28:36 PM1/9/16
to
corro subito a cambiare estensione :) speriam...

Lino

unread,
Jan 9, 2016, 12:52:39 PM1/9/16
to
inserito il comando set di cui sopra sopra

a prima vista funziona, ma devo suddevidere testo in colorre e
risalvare e poi la macro funziona.

faccio delle prove dopo ma a prima vista adesso il problema sembra
risolto
Ora devo uscire, provo con calma dopo e ti faccio sapere.

praticamente devo:

-convertitrli in formato testo
-aprire con excel e suddividere testo in colonne
-salvare nello stesso formato testo
-applicare macro


...mi tocca fare una macro nella macro o... forse meglio per le mie
capacità limitate, un file batch che mi automatizzi tutto.... :)


THANK YOU VERY VERY MUCH ! poi ti faccio sapere... :)

Lino

unread,
Jan 9, 2016, 1:26:24 PM1/9/16
to
praticamente sta macro serve a nulla se non ad allungare e complicare
il tutto.... amenochè la macro non si riesca a farla lavorare pure con
i CSV, modificandola ad hoc.

casanmaner

unread,
Jan 9, 2016, 1:40:22 PM1/9/16
to
Il giorno sabato 9 gennaio 2016 19:26:24 UTC+1, Lino ha scritto:

Scusami ma mi sono accorto che la modifica che ti avevo indicato non è corretta:

Doveva essere così:

Set wkbOpen = Workbooks.Open(Filename:=objFile, Format:=4)

casanmaner

unread,
Jan 9, 2016, 1:48:54 PM1/9/16
to
Per modificare il nome dei file csv, aggiungendo l'estensione txt, potresti usare questa:

Sub ModificaNomeFile()
Dim strFolder As String
Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
strFolder = "c:\test1" '<--- modificare qui directory
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(strFolder)
On Error Resume Next
For Each objFile In objFolder.Files
If objFile <> strFolder & ThisWorkbook.Name Then
Name objFile As objFile & ".txt"
End If
Next
End Sub

Poi lanci la macro precedente con la modifica che ti ho detto.

Lino

unread,
Jan 9, 2016, 1:50:57 PM1/9/16
to
non va bene pure questa, c'è un errore.

casanmaner

unread,
Jan 9, 2016, 1:52:05 PM1/9/16
to
Aggiungo che se il file excel non si trova nella stessa directory la macro per rinominare i file può essere modificata così:

Sub ModificaNomeFile()
Dim strFolder As String
Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
strFolder = "c:\test1" '<--- modificare qui directory
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(strFolder)
For Each objFile In objFolder.Files
Name objFile As objFile & ".txt"
Next
End Sub

casanmaner

unread,
Jan 9, 2016, 1:53:34 PM1/9/16
to
Prova la seconda perché io per comodità ho lavorato con un file excel presente nella stessa cartella dei file csv.

Lino

unread,
Jan 9, 2016, 2:26:01 PM1/9/16
to
> Prova la seconda perché io per comodità ho lavorato con un file excel
> presente nella stessa cartella dei file csv.



ho macrato e rimacrato ed adesso va bene (senza il comando set tuo)

tutto ok quel che finisce ok.

casanmaner

unread,
Jan 9, 2016, 2:57:52 PM1/9/16
to
Non ho capito senza cosa, ma bene :)
Però domani pomeriggio voglio provare a creare una procedura unica che modifichi l'estensione, sostituendola e non aggiungendola e si seguito apra il file dopo la modifica.
Perché questa cosa dei csv che da vba non vengono aperti come accade in manuale era una cosa che avevo notato è l'opzione di modificare l'estensione può essere utile in generale :)

Lino

unread,
Jan 9, 2016, 3:33:04 PM1/9/16
to
> Non ho capito senza cosa, ma bene :)

ero io che avevo capito male pensavo che il "set" che mi hai dato era
da aggiungere invece era solo come esempio per vedere delle differenze.
per fare una cosa completa, vedi, se puoi, di aggiungere un parametro
(nella macro), che modifichi solo i file di una (o più) estensione(i)
preferite nella cartella in questione (e non tutti i files,
indistintamente, contenuti mella cartella in questione).

Per il resto tutto ok grazie ancora dell'aiuto. :)

Lino

unread,
Jan 9, 2016, 9:00:29 PM1/9/16
to
ho riprovato adesso e c'è la soluzione e non occorre nemmeno cambiare
nome del file.


- Mettere i file nella cartella c:\test1

- avere 2 macro (scritte sotto) di cui una che pensa a elaborare i
file, mentre la principale macro [SMEcut] deve includere "prima" anche
la suddivisione del testo in colonne e non come facevo io "solo" un
"taglia righe e colonne". [solo così i CSV possono essere processati]

Però ora mi chiede sempre ad ogni cartella se voglio salvare e
sostituire i dati. Come posso farlo procedere senza questa richiesta?

E' molto utile però mettere un parametro nella macro che mi consenta di
scegliere quali tipi di file elaborare in una cartella (.CSV o altro)
altrimenti processa anche queli con altra estensione (indiferentemente)
che magari non c'entrano nulla.



Le macro :

---------------------------------------------------
Sub ExecuteApplyMacroToAllFiles()

'Change the path to the main folder
Call ApplyMacroToAllFiles("C:\test1")

End Sub

---------------------------------------------------

Sub ApplyMacroToAllFiles(ByVal MyPath As String)

Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook

Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(MyPath)

Application.ScreenUpdating = False
For Each objFile In objFolder.Files
Set wkbOpen = Workbooks.Open(Filename:=objFile)

'Change the name of your macro
Call SMEcut
Debug.Print wkbOpen.Name

wkbOpen.Close SaveChanges:=True

Next

Application.ScreenUpdating = True

End Sub
------------------------------------------------------------

Sub SMEcut()
'
' SMEcut Macro
'

'
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False,
FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11,
1), Array(12, 1), Array(13, 1 _
), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1),
Array(18, 1), Array(19, 1), Array _
(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24,
1), Array(25, 1), Array(26, 1), _
Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1),
Array(31, 1), Array(32, 1)), _
TrailingMinusNumbers:=True
Columns("B:AZ").Select
Selection.Delete Shift:=xlToLeft
Rows("1:1").Select
Selection.Delete Shift:=xlUp
End Sub

casanmaner

unread,
Jan 10, 2016, 5:26:14 AM1/10/16
to
Eccomi qui:
Questa è la soluzione che ti propongo.
La procedura legge l'estensione dei file presenti nella directory indicata nella variabile strFolder.
Se l'estensione è csv o txt apre i file.
Inoltre e l'estensione è csv rinomina i file in txt prima di aprirli.
I file vengono aperti in "formato" libero (Format=6) e con il delimitatore (Delimter) impostato tramite una costante strDelimiter (che in questo caso ha valore ";").
In questo modo i file vengono già aperti con tutti i dati incolonnati in base al delimitatore e quindi puoi lavorare i dati in base alle colonne e righe che ti interessano (senza dover lavorare il testo all'interno di ciascuna riga come hai fatto nella tua ultima versione SMEcut.
Una volta lavorati i file vengono chiusi e salvati e quelli che in precedenza avevano come estensione csv vengono rinominati riportando l'estensione originaria. Vedi la riga "Name strNewFileName As strOldFileName" immediatamente successiva a "wkbOpen.Close SaveChanges:=True 'False"
Prova e facci sapere :-)
'=======================
Sub Apri_File_CSV_TXT()
'Apre tutti i file csv e txt presenti in una path indicata nella variabile strFolder
'i file csv vengono rinominati in txt
'i file vengono aperti in base al delimitatore impostato con la constante strDelimiter
'i file csv, precedentemente rinominati in txt, vengono nuovamente rinominati in csv
'N.B. in presenza sia di file con estensione csv che txt i file devono avere un nome diverso
Dim strFolder As String
Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook
Dim strOldFileName As String
Dim strNewFileName As String

Const strCSV As String = "csv"
Const strTXT As String = "txt"
Const strDelimiter As String = ";"

strFolder = ThisWorkbook.Path & Application.PathSeparator & "test" '"c:\test1" '
'Debug.Print strFolder
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(strFolder)

Application.ScreenUpdating = False
For Each objFile In objFolder.Files
If LCase(FileSys.GetExtensionName(objFile)) = strCSV Or _
LCase(FileSys.GetExtensionName(objFile)) = strTXT Then
'Debug.Print objFile.Name
strOldFileName = objFile
If LCase(FileSys.GetExtensionName(objFile)) = strCSV Then
strNewFileName = Left(strOldFileName, Len(strOldFileName) - 4) & "." & strTXT
Name objFile As strNewFileName
Else
strNewFileName = strOldFileName
End If
Set wkbOpen = Workbooks.Open(Filename:=strNewFileName, Format:=6, Delimiter:=strDelimiter)

'==================================================='
'inserire qui i comandi per lavorare sul file aperto'
Debug.Print wkbOpen.Name 'stampa nella finestra immediata (Ctrl+g nel VBA) il nome del file appena aperto
'==================================================='

wkbOpen.Close SaveChanges:=True 'False
Name strNewFileName As strOldFileName
End If
Next
Application.ScreenUpdating = True
End Sub
'=======================

Prova facendo partire la procedura passo passo oppure imposta un punto di interruzione in corrispondenza della righa "Set wkbOpen = Workbooks.Open(Filename:=strNewFileName, Format:=6, Delimiter:=strDelimiter)" (basta che posizioni il cursore all'interno di questa riga e digiti F9) lancia con F5 e poi quando si ferma in corrispondenza dell'interruzione digiti F8).
A quel punto ti sposti sul file appena aperto ver vedere come si apre e da lì imposti i comandi da fare sul file.


Lino

unread,
Jan 10, 2016, 6:23:22 AM1/10/16
to
> Eccomi qui:

tks

> Prova facendo partire la procedura passo passo oppure imposta un
> punto di interruzione in corrispondenza della righa "Set wkbOpen =
> Workbooks.Open(Filename:=strNewFileName, Format:=6,
> Delimiter:=strDelimiter)" (basta che posizioni il cursore all'interno
> di questa riga e digiti F9) lancia con F5 e poi quando si ferma in
> corrispondenza dell'interruzione digiti F8). A quel punto ti sposti
> sul file appena aperto ver vedere come si apre e da lì imposti i
> comandi da fare sul file.

1. errore, impossibile trovare il percorso

2. nella sezione dove devo inserire i comandi per lavorare sul file
aperto, intendi che posso incollarci una mia macro "senza il sub"

Lino

unread,
Jan 10, 2016, 6:43:56 AM1/10/16
to
>> Eccomi qui:

> tks

>> Prova facendo partire la procedura passo passo oppure imposta un
>> punto di interruzione in corrispondenza della righa "Set wkbOpen =
>> Workbooks.Open(Filename:=strNewFileName, Format:=6,
>> Delimiter:=strDelimiter)" (basta che posizioni il cursore
>> all'interno di questa riga e digiti F9) lancia con F5 e poi quando
>> si ferma in corrispondenza dell'interruzione digiti F8). A quel
>> punto ti sposti sul file appena aperto ver vedere come si apre e da
>> lì imposti i comandi da fare sul file.

> 1. errore, impossibile trovare il percorso

gli ho messo
[strFolder = "c:\test1"]
al posto di
[strFolder = ThisWorkbook.Path & Application.PathSeparator & "test"
'"c:\test1"']

Sembra funzionare il tutto. Potrebbe andare bene questa mia modifica?

casanmaner

unread,
Jan 10, 2016, 6:51:02 AM1/10/16
to
Ovvio :-) Come ho scritto ("La procedura legge l'estensione dei file presenti nella directory indicata nella variabile strFolder. ") il percorso va indicato nella variabile strFolder :-)
Io per mia comodità ho impostato una sottocartella nella cartella dove è salvato il file.
Quello è un parametro da personalizzare in base alle esigenze specifiche (potresti anche avere i file in una cartella differente).
Solo una cosa. Ma dopo le modifiche i nuovi file mantengono il delimitatore ";"?

Lino

unread,
Jan 10, 2016, 7:07:22 AM1/10/16
to
no
Lasciando solo la prima colonna ovviamente non c'era nessun
delimitatore
Se invece ne lascio 2 o più il delimitatore è ["] ma i numeri interi
non ce l'hanno.

casanmaner

unread,
Jan 10, 2016, 7:16:37 AM1/10/16
to
Provando sulla mia postazione se il file viene salvato come un txt con tabulazione se viene modificato il file (formato che poi rimane nel rinominarlo in csv).
Si pone il problema che da VBA vengono salvati i file nel formato "attuale" e con le impostazioni standard (se il file subisce modifiche).
E anche impostando con SaveAs e impostando il formato (csv) sembra non leggere le impostazioni presenti nel proprio pc (io ho come separatore di elenchi il ;) e imposta sempre la "," come separatore.
Forse la soluzione più semplice è salvare i file così modificati in formato excel magari in una cartella differente (oppure nella stessa cartella) e lasciare non modificati i file csv e/o txt aperti.

Lino

unread,
Jan 10, 2016, 7:28:28 AM1/10/16
to
si potrebbe integrare come scritto da me nel messaggio
[<mn.50b47e0160317de1.92774@Kiss-the-Sphinx> ] il fatto che possa
selezionare le estensioni da scegliere e la cartella da processare?.

Così si richiama la macro che voglio [SMEcut in quisto caso].

e tutti i file rimangono con i loro delimitatori originari e con nomi
originari?.


Questa mi sembra la soluzione più semplice e lineare dato che lascia ai
file CSV i delimitatori che hanno originariamente.

casanmaner

unread,
Jan 10, 2016, 7:47:22 AM1/10/16
to
Credo di aver trovato la soluzione :-)
Sub Apri_File_CSV_TXT()
'Apre tutti i file csv e txt presenti in una path indicata nella variabile strFolder
'i file csv vengono rinominati in txt
'i file vengono aperti in base al delimitatore impostato con la constante strDelimiter
'i file csv, precedentemente rinominati in txt, vengono nuovamente rinominati in csv
'N.B. in presenza sia di file con estensione csv che txt i file devono avere un nome diverso
Dim strFolder As String
Dim FileSys As Object
Dim objFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook
Dim strOldFileName As String
Dim strNewFileName As String

Const strCSV As String = "csv"
Const strTXT As String = "txt"
Const strDelimiter As String = ";"

strFolder = ThisWorkbook.Path & Application.PathSeparator & "test" '"c:\test1" '
'Debug.Print strFolder
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(strFolder)

Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each objFile In objFolder.Files
If LCase(FileSys.GetExtensionName(objFile)) = strCSV Or _
LCase(FileSys.GetExtensionName(objFile)) = strTXT Then
'Debug.Print objFile.Name
strOldFileName = objFile
If LCase(FileSys.GetExtensionName(objFile)) = strCSV Then
strNewFileName = Left(strOldFileName, Len(strOldFileName) - 4) & "." & strTXT
Name objFile As strNewFileName
Else
strNewFileName = strOldFileName
End If
Set wkbOpen = Workbooks.Open(Filename:=strNewFileName, Format:=6, Delimiter:=strDelimiter)

'==================================================='
'inserire qui i comandi per lavorare sul file aperto'
'Debug.Print wkbOpen.Name 'stampa nella finestra immediata (Ctrl+g nel VBA) il nome del file appena aperto
'==================================================='

With wkbOpen
.SaveAs Filename:=.FullName, FileFormat:=xlCSVMSDOS, Local:=True
.Close
End With
Name strNewFileName As strOldFileName
End If
Next
Application.ScreenUpdating = True
End Sub

'------
Invece di utilizzare il "semplice" comando "Close SaveChanges:=True" che semplicemente salva nel formato attuale (txt visto che così vengono rinominati) il file viene salvato con il comando
.SaveAs Filename:=.FullName, FileFormat:=xlCSVMSDOS, Local:=True
e solo successivamente chiuso.
Poiché ho impostato la proprietà Local=True il VBA "legge" le proprie impostazioni "internazionali" e utilizza il separatore impostato.
Prova :-) ... e verifica nelle tue impostazioni di Paese e lingua, Altre impostazioni come separatore di elenco sia presente il ;.

casanmaner

unread,
Jan 10, 2016, 7:54:06 AM1/10/16
to
Il giorno domenica 10 gennaio 2016 13:28:28 UTC+1, Lino ha scritto:
>
> si potrebbe integrare come scritto da me nel messaggio
> [<mn.50b47e0160317de1.92774@Kiss-the-Sphinx> ] il fatto che possa
> selezionare le estensioni da scegliere e la cartella da processare?.
>
Rispetto a questo il fatto di aver inserito una variabile strFolder dove indicare il percorso dove si trovano i file e il fatto di aver inserito delle variabili (anzi COSTANTI) come
Const strCSV As String = "csv"
Const strTXT As String = "txt"

Serve proprio per modificare questi parametri.
Ovviamente poi, in caso di file diversi da csv e/o txt andrebbe aggiustato il codice per il tipo di salvataggio.

Lino

unread,
Jan 10, 2016, 8:31:36 AM1/10/16
to
Perfetto (non ho modificato nulla nelle impostazioni di paese e lingua)
Ottimo lavoro :)

Lino

unread,
Jan 10, 2016, 8:35:24 AM1/10/16
to
un'altra cosa:
come potrei eseguire una macro senza aprire Excel?

Lino

unread,
Jan 10, 2016, 8:36:17 AM1/10/16
to
ovviamente senza avviare prima io, espressamente, Excel.

casanmaner

unread,
Jan 10, 2016, 9:04:08 AM1/10/16
to
Una precisazione.
Dove è scritto FileFormat:=xlCSVMSDOS può anche essere più "semplicemente"

FileFormat:=xlCSV

Per quanto riguarda far partire una Macro di un foglio di calcolo senza aprire lo stesso non credo sia possibile.
Probabilmente è possibile farlo da un altro "programma" (magari un file in vbscript) dove in "background" viene aperta l'applicazione Excel, poi aperto il file contenente la macro e poi lanciata la macro di questo file.
Fai prima ad aprire Excel :-)

Lino

unread,
Jan 10, 2016, 9:34:59 AM1/10/16
to
si, forse è meglio :)

Anche se da qualche parte mi sembra di aver letto che si può aprire un
file excel e far partire una macro specifica [dando un argomento al
file stesso da aprire, mi pare con "!" seguito dal nome macro stessa.

Ma non so di preciso perché ho letto di sfuggita e forse mi sbaglio.

Ora comunque non è necessario (eventualmente sarebbe necessario se
dovessi programmare un lavoro specifico da far fare ad una certa ora
quando non ci sono), quindi va bene cosi.

è possibile che in futuro ci sentiamo ancora per piccoli consigli e
dritte che mi potresti dare.

thanks again :)

casanmaner

unread,
Jan 10, 2016, 11:06:43 AM1/10/16
to
Sì, ma come dicevo devi pur sempre aprire l'applicazione Excel e poi richimare la macro di quella cartella di lavoro, che fa aprire il file excel, e poi chiudere il file e chiudere l'applicazione (altrimenti l'istanza rimane aperta).
Se ad es. copi questo testo
'--------
Dim ExApp
Dim ExDoc
Dim strCallMacro

Const StrFolder = "C:\OpenCsvConverInTxT\"
Const StrFileName = "Apre_csv_rinomina_in_txt.xlsm"
Const StrMacroName = "Apri_File_CSV_TXT"

strCallMacro = "'" & strFolder & strFileName & "'!" & strMacroName

Set ExApp = CreateObject("Excel.Application")

With ExApp
.Visible = True 'se si imposta False Excel risulta non visibile
.Run strCallMacro
.WorkBooks(StrFileName).Close
.Quit
End With
'-----------

in un file di testo, lo salvi e poi modifichi l'estensione in vbs (al posto txt) e fai doppio click verrà aperta l'applicazione Excel, aperto il file Excel indicato nel percorso e con il nome che vedi (da modificare in base come si chiama e dove hai salvato il tuo file excel) e lanciata la macro (come è nominata da me e che ovviamente devi modificare se tu gli hai dato un altro nome.
Poi il foglio excel viene chiuso e l'applicazione Excel viene chiusa.

Io non ho mai provato ma forse, e dico forse, si può tramite "Utilità di pianificazione" di Windows impostare l'apertura del file excel al quale impostare che all'apertura del file venga eseguita la macro.

Lino

unread,
Jan 10, 2016, 11:56:56 AM1/10/16
to
Giusto.

Io già ora, ogni notte aggiorno dei dati su un mio database tramite
file lanciati da Wscript.exe

Però non è fatto per macro excel bensì per Jscript (il quale a sua
volta oltre a richiamare file del software che sevono per aggiornare i
database, mi esegue formule create da me *** ovviamente non sono una
cima nella programmazione, ma spingendo qua e la, me la cavichchio ***)

La macro excel mi serviva solo per rendere automatiche delle operazioni
che saltuariamente faccio su diversi file CSV che dovevo ogni volta
aprire uno ad uno.


il Software che uso per i database è https://www.amibroker.com/ ed è
completo in quando ha al suo interno l'AFL (Amibroker language Formula
che è una sorta di C) [http://www.amibroker.com/guide/] che consente di
fare ogni cosa....inerente ovviamente a quello che il software è
dedicato...

....
é per questo che forse ti potrei chiedere un qualcosa per farmi
superare degli ostacoli che per me potrebbero essere insormotabili ma
che con te potrei agevolmente superare :)

chissà.. ciao :)

casanmaner

unread,
Jan 10, 2016, 12:16:10 PM1/10/16
to
E la vedo dura... Io non sono un programmatore e me la cavo giusto con Excel. :)

Lino

unread,
Jan 10, 2016, 12:30:19 PM1/10/16
to
> E la vedo dura... Io non sono un programmatore e me la cavo giusto
> con Excel. :)

sappi è un'opportunità unica per espandere la tua coscienza

:)

issdr

unread,
Jan 10, 2016, 2:19:41 PM1/10/16
to
Lino wrote:

> un'altra cosa:
> come potrei eseguire una macro senza aprire Excel?

se non ho capito male, c'è da lavorare su dei .csv

utilizzerei altri strumenti, a seconda delle azioni da compiere sarebbe
sufficiente qualche comando con PowerShell

--
np: no song

Lino

unread,
Jan 10, 2016, 3:15:39 PM1/10/16
to
ok, ne terrò conto a tempo debito, per ora il grosso è stato risolto.
0 new messages