Condividi:        

Controllo di esecuzione di una macro

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

Controllo di esecuzione di una macro

Postdi JOHNNYC » 30/08/12 12:00

Ciao a tutti.
Vorrei aggiungere ad una macro un comando di controllo di esecuzione. In particolare, nella macro in calce, vorrei far in modo che se non ci sono problemi nel percorso di rete e la cartella viene creata, nella colonna "D" appaia la dicitura "OK"; diversamente appaia "KO" e la macro passi alla creazione della cartella successiva.

Codice: Seleziona tutto
Sub CREA_CARTELLE_POS()

Dim Indirizzo As String
Dim NomeCartella As String
UE = Worksheets("Foglio2").Range("A" & Rows.Count).End(xlUp).Row
ChDrive "C"

For IE = 2 To UE
Indirizzo = Range("a" & IE).Value
NomeCartella = Range("b" & IE).Value

If Dir(Indirizzo & NomeCartella, vbDirectory) = "" Then
    MkDir (Indirizzo & NomeCartella)
End If
Next IE
End Sub


Grazie.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Sponsor
 

Re: Controllo di esecuzione di una macro

Postdi Flash30005 » 30/08/12 13:01

La macro da te postata non fa latro che creare cartelle se non esistono
in che senso vorresti che in caso di errore venisse scritto "KO" e procedesse a creare cartelle?
Poi parli di rete quando il ChDrive è "C"

Suppongo che potresti non trovare il percorso di rete, è così?
e, se così di quale rete parli, "locale" (privata) o "remota" (pubblica)?

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 30/08/12 13:36

La rete è di tipo privata, i percorsi possono essere molteplici in quanto vengono utilizzati centinaia di server diversi. Potrebbe succedere che uno dei server non sia disponibile (il problema è che non li posso verificare tutti preventivamente - a meno che non strutturi una macro per un "ping" preventivo, il che potrebbe essere un'idea). Pertanto se lancio la macro per creare le cartelle, ed uno dei server non dovesse essere raggiungibile, la macro deve proseguire creando le cartelle sui server disponibili e riportando nel file di origine gli esiti.
Se non è chiaro provo a riformulare.
Grazie.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Flash30005 » 30/08/12 14:41

Non ho la possibilità di provarla in rete, ho simulato con lettere disco inesistenti e sembra funzionare
Codice: Seleziona tutto
Sub CREA_CARTELLE_POS()

Dim Indirizzo As String
Dim NomeCartella As String
UE = Worksheets("Foglio2").Range("A" & Rows.Count).End(xlUp).Row
ChDrive "C"

For IE = 2 To UE
Indirizzo = Range("a" & IE).Value
NomeCartella = Range("b" & IE).Value

If Dir(Indirizzo & NomeCartella, vbDirectory) = "" Then
On Error GoTo Errore
    MkDir (Indirizzo & NomeCartella)
    Range("D" & IE).Value = "OK"
Continua:
End If
Next IE
On Error GoTo 0
Exit Sub
Errore:
Range("D" & IE).Value = "KO"
GoTo Continua
End Sub


Fai sapere
ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Controllo di esecuzione di una macro

Postdi Anthony47 » 30/08/12 23:02

Hummm...
Leggi il post di Flash sopra.
Johnnyc, ma tu in col A tieni le lettere del drive di rete o i nomi dei server? Io credo che dovresti mantenere i nomi server e poi potresti usare quanto fatto per Ca.R qui: viewtopic.php?f=26&t=92869#p548590
In questo modo puoi preventivamente controllare che un server sia disponibile prima di lanciare il comando MkDir (mi sembra che i timeout su rete siano piuttosto lunghi) ed eventualmente controllare dopo MkDir che quel certo \\nomeserver\directory esista realmente (due check sono meglio che uno).

Ciao a tutti.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 31/08/12 10:49

Funziona che è una bellezza :D
Nella colonna "A" ho i percorsi di rete completi (es:\\SE.... ecc.) per cui non ci sono problemi.
Appena ho un attimo controllo il topic a cui fa riferimento Anthony e vi so dire.
Intanto grazie e buon week-end a tutti.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 31/08/12 13:14

Rieccomi 8)
Ho guardato il topic suggerito da Anthony. Sarebbe interessante inserire, oltre che una verifica del percorso di rete, anche una verifica preventiva dell'esistenza o meno della cartella che si vuole creare. In sostanza vorrei preventivamente controllare se, all'interno dei percorsi elencati nella colonna "A", esiste già una cartella con il nome elencato nella colonna "B" (nome da assegnare alla cartella). Utilizzando la macro così com'è, qual'ora la cartella esista già, viene restituito il seguente errore: "Errore di run-time '52'" ed il sub si blocca sull'If Dir.
Mi date una mano per risolvere? Nel contempo, se mi "erudite" anche sulla funzione "SiNo" del Topic :oops:...
Grazie per la sempre preziosa collaborazione.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Anthony47 » 31/08/12 16:20

