Condividi:        

[excel] file condiviso che non si aggiorna.

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

[excel] file condiviso che non si aggiorna.

Postdi KITT » 16/05/11 14:46

Ciao a tutti e complimenti per questo forum.
Per lavoro spesso mi trovo nella condizione di dover usare file condivisi tra una decina di persone. Quindi mi trovo anche nella condizione di dover fronteggiare tutte quelle piccole seccature correlate all'uso di file condivisi: ad es c'e' chi si dimentica di salvare, c'e' chi salva con i filtri attivi, c'e chi scrive su una cella in realtà gia' occupata da un altro utente e quindi si verifica la sovrascrizione di dati ecc. ecc.
Il file si trova su una cartella condivisa in una lan aziendale, contiene una lista di fornitori (a volte anche 1000) da contattare per richiedere l'invio di materie prime, quindi ciascun utente del file chiama un fornitore e nelle colonne di fianco va ad inserire l'esito del contatto, i pezzi ordinati, eventuali note ecc...
Quindi ho pensato e messo a punto un sistema che mediante userform presenta a ciascun utente i dati di un solo fornitore, le relative textbox o combo box in cui inserire gli esiti del contatto, ed un commandbutton per poter inserire gli esiti.
Poiche' questo codice gira su un file condiviso e' importante evitare che lo stesso fornitore compaia sulla userform di piu' utenti. Quindi per evitare cio' applico il seguente ciclo ad ogni apertura del file:
1 - activeworkbook.save (per salvare il file e quindi per aggiornare i dati inseriti fino a quel momento dagli altri utenti);
2 - cerco la prima cella libera nella colonna della data del contatto,
3 - la seleziono e ci inserisco NOW()
4 - richiamo nuovamente activeworkbook.save per fare in modo che questa cella venga "vista" come occupata dagli altri utenti all'apertura del file.
5 - carico sull'userform i dati del fornitore corrispondente alla cella libera (ed ora"prenotata")

Invece ad ogni pressione del commandbutton preposto all'inserimetno del'esito:
6 - scrivo sul file i dati esitati nelle varie combo box e text box della userform (in maniera coerente al fornitore selezionato)
7- richiamo i punti dall' 1 al 5.

In linea di massima questo algoritmo funziona bene, ma testandolo mi sono accorto che ogni tanto lo stesso fornitore compare in due userform e quindi viene contattato da due utenti differenti.

Non riesco a capire come sia possibile questo fenomeno visto che il file essendo condiviso viene aggiornato ogni volta che richiamo l'activeworkbook.save.

Esiste qualche atro algoritmo che ottimizzi il passaggio dall' 1 al 5 che non ho considerato?

Oppure esiste qualche altra funzione a me sconosciuta che renda visibili in tempo reale e da ogni postazione gli aggiornamenti/modifiche apportate sul il file?

Ho fatto una lunga ricerca in questo ed altri forum ma non ho rilevato nulla che potesse aiutarmi a risolvere questo problema.

Scusate la lunghezza del post e ringrazio in anticipo per qualsiasi suggerimento in merito.

Buona giornata a tutti.
KITT
XP - OFFICE 2003 - ENG
WIN 7 - OFFICE 2010 - ENG
Avatar utente
KITT
Utente Junior
 
Post: 75
Iscritto il: 16/05/11 08:20

Sponsor
 

Re: [excel] file condiviso che non si aggiorna.

Postdi ricky53 » 16/05/11 16:22

Ciao,
premesso che la condivisione dovrebbe garantire l'aggiornamento dei dati dando dei messaggi di avviso, mi risulta strano quanto hai descritto e vorrei capire meglio.
Anch'io utilizzo diversi file condivisi ma non ho mai avuto problemi simili ai tuoi.

Tu hai scritto
In linea di massima questo algoritmo funziona bene, ma testandolo mi sono accorto che ogni tanto lo stesso fornitore compare in due userform e quindi viene contattato da due utenti differenti.


