Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

salva foglio con nome delle celle

Ultimo Aggiornamento: 12/02/2017 23:12
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? [SM=g27813] [SM=g27826]
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. [SM=g27811]
Ti ringrazio tantissimo
Sei fantastico [SM=x423028]
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 [SM=g27811] .

______________________________________________________________
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. [SM=g27811]
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. [SM=g27811]
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 [SM=g27811]
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 [SM=g27811]
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 [SM=g27811], 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)
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 01:20. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com