SiNo non e' una funzione ma una variabile, che nelle istruzioni del topic linkato (vedi viewtopic.php?f=26&t=92869#p548596) viene compilata con Vero /Falso a seconda che il percorso testato tramite FSo.folderexists esista o non esista.
Devi quindi aggiungere un If alla tua attuale macro:
Codice: Seleziona tutto
SiNo = FSo.folderexists("\\myserver\mypath")  '<< il tuo indirizzo unc
if SiNo=False then
    Il tuo codice per creare "mypath"
End if

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

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 03/09/12 11:12

Grazie del chiarimento. Ho provato ad inserire il controllo nella macro (vedi sotto). Ora il problema è che non riesco ad inserire la verifica dell'esistenza o meno, della cartella che voglio creare all'interno del percorso di rete specificato nella colonna "A". Ho provato a modificare la macro inserendo nella variabile "SiNo" anche il NomeCartella, ma se la cartella esiste già nella colonna di verifica "D" non appare nulla (invece dovrebbe apparire KO).
Puoi dirmi dove devo modificare? Grazie come sempre per la preziosa collaborazione.

Codice: Seleziona tutto
Sub CREA_CARTELLE_POS()

Dim Indirizzo As String
Dim NomeCartella As String
UE = Worksheets("Foglio2").Range("A" & Rows.Count).End(xlUp).Row
ChDrive "C"
Set Fso = CreateObject("Scripting.FileSystemObject")
SiNo = Fso.folderexists("Indirizzo")
If SiNo = True Then GoTo Errore
If SiNo = False Then

For IE = 2 To UE
Indirizzo = Range("a" & IE).Value
NomeCartella = Range("b" & IE).Value
If Dir(Indirizzo & NomeCartella, vbDirectory) = "" Then
On Error GoTo Errore
    MkDir (Indirizzo & NomeCartella)
    Range("D" & IE).Value = "OK"

Continua:
End If
Next IE
On Error GoTo 0
Exit Sub
Errore:
Range("D" & IE).Value = "KO"
GoTo Continua
End If
End If
End Sub
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Anthony47 » 04/09/12 01:49

Quello che devi creare e' una struttura di questo tipo:
Codice: Seleziona tutto
SiNo = FSo.folderexists("PercorsoBaseDiRete") 
If SiNo=true then
   SiNo = FSo.folderexists("PercorsoFullDaCreare")
   If SiNo=False Then
      Tue istruzioni per Creare Il Percorso
      Altre Azioni Dopo Aver Creato Il Percorso
   Else
      Tue istruzioni Se Il Percorso Gia' Esisteva
   End If
Else
   Tue istruzioni Se Il Percorso Base Di Rete Non Esiste (probabilmente niente)
End If

Nelle righe SiNo = FSo.folderexists("Indirizzo") ovviamente userai la notazione reale UNC del tuo percorso (quello base, per vedere che il server e' disponibile e quindi puoi procedere; quello che dovresti creare, per capire se il path esiste gia' o se lo devi effettivamente creare).
Rispetto alla Dir l' istruzione non deve conoscere il drive su cui e' mappato il server e il tempo di timeout in caso di server non disponibile e' drasticamente inferiore.