Come vengono aggiornati i dati nei fogli ?
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [excel] file condiviso che non si aggiorna.

Postdi KITT » 17/05/11 13:49

Prima di tutto ti ringrazio per l'interessamento.

Nella "progettazione" del mio sistema sono partito dall'assutno di base per il quale un file condiviso viene aggiornato ogni volta che uno degli utenti clicca su salva.

La mia idea era di automatizzare questo salvataggio inglobandolo all'interno di una userform del file condiviso.

All'apertura del file viene richiamato la sub workbook_open che fa scatenare:

1 - il salvataggio del file (per fare in modo che eventuali inserimenti fatti da altri utenti si aggiornino sul file e si rendano visibili)

2 - la ricerca e il selezionamento lungo la colonna della data di gestione della prima cella libera (che corrisponde al fornitore ancora da contattare)

3 - l'inserimento di now() in questa cella selezionata

4 - il salvataggio del file (per fare in modo che questa cella risulti come occupata)

5 - la visualizzazione della user form (con relativo upload dei dati del fornitore che si trova sulla riga della cella selezionata)

Quindi ipotizzando che te ed io siamo nell'ufficio insieme e dobbiamo contattare questi 1000 fornitori nel momento che apriamo il file vedremo due nominativi diversi nelle nostre userform proprio grazie al flusso dall'1 al 5.

Dopo che abbiamo contattato il nominativo in questione andiamo a popolare le combobox e le varie textbox presenti nella userform con gli esiti della chiamata e poi clicchiamo sul command button per confermare e inserire i dati nel file e passare al fornitore successivo. Cliccando sul command button si scatenano:

6 - l'inserimento nel file (nelle celle corrette) del contenuto delle text box e combo box

7 - il richiamo dei punti dall'1 al 5

Quindi se io e te continuiamo a contattare questi 1000 fornitori non dovremmo mai trovarci nella condizione di visualizzare entrambe lo stesso nominativo proprio perche' la ricerca della prima cella libera (che viene fatta sulla colonna della data di gestione) ,avviene solo dopo l'istruzione activeworkbook.save che in teoria dovrebbe rendere visibili eventuali modifiche fatte dagli altri utenti. Poi una volta trovata la cella libera vado subito ad occuparla con la data di gestione NOW() e subito dopo richiamo activeworkbook.save per rendere visibile che questa cella non e' piu' libera.

Stando cosi' le cose ritenevo impossibile che si verificasse il caso in cui lo stesso nominativo comparisse in 2 user form differenti. Eppure di quando in quando capita...

Hai suggerimenti in merito?

Ancora grazie per l'interessamento
KITT
XP - OFFICE 2003 - ENG
WIN 7 - OFFICE 2010 - ENG
Avatar utente
KITT
Utente Junior
 
Post: 75
Iscritto il: 16/05/11 08:20

Re: [excel] file condiviso che non si aggiorna.

Postdi ricky53 » 17/05/11 17:10

Ciao,
al momento non ho suggerimenti anche perchè non ho ben chiaro il flusso operativo.
Per esempio
Kitt ha scritto:5 - la visualizzazione della user form (con relativo upload dei dati del fornitore che si trova sulla riga della cella selezionata)

Quali sono le condizioni per impostare i dati nella tua Userform ?
Invia il codice che utilizzi
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [excel] file condiviso che non si aggiorna.

Postdi KITT » 18/05/11 07:38

Prima di tutto ti ringrazio nuovamente per l'interessamento.

Il codice completo e' lungo circa 14 pagine, qui ti scrivo le parti che secondo me potrebbero essere ottimizzate o che "contengono" quel qualcosa che mi sfugge e che determina quel fenomeno gia' spiegato. In ogni caso se hai bisogno del codice completo spiegami come fare per inviarti il file o se posso fare il copia/incolla direttamente qui.

la versione di excel che utilizzo e' 2003 (mi rendo conto solo ora che non l'avevo mai scritto.... scusami).

1 - per fare in modo che all'apertura del file venga visualizzata la userform in thisWorkbook ho messo:

