| | Post: 372 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
28/11/2016 22:30 | |
Ciao a tutti.
La macro allegata dovrebbe inserire nel nome di salvataggio il testo inserito in determinate celle:
sComm1 = ActiveSheet.Range("C3").Select
sComm2 = ActiveSheet.Range("C4").Select
sComm3 = ActiveSheet.Range("K3").Select
sComm4 = ActiveSheet.Range("G4").Select
la macro funziona ma nel nome di salvataggio invece del testo esce:
vero - vero - vero - vero
la macro:
Option Explicit
Sub CopiaESalvaInPathX()
Application.ScreenUpdating = False
'dichiarazioni delle variabili
Dim wbOri As Workbook
Dim wsOri As Worksheet
Dim wbDest As Workbook
Dim wsDest As Worksheet
Dim Sh As Worksheet
Dim sPath As String
Dim sComm1, sComm2, sComm3, sComm4, sComm5, sComm6, sComm7 As String
Dim sWS As String
Dim sWB As String
Dim sData As String
Dim sNomeFile As String
Dim nSfx As Long
Dim nFogliNew As Long
Dim oShp As Shape
Dim savechanges As Long
Dim estensione As String
Const xlExcel8 As Long = 56
Const xlOpenXMLWorkbook As Long = 51
'
'-------------------------------------------------------------------------------------
'impostazioni applicazione
With Application
.DisplayAlerts = False
.ScreenUpdating = False
nFogliNew = .SheetsInNewWorkbook
.SheetsInNewWorkbook = 1
.EnableEvents = False '<<< aggiunto
End With
'-------------------------------------------------------------------------------------
'set degli oggetti
Set wbOri = ThisWorkbook
Set wsOri = wbOri.ActiveSheet
Set wbDest = Application.Workbooks.Add
sWS = wsOri.Name
'-----------------------------------------------------------------------------------------
sPath = "C:\Users\massimo\Desktop\moduli_salvati" 'casa_new
'---------------------------------------------------------------------------------------
'nomi celle nel nome di salvataggio
'ActiveSheet.Cells(5, 4).Select D5
sComm1 = ActiveSheet.Range("C3").Select
sComm2 = ActiveSheet.Range("C4").Select
sComm3 = ActiveSheet.Range("K3").Select
sComm4 = ActiveSheet.Range("G4").Select
'sComm5 = ActiveSheet.Range("R3").Select
'sComm6 = ActiveSheet.Range("S3").Select
'sComm7 = ActiveSheet.Range("T3").Select
sData = Format(Date, "dd-mm-yyyy")
'sWB = "commessa - " & sComm1 & " - " & sComm2 & " (" & sData & ")"
'sWB = "MODULO " & sComm1 & " - " & sComm2 & " - " & sComm3 & " - " & sComm4 & " " & _
'sComm5 & " - " & sComm6 & " " & sComm7 & " ( " & sData & " )"
sWB = "MODULO " & sComm1 & " - " & sComm2 & " - " & sComm3 & " - " & sComm4 & " ( " & sData & " )"
'--------------------------------------------------------------------------------------
wsOri.Copy before:=wbDest.Sheets(1)
Set wsDest = wbDest.ActiveSheet
wsDest.Unprotect "123456"
'------------------------------------------------------------------------------------------
'togliere l'istruzione successiva se il foglio salvato non deve essere protetto
'wsDest.Protect "123456"
'-------------------------------------------------------------------------------------------
sPath = sPath & "\" & sWS
For Each Sh In wbDest.Sheets
If Sh.Name <> wsDest.Name Then
Sh.Delete
End If
Next
'-------------------------------------------------------------------------------------
'controllo/creazione dir da nome foglio
If Dir(sPath, vbDirectory) = vbNullString Then
MkDir (sPath)
End If
'-------------------------------------------------------------------
'loop per creazione nome file
Do
nSfx = nSfx + 1
sNomeFile = sPath & "\" & sWB & " - " & sWS & " - " & nSfx & ".xls" '<<< formato salvataggio
'sNomeFile = sPath & "\" & sWB & " - " & sWS & " - " & nSfx & ".xlsx" '<<< new formato
Loop While Dir(sNomeFile) <> vbNullString
'salvataggio file
wsDest.SaveAs Filename:=sNomeFile
'----------------------------------------------------------
Set wsOri = Nothing
Set wbOri = Nothing
Set wsDest = Nothing
Set wbDest = Nothing
With Application
.ScreenUpdating = True
.DisplayAlerts = True
.SheetsInNewWorkbook = nFogliNew
.EnableEvents = True
End With
Application.ScreenUpdating = True
End Sub
un saluto e grazie,
john ---------------
excel 2007 |
|
| | Post: 372 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
28/11/2016 22:54 | |
Può essere un problema se le celle sono unite?
Sarebbe così:
sComm1 = ActiveSheet.Range("C3:F3").Select
sComm2 = ActiveSheet.Range("C4:F4").Select
sComm3 = ActiveSheet.Range("K3:P4").Select
sComm4 = ActiveSheet.Range("G4:P4").Select ---------------
excel 2007 |
| | Post: 422 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
28/11/2016 23:10 | |
Perché nelle righe di questo tipo:
sComm1 = ActiveSheet.Range("C3").Select
usi il .Select ?
Ad una variabile tipo sComm1 devi assegnare un valore, non solo selezionarla, pertanto, le righe dovrebbero essere almeno del tipo:
sComm1 = ActiveSheet.Range("C3").Value
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 373 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
28/11/2016 23:19 | |
Ciao rollis,
ora non esce vero - vero - vero
ma solo i trattini - - -
john ---------------
excel 2007 |
| | Post: 423 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
28/11/2016 23:43 | |
Quando si usano macro sarebbe il caso di evitare le celle unite come "la peste".
Ci sono dei casi in cui funzionano lo stesso ed il range di riferimento da inserire nella macro è quello che compare nell'apposito campo in alto a sinistra "Casella Nome" quando si seleziona una cella unita.
Il fatto che ora riporti come vuota la cella probabilmente dipende anche da che tipo di dati contengono queste celle e dato che non ho la "palla di cristallo" non posso dire la mia.
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 374 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
29/11/2016 18:11 | |
Ciao,
allego il workbook.
Cambiare la directory di salvataggio:
sPath = "C:\Users\massimo\Desktop\moduli_salvati" 'casa_new
ho fatto varie prove ma nel nome di salvataggio non "entra" il
riferimento alle celle.
john ---------------
excel 2007 |
| | Post: 375 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
29/11/2016 21:47 | |
Ora il file è fatto per funzionare per tutti e tre i fogli con ctivesheet.
Prima con un solo foglio:
sComm1 = Foglio1.Range("C3").Select
funzionava tutto.
Ora solo la parte che nomina il foglio da salvare non va.
Ma perchè anche se ora il riferimento è in una cella unica con un "collegamento" alle celle unite?
john [Modificato da john_cash 29/11/2016 21:52] ---------------
excel 2007 |
| | Post: 424 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
29/11/2016 22:08 | |
Giustamente sono vuoti dato che con la riga:
Set wbDest = Application.Workbooks.Add
apri una nuova cartella e questa prende il focus, pertanto, nelle righe tipo queste:
sComm1 = ActiveSheet.Range("C3").Value
sComm2 = ActiveSheet.Range("C4").Value
sComm3 = ActiveSheet.Range("K3").Value
sComm4 = ActiveSheet.Range("G4").Value
non puoi più far riferimento all' ActiveSheet dato che ora la cartella attiva è quella nuova e non quella in cui risiedono i tuoi dati.
Dato che in precedenza hai assegnato alla variabile wsOri il nome del foglio attivo al momento di lanciare la macro:
Set wsOri = wbOri.ActiveSheet
la variabile ora la puoi sfruttare per reperire i dati giusti lasciando comunque attiva la nuova cartella.
Le righe che recuperano i tuoi dati le puoi modificare così:
sComm1 = wsOri.Range("C3").Value
sComm2 = wsOri.Range("C4").Value
sComm3 = wsOri.Range("K3").Value
sComm4 = wsOri.Range("G4").Value
Probabilmente dovrai fare attenzione anche in altre parti della macro per la stessa problematica, in particolare se altrove hai utilizzato come riferimento l' ActiveSheet.
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 376 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
29/11/2016 22:46 | |
Ciao rollis,
veramente eccezzionale.
Ti ringrazio tantissimo
Sei fantastico
Un saluto e ancora grazie.
john
---------------
excel 2007 |
| | Post: 425 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
29/11/2016 23:21 | |
Grazie del tuo riscontro positivo, è un piacere sapere d'essere stato d'aiuto .
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 377 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
03/12/2016 10:32 | |
Ciao rolli,
la tua modifica funziona bene.
Chiedo una modifica:
modificare il nome del foglio secondo il nome di una cella unita
esempio il foglio "modulo (1)" deve rinominarsi in "alberto"
L'eventuale macro non deve essere inserita nel modulo del foglio
perchè nel salvataggio penso si inserisca.
Allego l'esempio.
Un grazie in anticipo.
john [Modificato da john_cash 03/12/2016 10:33] ---------------
excel 2007 |
| | Post: 430 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
03/12/2016 17:16 | |
Questo codice da inserire in una macro cambia il nome del foglio attivo prelevando il nome nuovo da una cella dello stesso foglio:
ActiveSheet.Name = ActiveSheet.Range("T4").Text
Dato che per funzionare il codice deve essere inserito in una macro è ovvio che verrà poi salvato nel momento in cui si salva il file stesso.
Chiaramente se il file da salvare è in formato .xlsx tutte le macro non verranno salvate ma tale formato è previsto solo dalla versione Excel 2K7 in poi.
Se invece il rinominare il foglio è solo una semplice operazione di "aggiustamento" si può sempre utilizzare la Finestra Immediata del VBA. In questo caso non resterà traccia del codice utilizzato.
Dal VBA nel menu Visualizza scegliere Finestra Immediata (basta anche premere Ctrl+G), in basso si apre la finestra e vi si copia dentro il codice. Una volta premuto l' Invio il comando viene eseguito nel foglio attivo.
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 378 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
11/02/2017 21:08 | |
Salve ripropongo questo thread.
Ho modificato questo punto:
'=======================================================================
'directory di salvataggio
sComm5 = wsOri.Range("T8").Text
sPath = "C:\Users\massimo\Desktop\moduli_salvati\sComm5" 'casa_new
'=======================================================================
in modo che il foglio venga salvato nella cartella che prenda in nome cella cella T8 = MAX ma non va dà errore.
Se scrivo così funziona:
sPath = "C:\Users\massimo\Desktop\moduli_salvati\MAX" 'casa_new
un aiuto?
john
---------------
excel 2007 |
| | Post: 454 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
11/02/2017 22:12 | |
sComm5 è una variabile pertanto la riga di codice la devi scrivere così per creare il testo finale del nome del percorso:
sPath = "C:\Users\massimo\Desktop\moduli_salvati\" & sComm5
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 379 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
11/02/2017 22:46 | |
Grazie rollis è o.k.
Ma se la cartella come nell'esempio non l'ho creata? La macro va in errore.
E' possibile aggiungere alla macro allegata un msgbox "non hai creato la cartella (nome cella) o non hai inserito il nome in (nome cella)"
Grazie tantissime rollis.
john ---------------
excel 2007 |
| | Post: 380 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
12/02/2017 14:14 | |
Ho risolto in parte aggiungendo:
'-------------------------------------------------------------------------------------
If ActiveSheet.Range("T8") = "" Then
avviso = MsgBox("Sign. " & Environ("UserName") & " non hai inserito il nome della commessa!", _
vbCritical, "SALVA MODULO")
'If avviso = 7 Then
'ActiveSheet.Protect "123456"
Exit Sub
End If
'
'-------------------------------------------------------------------------------------
ma non riesco:
se nella cartella di salvataggio non è stata creata la cartella non il nome della cella T8 deve visualizzarsi messaggio "cartella non creata".
john ---------------
excel 2007 |
| | Post: 455 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
12/02/2017 15:39 | |
Per controllare l'esistenza della cartella nel disco aggiungi queste poche righe dopo quella con cui dichiari il percorso e se ancora non esiste sul disco la cartella viene creata: sPath = "C:\Users\massimo\Desktop\moduli_salvati\" & sComm5
'---------------------------------------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(sPath) Then
FSO.CreateFolder sPath
End If
'---------------------------------------------------
PS. rivedendo per intero i tuo codice ora mi accorgo che non ti servono queste nuove righe, nel tuo codice c'è già quello che ti serve, ovvero il controllo dell'esistenza della cartella e se non c'è la crea. Ha solo una sintassi diversa ma come si sa in Excel ci sono molte strade per raggiungere lo stesso obiettivo: If Dir(sPath, vbDirectory) = vbNullString Then
MkDir (sPath)
End If
[Modificato da rollis13 12/02/2017 23:15]
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
| | Post: 381 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
12/02/2017 19:25 | |
Ciao rollis,
funziona
Un piccolo problema il resto della macro per funzionare bisogna dichiarare le variabili con all'inizio Option Explicit.
La tua nuova variabile non so come dichiarla.
john
---------------
excel 2007 |
| | Post: 382 | Registrato il: 28/05/2011
| Città: MILANO | Età: 43 | Utente Senior | excel 2000/2007 | | OFFLINE | |
|
12/02/2017 19:38 | |
Dim fso As Object
grazie rollis trovato al dichiarazione
Una saluto e ancora grazie.
john ---------------
excel 2007 |
| | Post: 456 | Registrato il: 16/08/2015
| Città: CORDENONS | Età: 67 | Utente Senior | Excel 2016-32bit Win11 | | OFFLINE |
|
12/02/2017 23:12 | |
Giusto , ti ho copiato solo le 4 righe necessarie e mi sono scordato della dichiarazione di FSO avevo fatto all'inizio della macro (come per abitudine).
______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto) |
|
|