Devi poi integrare la struttura che ho delineato all' interno del tuo ciclo
Codice: Seleziona tutto
For IE = 2 To UE
'...
'...
Next IE

mentre inserirai in testa, subito dopo le Dim, l' istruzione
Codice: Seleziona tutto
Set Fso = CreateObject("Scripting.FileSystemObject")

Qualcosa di piu' forse avendo sottomano lo screenshot di almeno un paio di righe del tuo Foglio2; per come fare guarda qui: viewtopic.php?f=26&t=80395#p466013

Infine nella parte di gestione errore devi sostituire la riga GoTo Continua con Resume Continua

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

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 04/09/12 11:55

Il problema è che il percorso di rete, presente nella colonna "A" del file, non è sempre lo stesso per cui il percorso base di rete non è univoco (i server possono essere diversi; p.es. \\se12345678\Dati\ anzichè \\se9999999\Varie\). Nel foglio2 non ci sono altri dati particolari se non il nome da assegnare alla nuova cartella (colonna "B") che deve essere creata al percorso di rete indicato nella colonna "A". Se il percorso di rete indicato non è raggiungibile, oppure la cartella da creare esiste già, nella colonna "D" deve apparire la dicitura "KO", se tutto va bene deve apparire "OK".
Se imposto la variabile "SiNo" con la notazione reale UNC, come da te indicato, non posso fare la verifica su tutti i percorsi, ma solo su uno. Inoltre ho difficoltà ad inserire la struttura all'interno del ciclo For Next. Come posso risolvere?
Grazie per la pazienza. :)
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Anthony47 » 04/09/12 15:46

Devi calcolare quale sono gli indirizzi di base e da creare e POI li usi nella riga SiNo = FSo.folderexists("Indirizzo")
Ad esempio:
Codice: Seleziona tutto
PBase= Range("a" & IE).Value
SiNo = FSo.folderexists(PBase)
E poi
Codice: Seleziona tutto
PNuovo= Range("a" & IE).Value & Range("B" & IE).Value
SiNo = FSo.folderexists(PNuovo)

Per le difficolta', l' alternativa sarebbe se ti facessi tutto io, ma preferisco che tu ci provi e poi discutiamo sul codice; e' anche probabile che con i dettagli detti sopra ora ti sia anche piu' chiaro il complessivo.
PERO' qualche giorno fa avevi scritto "Funziona che e' una bellezza"; se l' uso dei miei suggerimenti ti destabilizza una soluzione funzionante allora probabilmente la cosa piu' semplice e' che butti tutto nel cestino e ti tieni la soluzione gia' funzionante (se funziona allora e' per definizione "buona così").

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

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 05/09/12 12:13

Chiarisco l'equivoco. La macro di cui al post di Flash del 30/08 funziona correttamente. Nasce solo un problema nel momento in cui esista già una cartella con nome uguale a quella che si vuole creare (colonna "b"), nel percorso indicato nella colonna "a" (mio post del 31/08 ore 14:14). Per cui, ciò premesso, ho tentanto di inserire il controllo preventivo come da indicazioni di Anthony, ma non ci sono riuscito.
Chiarito questo proverò a modificare con le nuove indicazioni fornite da Anthony e vi farò sapere.
Grazie ancora per la disponibilità.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Flash30005 » 05/09/12 14:31

JOHNNYC ha scritto:Nasce solo un problema nel momento in cui esista già una cartella con nome uguale a quella che si vuole creare

Forse si elimina il proble se commenti la riga evidenziata
Codice: Seleziona tutto
On Error GoTo Errore
  '  MkDir (Indirizzo & NomeCartella)  '<<<<<<<<<<<< commenta questa riga


ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 06/09/12 08:09

Codice: Seleziona tutto
On Error GoTo Errore
  '  MkDir (Indirizzo & NomeCartella)  '<<<<<<<<<<<< Crea una cartella al percorso "indirizzo" che si chiama "NomeCartella"