sub workbook_open ()
UserForm.show
End Sub

2 - quindi nel codice della userform ho messo:

Const ColonnaDellaDataDiGestione = 12 'serve per prenotare la riga

Const ColonnaPrimaTextBox = 17
Const ObbligatorietaPrimaTextBox = "NO"

Const ColonnaSecondaTextBox = 0
Const ObbligatorietaSecondaTextBox = "NO"

Const ColonnaTerzaTextBox = 0
Const ObbligatorietaTerzaTextBox = "NO"

Const ColonnaPrimaComboBox = 13 '20
Const ObbligatorietaPrimaComboBox = "SI"

Const ColonnaSecondaComboBox = 14
Const ObbligatorietaSecondaComboBox = "SI"

Const ColonnaTerzaComboBox = 16
Const ObbligatorietaTerzaComboBox = "SI"

Const ColonnaPrimoDatoFornitore = 2
Const ColonnaSecondoDatoFornitore = 4
Const ColonnaTerzoDatoFornitore = 5

Private Sub userform_Initialize()

'salvo il file per aggiornarlo
ActiveWorkbook.Save

'cerco la prima riga utile
If Cells(2, ColonnaDellaDataDiGestione) = "" Then
Cells(2, ColonnaDellaDataDiGestione).Select
Else
ri = ActiveSheet.Cells(1, ColonnaDellaDataDiGestione).End(xlDown).Row + 1
Cells(ri, ColonnaDellaDataDiGestione).Select
End If

'prenoto la cella con la data e salvo per fissare la prenotazione
ActiveCell = Date
ActiveWorkbook.Save

'Rendo visibili solo le TextBox che servono con le relative label
If ColonnaPrimaTextBox < 1 Then
PrimaTextBox.Visible = False
LabelPrimaTextBox.Visible = False
Else
LabelPrimaTextBox = Cells(RigaIntestazione, ColonnaPrimaTextBox)
LabelPrimaTextBox.ControlTipText = Cells(RigaIntestazione, ColonnaPrimaTextBox)
End If

If ColonnaSecondaTextBox < 1 Then
SecondaTextBox.Visible = False
LabelSecondaTextBox.Visible = False
Else
LabelSecondaTextBox = Cells(RigaIntestazione, ColonnaSecondaTextBox)
LabelSecondaTextBox.ControlTipText = Cells(RigaIntestazione, ColonnaSecondaTextBox)
End If

If ColonnaTerzaTextBox < 1 Then
TerzaTextBox.Visible = False
LabelTerzaTextBox.Visible = False
Else
LabelTerzaTextBox = Cells(RigaIntestazione, ColonnaTerzaTextBox)
LabelTerzaTextBox.ControlTipText = Cells(RigaIntestazione, ColonnaTerzaTextBox)
End If

'Rendo visibili solo le ComboBox che servono con le relative label
If ColonnaPrimaComboBox < 1 Then
PrimaComboBox.Visible = False
LabelPrimaComboBox.Visible = False
Else
LabelPrimaComboBox = Cells(RigaIntestazione, ColonnaPrimaComboBox)
LabelPrimaComboBox.ControlTipText = Cells(RigaIntestazione, ColonnaPrimaComboBox)
End If

If ColonnaSecondaComboBox < 1 Then
SecondaComboBox.Visible = False
LabelSecondaComboBox.Visible = False
Else
LabelSecondaComboBox = Cells(RigaIntestazione, ColonnaSecondaComboBox)
LabelSecondaComboBox.ControlTipText = Cells(RigaIntestazione, ColonnaSecondaComboBox)
End If

If ColonnaTerzaComboBox < 1 Then
TerzaComboBox.Visible = False
LabelTerzaComboBox.Visible = False
Else
LabelTerzaComboBox = Cells(RigaIntestazione, ColonnaTerzaComboBox)
LabelTerzaComboBox.ControlTipText = Cells(RigaIntestazione, ColonnaTerzaComboBox)
End If

