› Sviluppare funzionalita su Microsoft Office con VBA › "salva con nome e chiudi" e poi diventa solo "salva e chiudi"
-
AutoreArticoli
-
Buongiorno a tutti,
ho un file vergine che a inizio di ogni nuovo intervento ogni collega deve aprire. Arriva il primo collega e apre questo file. Poi il collega deve assentarsi, e in alto trova un tasto che può schiacciare "Cambio Utente" (codice salva_con_nome). Il file viene salvato con nome e si auto chiude in automatico. Il file viene salvato in una specifica cartella con nome: NomeCognome_DataOrarioSalvataggio_NumeroPaziente.xlsm
Sub Salva_con_nome() If MsgBox("Attenzione: la procedura verrà salvata, e potrà essere continuata dal collega. Il file si trova nella cartella: Procedura in corso. Procedere?", vbYesNo, "Speichern") = vbYes Then Dim fName As String Dim MyDirS As String fName = Sheets("intervento spinale").Range("af7") MyDirS = Sheets("DataBase").Range("t8") ActiveWorkbook.SaveAs Filename:= _ MyDirS & fName & ".xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Application.Quit End If End SubQui nasce il problema: arriva il secondo collega per continuare l'intervento, iniziato dal primo collega, va nella cartella specifica e apre il file salvato con nome in precedenza. A questo punto il secondo collega si deve assentare, e quindi anche lui schiaccia il tasto "cambia utente". Però quel tasto avendo il codice "salva con nome", creerà un nuovo file. A fine intervento se i cambi sono stati frequenti si potranno avere decine di file dello stesso intervento. (i colleghi chiaramente riconoscono la nuova versione attraverso l'orario... ma questo crea confusione).
la mia domanda è: si può fare che aprendo il file vergine... il tasto "cambia utente" è impostato con il codice "salva con nome e chiudi"... poi al suo salvataggio con nome... il nuovo file creato il tasto si "trasforma" e avrà come codice solo "salva e chiudi"
Sub salva_Chiudi() ActiveWorkbook.Save Application.Quit End Subnon so come farlo trasformare... oppure... creo due tasti uno è all'inizio poi si "nasconde" e appare l'altro al suo salvataggio con nome... non so cosa più semplice fare 🙂
mi chiederete perché devono ogni volta salvarlo: perché per ogni cambio di collega, il collega deve scollegarsi dal PC e il nuovo collega deve accedere con il proprio accesso 🙂
spero che qualcuno possa aiutarmi nel mio problemino... e chiaramente vi ringrazio anticipatamente come sempre!!
saluti e a presto
Marco
Secondo me la cosa più semplice è identificare qualcuna che cambia dalla prima apertura alle altre. Per esempio una cella che viene riempita o assumo un valore oppure la cartella di salvataggio oppure creare una cella che cambia valore ad hoc (vero o falso). Poi quando chiudi verifiche e con una condizione se fai partire un salva o un salvaconnome
Ciao luca
Qualcosa non qualcuna ...
ciao Luca73! grazie per la tua risposta!
ho risolto in questo modo... non è la cosa più elegante, ma funziona 🙂
ho creato 2 tasti, uno sopra l'altro. al primo salvataggio con nome (primo pulsante in primo piano), il pulsante si nasconde, e quindi alla riapertura del file ci sarà solamente il pulsante salva (quello che prima era coperto in secondo piano).
Sub Salva_con_nome() If MsgBox("Attenzione: la procedura verrà salvata, e potrà essere continuata dal collega. Il file si trova nella cartella: Procedura in corso. Procedere?", vbYesNo, "Speichern") = vbYes Then ActiveSheet.Shapes("Pulsante 56134").Visible = False ' <------ aggiunto la funzione nasconti pulsante!' Dim fName As String Dim MyDirS As String fName = Sheets("intervento spinale").Range("af7") MyDirS = Sheets("DataBase").Range("t8") ActiveWorkbook.SaveAs Filename:= _ MyDirS & fName & ".xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Application.Quit End If End Submagari potrà essere d'aiuto a qualcun altro... se qualcuno comunque ha una soluzione più elegante sono sempre propenso ad imparare 🙂
ringrazio tutti, e vi auguro una buona giornata
alla prossima
Marco
Ciao
Una alternativa potrebbe essere questa:
a) inserisci nel Foglio un Pulsante ActiveX; cambia la proprietà .Caption da "CommandButton1" a "Salva con nome"
b) inserisci nel Modulo del pulsante un codice (adattato) come questo
Private Sub CommandButton1_Click() With CommandButton1 If .Caption = "Salva con nome" Then Stop .Caption = "Salva e chiude" ' tuo codice per la prima volta ElseIf .Caption = "Salva e chiude" Then Stop ' tuo codice per le volte successive End If End With End SubQuando il file è intonso il pulsante mostrerà la dicitura " Salva con nome " mentre tutte le volte successive mostrerà la dicitura "Salva e chiude ".
Ciao,
Mario
marco_budin wrote:se qualcuno comunque ha una soluzione più elegante sono sempre propenso ad imparare
La soluzione più elegante è rifare tutto in Access 🙂
Restando in Excel, potresti impostare un database degli utenti, dove chi si collega viene registrato, unitamente a un univoco codice sessione abbinato al file o all'intervento; quando si scollega il programma registra il logout, con data e ora dell'operazione, relativo a quella sessione. Chi si collega successivamente e apre il file relativo al medesimo codice sessione, questo fatto viene riconosciuto dal sistema come un "proseguimento" e quindi eseguirà l'azione di salvataggio opportuna.
Ho pensato e ripensato, ti allego questo file, provalo, se ti va bene commentiamo il codice con cui è stato creato
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Allegati:
You must be logged in to view attached files.ciao a tutti! grazie mille delle varie risposte che ho ricevuto.
@albatros54 ho visto il tuo file, ed è geniale. Fai contare quante volte si accede, come aveva proposto Vecchio frac (che ringrazio anche lui della sua proposta). con il tuo codice devo creare un database del personale giusto? faccio una lista con il persona e così il tuo codice riconosce anche chi è l'utente che accede. corretto?
cmq davvero geniale, provo ad adeguarlo con i vari codici corretti, così vedo se funziona.
ti ringrazio ancora tanto per il tuo aiuto, e il vostro aiuto.
saluti e a presto
Marco
marco_budin wrote:con il tuo codice devo creare un database del personale giusto?
No, non devi creare nessun database, perche il file va a scrive sul registro di configuraziione di win. Allora questo è il codice che è inserito nel modulo "thisWorkbook"
Option Explicit Public Sub Workbook_Open() Dim counter As Long, LastOpen As String, Msg As String Dim LastMedico As String ' L'istruzione GetSetting legge il valore del registro di configurazione di win ' che corrisponde alle chiavi che sono memorizzate ' il prercorso del file di conf. di win lo trovi ' HKEY_CURRENT_USER\Software\VB and VBA Program Settings\OspedaleLugano ' intervento spinale,Count 'counter legge quante volte il file è stato aperto counter = GetSetting("OspedaleLugano", "intervento spinale", "Count", 0) 'Lastopen legge quando è stato aperto l'ultima volta il file LastOpen = GetSetting("OspedaleLugano", "intervento spinale", "Opened", "") ' LastMedico legge il nome del medico che ha aperto l'ultima volta il file LastMedico = GetSetting("OspedaleLugano", "intervento spinale", "NomeMedico", "") Msg = "Questo file è stato aperto " & counter & " volte." Msg = Msg & vbCrLf & "Ultimo Accesso: " & LastOpen Msg = Msg & vbCrLf & "Ultimo Accesso Medico: " & LastMedico MsgBox Msg, vbInformation, thisworkbook.Name Worksheets("Foglio1").CommandButton1.Caption = ("Salva con Nome") End Subquesto è il codice che trovi nel modulo del file:
Option Explicit Global counter As Integer Public Sub Salva_con_nome() Dim Medico As String, fName As String, MydirS As String Dim LastOpen As Date counter = GetSetting("OspedaleLugano", "intervento spinale", "Count", 0) If MsgBox("Attenzione: la procedura verrà salvata, e potrà essere continuata dal collega. Il file si trova nella cartella: Procedura in corso. Procedere?", vbYesNo, "Speichern") = vbYes Then ' ti chiede di introdurre il nome del medico che ha aperto il file Medico = Application.InputBox("inserisi nome medico") If Medico = CStr(False) Then MsgBox "Hai premuto Annulla,uscirai dalla Procedura" Exit Sub End If If Medico = vbNullString Then MsgBox "Non hai inserito il Nome del Dottore, uscirai dalla Procedura" Exit Sub End If fName = Sheets("intervento spinale").Range("af7") MydirS = Sheets("DataBase").Range("t8") ActiveWorkbook.SaveAs Filename:= _ MydirS & fName & ".xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False counter = counter + 1 LastOpen = Date & " " & Time ' Savesetting serve a memorizzare i parametri associati alle chiavi nel Reg di win 'Salviamo nel Reg di win il numero di volte che il file è stato aperto SaveSetting "OspedaleLugano", "intervento spinale", "Count", counter 'Salviamo la data di salvataggio con l'ora SaveSetting "OspedaleLugano", "intervento spinale", "Opened", LastOpen ' Salviamo il nome del medico che ha aperto il file SaveSetting "OspedaleLugano", "intervento spinale", "NomeMedico", Medico End If End Sub Public Sub salva() Dim fName As String Dim MydirS As String counter = GetSetting("OspedaleLugano", "intervento spinale", "Count", 0) If MsgBox("Attenzione: la procedura verrà salvata, e potrà essere continuata dal collega. Il file si trova nella cartella: Procedura in corso. Procedere?", vbYesNo, "Speichern") = vbYes Then Medico = Application.InputBox("inserisico nome medico") If Medico = False Then MsgBox "Hai premuto Annulla,uscirai dalla Procedura" Exit Sub End If If Medico = vbNullString Then MsgBox "Non hai inserito il Nome del Dottore, uscirai dalla Procedura" Exit Sub End If 'fName = Sheets("intervento spinale").Range("af7") 'MyDirS = Sheets("DataBase").Range("t8") ActiveWorkbook.Save counter = counter + 1 LastOpen = Date & " " & Time SaveSetting "OspedaleLugano", "intervento spinale", "Count", counter SaveSetting "OspedaleLugano", "intervento spinale", "Opened", LastOpen SaveSetting "OspedaleLugano", "intervento spinale", "NomeMedico", Medico 'Application.Quit End If End SubQual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )albatros54 wrote:il file va a scrive sul registro di configuraziione di win
In passato ho utilizzato anch'io questa tecnica, che funziona e gira bene.
Purtroppo basta cambiare pc (o farselo aggiornare magari da Win stesso) e ti ritrovi senza dati 🙂
Per questo consigliavo un database degli utenti, ma può andare bene anche un semplice file ini con tutte le impostazioni (da gestire magari con il modulo di inimanager proposto nel blog di questo forum).
Questo è comunque solo il mio 2cent personale. La proposta di Albatros è pienamente condivisibile 🙂
Ciao albatros e vecchio frac,
Vi ringrazio per le vostre spiegazioni.
Cioe come farei senza voi due (e anche gli altri che collaborano). Non essendo un informatico, anzi lavoro nel settore sanitario, ho solamente per hobby e per disperazione (spesso le cose nascono per quello), imparato le basi su tutorial in internet, grazie a voi ho davvero imparato molto. Ma sopratutto i vari codici, o le varie soluzioni che mi fornite, le adeguo, o le integro con altri codici.
Siete davvero una grande fonte d aiuto!
Domani provo ad inserire il codice nel mio file e vi faro sapere!!
Un sincero grazie e buona serata
Marco
-
AutoreArticoli