Voglio creare una nuova cartella che si chiama "NomeCartella" (colonna B del file excel) all'indirizzo specificato (colonna "A" del file excel).

Ciao.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Flash30005 » 06/09/12 12:51

Infatti quella condizione serve per verificare se la cartella non esiste in tal caso la crea , se è errato l'indirizzo salta la creazione e passa oltre.
Ora però non capisco qual'è il problema se la cartella esiste, cosa fa e cosa vorresti che facesse?

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 06/09/12 13:24

La macro originale, questa
Codice: Seleziona tutto
Sub CREA_CARTELLE_POS()

Dim Indirizzo As String
Dim NomeCartella As String
UE = Worksheets("Foglio2").Range("A" & Rows.Count).End(xlUp).Row
ChDrive "C"

For IE = 2 To UE
Indirizzo = Range("a" & IE).Value
NomeCartella = Range("b" & IE).Value

If Dir(Indirizzo & NomeCartella, vbDirectory) = "" Then
On Error GoTo Errore
    MkDir (Indirizzo & NomeCartella)
    Range("D" & IE).Value = "OK"
Continua:
End If
Next IE
On Error GoTo 0
Exit Sub
Errore:
Range("D" & IE).Value = "KO"
GoTo Continua
End Sub

funziona correttamente fatto salvo il problema che, se nel percorso di destinazione (colonna "A") esiste già una cartella che si chiama come quella che si vuole creare (colonna "B"), la macro non riporta nella colonna "D" l'esito "KO", ma passa al percorso successivo. Per cui vorrei che, se nel percorso specificato nella colonna "A", esiste già una cartella con lo stesso nome di quella che voglio creare (colonna "B"), la macro mi ritorni l'esito "KO" e non "vuoto" come avviene adesso.
Inoltre, se il primo indirizzo della lista (colonna "A") contiene già una cartella con lo stesso nome, la macro restituisce "Errore di run-tine '52': Nome o numero di file non valido" e non passa all'indirizzo successivo.
Se non è chiaro provo a riformulare.
Grazie e ciao.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Anthony47 » 06/09/12 14:41

Non vi seguo piu'...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Controllo di esecuzione di una macro

Postdi JOHNNYC » 06/09/12 14:57

Cerco di semplificare i problemi riscontrati.
1 - Se la cartella che si vuole creare esiste già: la macro dovrebbe restituire l'esito "KO" e passare al percorso successivo. Attualmente non restituisce l'esito e passa direttamente al percorso successivo.

2 - Se il problema di cui al punto 1 riguarda il primo percorso nella lista: la macro dovrebbe restituire l'esito "KO" e passare al percorso successivo.
Attualmente la macro si blocca e restituisce "Errore di run-time 52".

Spero che sia più chiaro.
Ciao.
JOHNNYC
Utente Junior
 
Post: 33
Iscritto il: 06/07/10 10:59
Località: Mantova

Re: Controllo di esecuzione di una macro

Postdi Flash30005 » 06/09/12 15:12

Per il punto 2 pensavo fosse risolto perché a me non dà quell'errore e anche perché hai confermato che abdava perfettamente

per il punto1 invece inserisci questa riga codice dove indicato

Codice: Seleziona tutto
If Dir(Indirizzo & NomeCartella, vbDirectory) = "" Then
On Error GoTo Errore
    MkDir (Indirizzo & NomeCartella)
    Range("D" & IE).Value = "OK"
Continua:
End If
Range("D" & IE).Value =  "" then Range("D" & IE).Value = "KO"   '<<<<< aggiungere questa riga qui
Next IE

Inoltre all'inizio macro, prima del ciclo for next inserire una pulizia della colonna D
con
Codice: Seleziona tutto
ChDrive "C"
Columns(4).ClearContents   '<<<<< aggiumgere questa riga qui
For IE = 2 To UE


ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Controllo di esecuzione di una macro":


Chi c’è in linea

Visitano il forum: Nessuno e 80 ospiti