'Carica i menu' a tendina
PrimaComboBox.AddItem "x"
PrimaComboBox.AddItem "y"
PrimaComboBox.AddItem "z"

SecondaComboBox.AddItem "x"
SecondaComboBox.AddItem "y"
SecondaComboBox.AddItem "z"

TerzaComboBox.AddItem "x"
TerzaComboBox.AddItem "y"
TerzaComboBox.AddItem "z"

'pulisco le textbox e le combobox
Call ResettaForm

'carico i dati del fornitore
riga = ActiveCell.Row

If ColonnaPrimoDatoFornitore < 1 Then
PrimoDatoFornitore.Visible = False
Label1.Visible = False
Else
Label1 = Cells(RigaIntestazione, ColonnaPrimoDatoFornitore)
Label1.ControlTipText = Cells(RigaIntestazione, ColonnaPrimoDatoFornitore)
PrimoDatoFornitore = Cells(riga, ColonnaPrimoDatoFornitore)
PrimoDatoFornitore.ControlTipText = Cells(riga, ColonnaPrimoDatoFornitore)
End If

If ColonnaSecondoDatoFornitore < 1 Then
SecondoDatoFornitore.Visible = False
Label2.Visible = False
Else
Label2 = Cells(RigaIntestazione, ColonnaSecondoDatoFornitore)
SecondoDatoFornitore = Cells(riga, ColonnaSecondoDatoFornitore)
Label2.ControlTipText = Cells(RigaIntestazione, ColonnaSecondoDatoFornitore)
SecondoDatoFornitore.ControlTipText = Cells(riga, ColonnaSecondoDatoFornitore)
End If

If ColonnaTerzoDatoFornitore < 1 Then
TerzoDatoFornitore.Visible = False
Label3.Visible = False
Else
Label3 = Cells(RigaIntestazione, ColonnaTerzoDatoFornitore)
TerzoDatoFornitore = Cells(riga, ColonnaTerzoDatoFornitore)
Label3.ControlTipText = Cells(RigaIntestazione, ColonnaTerzoDatoFornitore)
TerzoDatoFornitore.ControlTipText = Cells(riga, ColonnaTerzoDatoFornitore)
End If
End Sub

2 - istruzioni relative al command button che ho chiamato "Inserisci"

Private Sub Inserisci_Click()
'controlla che non ci siano caselle vuote
'in base ai criteri di obbligatorieta' stabiliti nelle costanti

If PrimaTextBox = "" And ObbligatorietaPrimaTextBox = "SI" _
Or SecondaTextBox = "" And ObbligatorietaSecondaTextBox = "SI" _
Or TerzaTextBox = "" And ObbligatorietaTerzaTextBox = "SI" _
Or PrimaComboBox = "" And ObbligatorietaPrimaComboBox = "SI" _
Or SecondaComboBox = "" And ObbligatorietaSecondaComboBox = "SI" _
Or TerzaComboBox = "" And ObbligatorietaTerzaComboBox = "SI" Then
MsgBox FraseQuandoLasciCaselleVuote, , NomeApplicazione
Exit Sub
End If

'Scrivo le TEXTBOX e le COMBOBOX nel file solo se sono visibili nel form
RigaPrenotata = ActiveCell.Row

If ColonnaPrimaTextBox > 0 Then
Cells(RigaPrenotata, ColonnaPrimaTextBox) = PrimaTextBox
End If

If ColonnaSecondaTextBox > 0 Then
Cells(RigaPrenotata, ColonnaSecondaTextBox) = SecondaTextBox
End If

If ColonnaTerzaTextBox > 0 Then
Cells(RigaPrenotata, ColonnaTerzaTextBox) = TerzaTextBox
End If

If ColonnaPrimaComboBox > 0 Then
Cells(RigaPrenotata, ColonnaPrimaComboBox) = PrimaComboBox
End If

If ColonnaSecondaComboBox > 0 Then
Cells(RigaPrenotata, ColonnaSecondaComboBox) = SecondaComboBox
End If

If ColonnaTerzaComboBox > 0 Then
Cells(RigaPrenotata, ColonnaTerzaComboBox) = TerzaComboBox
End If

ActiveWorkbook.Save

Call ResettaForm

Call userform_Initialize
End Sub

Private Sub ResettaForm()

PrimaTextBox = ""
SecondaTextBox = ""
TerzaTextBox = ""

PrimaComboBox = ""
SecondaComboBox = ""
TerzaComboBox = ""
End Sub

Ancora grazie per l'interessamento
KITT
XP - OFFICE 2003 - ENG
WIN 7 - OFFICE 2010 - ENG
Avatar utente
KITT
Utente Junior
 
Post: 75
Iscritto il: 16/05/11 08:20

Re: [excel] file condiviso che non si aggiorna.

Postdi Anthony47 » 18/05/11 13:58

Nel processo che hai descritto secondo me e' possibile che due utenti accedano al file contemporaneamente e provano a prenotare la stessa cella libera; potresti provare a risolvere questo conflitto con qualche accorgimento logico; ad esempio:
-cerchi e memorizzi l' indirizzo della cella presunta libera,
-ci scrivi il nome utente (lo ottieni con Application.UserName),
-poi salvi, ATTENDI 3-4 secondi (piu' attendi e piu' puoi essere confidente del risultato)
-risalvi il file e ti assicuri che in quella cella c' e' ancora il nome dell' utente;
Se SI, giudichi completato il ciclo di prenotazione riga e procedi con la tua macro. Se NO, allora vuol dire che un altro utente ha occupato quella riga e ne scegli una nuova, ripetendo il ciclo.
Potrebbe essere utile accodare su un foglio di Log gli indirizzi su cui qualche utente ha avuto un
conflitto, per verificare successivamente se in effetti la riga e' stata processata.

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

Re: [excel] file condiviso che non si aggiorna.

Postdi KITT » 19/05/11 06:57

Grazie Anthony47 per il tuo preziosissimo spunto che voglio utilizzare come soluzione.
In merito a cio' pero' avrei bisogno, gentilmente, di qualche ragguaglio su questi punti:

- ci scrivi il nome utente (lo ottieni con Application.UserName),:
nel testare questo passo mi sono accorto che ogni pc restituisce lo stesso UserName, probabilmente perche', facendo tutti parte della stessa azienda, sono stati nominati con lo stesso nome rendendo impossibile il confronto preventivo. Quindi ipotizzerei queste due varianti:

1 - Provando con l'ID macchina: soluzione che preferirei ma non so come farmi restituire questo dato (sempre che esista un'istruzione utile in tal senso!!!) , ho provato a fare una ricerca su questo ed altri forum ma le uniche info reperite sono state in ambiente VB e che probabilmente per mia incapacita' non sono stato in grado di "adattarle" per VBA. Se tu potessi aiutarmi su questo punto te ne sarei grato.

2 - istituendo in fase di accesso al file una userform di log in: soluzione che saprei realizzare ma evidentemente piu' lunga per via del tempo legato alla progettazione, digitazione e test del relativo codice. Preferirei quindi utilizzarla come "ultima spiaggia"

-poi salvi, ATTENDI 3-4 secondi (piu' attendi e piu' puoi essere confidente del risultato)
: l'attesa a cui ti riferisci la posso ottere in questo modo?: ipotizzando di voler attendere 4 secondi:
For x = 1 To 400000000
Next x
oppure dovrei utilizzare un'altra istruzione tipo OnTime?(che non ho mai usato...

- Potrebbe essere utile accodare su un foglio di Log gli indirizzi su cui qualche utente ha avuto un conflitto, per verificare successivamente se in effetti la riga e' stata processata.
: Questo e' un punto che non ho compreso bene potresti gentilmente farmi un esempio? perche' io ho capito che dovrei annotare su di un foglio gli id che hanno generato un conflitto, ma non so come far rilevare un conflitto a VBA... In tal caso io mi comporterei secondo questo algoritmo:
if nome1 = nome2 then
call RoutineDiGestione
else
call routine che annota sul foglio di log i nomi che hanno conflittato
call scelta di una nuova cella
Puo' andar bene secondo te come logica?

Grazie per il tempo dedicatomi.
KITT
XP - OFFICE 2003 - ENG
WIN 7 - OFFICE 2010 - ENG
Avatar utente
KITT
Utente Junior
 
Post: 75
Iscritto il: 16/05/11 08:20

Re: [excel] file condiviso che non si aggiorna.

Postdi ricky53 » 19/05/11 11:59

Ciao,
in merito a
Kitt ha scritto:nel testare questo passo mi sono accorto che ogni pc restituisce lo stesso UserName


prova con
Codice: Seleziona tutto
    NomeComputer = Environ("computername")
    NomeUtente = Environ("username")


forse ti possono essere utili.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [excel] file condiviso che non si aggiorna.

Postdi Anthony47 » 19/05/11 14:36

Seguendo il suggerimento di Ricky userai quindi NomeComputer = Environ("computername")
(perche' UserName hai detto che sono tutti uguali; e su questo avrei da ridire verso chi ha ingegnerizzato l' installazione; comunque questo parametro e' impostabile su ogni pc tramite Menu /Strumenti /Opzioni, tab Generale, voce NomeUtente)

Per l' attesa dei 3-5 secondi puoi usare un ciclo del tipo
Codice: Seleziona tutto
EndT = (Timer + 5)   '<< per 5 secondi
Do Until Timer > EndT
DoEvents
Loop

ATTENZIONE: non e' idoneo se pensi di eseguirlo anche a mezzanotte

Per il log:
-l' utente ha prenotato la riga NN e vi scrive dentro il proprio nome macchina
-dopo 5 secondi, nella riga NN non c' e' scritto il proprio nome macchina; il processo di prenotazione e' fallito; scrive NN e nome macchina in foglio Log, con qualcosa del tipo
Codice: Seleziona tutto
Sheets("Log").cells(Rows.count,1).end(xlUp).offset(1,0)=VariabileNN  'la riga
Sheets("Log").cells(Rows.count,1).end(xlUp).offset(0,1)=VariabileNomePC  'l' utente che non gestisce
Sheets("Log").cells(Rows.count,1).end(xlUp).offset(0,1)=Cell(RigaNN,Colonna?).Value 'l' utente che dovrebbe gestire

L' amministratore controllera' successivamente che la riga NN sia poi stata processata da qualcuno oppure, per effetto di conflitti incrociati, sia finita in cavalleria.

L' algoritmo che hai scritto per me e' non interpretabile; dovrebbe essere, replicando il tuo ragionamento
Codice: Seleziona tutto
If ValoreDiCellaNN=NomeDelPC then    '<< E' DIVERSA da come l' hai scritta tu
call RoutineDiGestione   'Confermata la prenotazione
Else
LeIstruzioniDiSopra relative al Log
call scelta di una nuova cella

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

Re: [excel] file condiviso che non si aggiorna.

Postdi KITT » 22/05/11 19:40

Grazie Anthony e grazie Ricky, i vostri spunti mi hanno condotto a nuove possibilita'.
Tra l'altro con:
Application.UserName = Environ("username")
posso ovviare all'iconveniente per il quale tutti gli utenti honno lo stesso user name. In tal modo posso far si che all'apertura del file venga associato l'id dell'utente all'id dello user di excel.

Ancora grazie di cuore lavorero' su questi spunti per mettere a punto una nuova versione di questo file.
KITT
XP - OFFICE 2003 - ENG
WIN 7 - OFFICE 2010 - ENG
Avatar utente
KITT
Utente Junior
 
Post: 75
Iscritto il: 16/05/11 08:20


Torna a Applicazioni Office Windows


Topic correlati a "[excel] file condiviso che non si aggiorna.":


Chi c’è in linea

Visitano il forum: Nessuno e 55 ospiti