Pagina 1 di 1

[Risolto]Accodamento in presenza di formule

Inviato: giovedì 11 novembre 2021, 15:59
da Ant52
Buonasera,
ho una macro che mi consente di archiviare alcuni dati su un file esterno in una cartella condivisa con altri utenti. Dovendo assegnare una numerazione progressiva comune a tutti gli utenti (per evitare duplicazioni) ho pensato di aggiungere una colonna al file "Protocollo" (esattamente la colonna A) nella quale ho inserito una formula che aumenta progressivamente la numerazione ogni volta che viene riempita la riga a partire dalla colonna B. Il tutto funzionerebbe se non ci fosse un problema che non riesco a risolvere: quando cerca la prima riga libera va a scrivere i dati nella prima riga dopo quella occupata dall'ultima formula e quindi non mi fa la numerazione progressiva che volevo ma solo l'archiviazione. In pratica, supponendo un file "Protocollo" di 50 righe dove ho inserito la formula per la numerazione progressiva, mi va a scrivere dalla riga 51 in avanti dove non trova la formula nella colonna A. Quale istruzione potrei usare per fare iniziare la ricerca della prima riga vuota dalla colonna B invece che dalla A?
Trascrivo di seguito copia della macro per rendere più facile la comprensione del problema.
Grazie mille. Buona serata.

Codice: Seleziona tutto

Sub Archivio

Dim DocName as object, DocUlr as string, dummy(), range as object
Doc = ThisComponent
Sheet = Doc.Sheets(5) ' 6° foglio del file contenente la macro
Range = Sheet.getCellRangeByName("B7:K7").getDataArray ' range da copiare
sFileName ="C:\Users\Lenovo\Desktop\Protocollo.ods"  ' file di destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Protocollo = DocName.Sheets(0) 

Cursore = Protocollo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2

dRange  = Protocollo.getCellRangeByName("B" & Riga & ":K" & Riga) ' range di destinazione (PrimaRigaLibera)
dRange.setDataArray(Range)

DocName.store
DocName.Close(true)

End Sub

Re: Accodamento in presenza di formule

Inviato: giovedì 11 novembre 2021, 17:55
da patel
Allega un file di esempio per testare la macro

Re: Accodamento in presenza di formule

Inviato: giovedì 11 novembre 2021, 18:20
da lucky63
Ant52 ha scritto:Dovendo assegnare una numerazione progressiva comune a tutti gli utenti (per evitare duplicazioni) ho pensato di aggiungere una colonna al file "Protocollo" (esattamente la colonna A) nella quale ho inserito una formula che aumenta progressivamente la numerazione ogni volta che viene riempita la riga a partire dalla colonna B
Io eliminerei le formule dalla colonna A e calcolerei il progressivo direttamente da macro.
Presupponendo che in cella A1 nel foglio di archiviazione del file esterno ci sia una qualsiasi intestazione e la numerazione inizi dalla cella A2 con numero protocollo = 1 …
Modificherei la macro semplicemente come segue:

Codice: Seleziona tutto


Riga = UltimaRiga + 2

Rem Presupponendo che in cella A1 nel foglio di archiviazione del file esterno ci sia una qualsiasi intestazione
Rem e la numerazione inizi dalla cella A2 con numero protocollo = 1 ...
Protocollo.getCellRangeByName("A" & Riga).Value = UltimaRiga + 1

dRange  = Protocollo.getCellRangeByName("B" & Riga & ":K" & Riga) ' range di destinazione (PrimaRigaLibera)
Se invece vuoi mantenere le formule in colonna A dovresti intervenire similmente a come già segnalato in passato al link :
viewtopic.php?f=9&t=10673#p60280
Considerando che la colonna A è la colonna 0, la B è la 1, la C è la 2, ...
.

Re: Accodamento in presenza di formule

Inviato: giovedì 11 novembre 2021, 21:16
da Ant52
patel ha scritto:Allega un file di esempio per testare la macro
Ho creato un file di origine con la macro da testare e il file Protocollo che dovrebbe ricevere i dati e generare la numerazione progressiva con la formuletta nella colonna A.
Come potrai notare i dati vengono accodati nella prima riga che non contiene la formula e quindi non crea la numerazione. Inoltre ho notato anche che, se formatto il foglio con una griglia, scrive i dati dove non trova più la griglia.
Inoltre avevo dimenticato di scrivere, nel primo messaggio, che il numero progressivo così ottenuto nel foglio Protocollo andrebbe inserito (o copiato) nel primo foglio del file di origine (che nella realtà è un file con 15 fogli), nella posizione fissa E6 ma non saprei come chiamare questa posizione di una sola cella (A & Riga forse?) anche se mi sembrerebbe ovvio che sia quella che si trova nell'ultima riga della colonna A del file Protocollo. La mia perplessità nasce anche dal fatto che si tratta di una cartella condivisa (è la prima volta che ci lavoro) alla quale possono accedere 5 utenti e non vorrei prendere la numerazione generata da un altro anche se so che alla cartella condivisa può accedere un solo utente alla volta. Ho le idee un po' confuse e mi servirebbe qualche spiegazione anche perchè queste operazioni (registra i dati nel file Protocollo, genera la numerazione progressiva e trasferisce il numero generato nel primo foglio del file di origine) devono ovviamente avvenire con una unica macro collegata ad un pulsante per semplificare il tutto.
Forse avrei dovuto aprire una nuova discussione e me ne scuso in anticipo ma, data l'ora, e visto che gli argomenti sono l'uno conseguenza dell'altro, ho pensato che fosse più chiaro descrivere qui la problematica. Grazie per l'aiuto.

Re: Accodamento in presenza di formule

Inviato: giovedì 11 novembre 2021, 23:49
da Ant52
lucky63 ha scritto:
Ant52 ha scritto:Dovendo assegnare una numerazione progressiva comune a tutti gli utenti (per evitare duplicazioni) ho pensato di aggiungere una colonna al file "Protocollo" (esattamente la colonna A) nella quale ho inserito una formula che aumenta progressivamente la numerazione ogni volta che viene riempita la riga a partire dalla colonna B
Io eliminerei le formule dalla colonna A e calcolerei il progressivo direttamente da macro.
Presupponendo che in cella A1 nel foglio di archiviazione del file esterno ci sia una qualsiasi intestazione e la numerazione inizi dalla cella A2 con numero protocollo = 1 …
Modificherei la macro semplicemente come segue:

Codice: Seleziona tutto


Riga = UltimaRiga + 2

Rem Presupponendo che in cella A1 nel foglio di archiviazione del file esterno ci sia una qualsiasi intestazione
Rem e la numerazione inizi dalla cella A2 con numero protocollo = 1 ...
Protocollo.getCellRangeByName("A" & Riga).Value = UltimaRiga + 1

dRange  = Protocollo.getCellRangeByName("B" & Riga & ":K" & Riga) ' range di destinazione (PrimaRigaLibera)
Se invece vuoi mantenere le formule in colonna A dovresti intervenire similmente a come già segnalato in passato al link :
viewtopic.php?f=9&t=10673#p60280
Considerando che la colonna A è la colonna 0, la B è la 1, la C è la 2, ...
.

Ti ringrazio per l'aiuto nella risoluzione del problema che, praticamente, avevi già risolto in precedenza (avevo cercato questa discussione per tutta la giornata ma non l'avevo più trovata). Adesso nel file Protocollo i dati si accodano regolarmente anche con la griglia e la numerazione progressiva viene generata. il problema è che avevo dimenticato di completare la richiesta nel primo messaggio e pertanto adesso mi trovo con il numero progressivo che volevo ma non so come fare per inserirlo, con la stessa macro, nella riga E6 del primo foglio del file di origine (che nella realtà è composto da 15 fogli). Forse dovrei indicare :copia A & Riga nel foglio1 cella E6 del file di origine? E' certo che così ottengo il numero progressivo da me generato e non quello di altri? Ho un pò di difficoltà a scrivere queste istruzioni e avrei bisogno di qualche spiegazione anche perchè il file Protocollo si trova in una cartella condivisa alla quale hanno accesso altri 5 utenti e non vorrei fare troppi pasticci. Grazie per l'aiuto.

Re: Accodamento in presenza di formule

Inviato: venerdì 12 novembre 2021, 8:55
da lucky63
Ant52 ha scritto:Ti ringrazio per l'aiuto nella risoluzione del problema che, praticamente, avevi già risolto in precedenza
Ok
Ant52 ha scritto:avevo dimenticato di completare la richiesta nel primo messaggio e pertanto adesso mi trovo con il numero progressivo che volevo ma non so come fare per inserirlo, con la stessa macro, nella riga E6 del primo foglio del file di origine
Modifica come segue:

Codice: Seleziona tutto

… altro codice precedente …
dRange.setDataArray(Range)

Rem Assegna al Foglio1 cella E6 del file di origine il valore del file Protocollo Foglio1 Cella A & Riga
Doc.Sheets(0).GetCellRangeByName("E6").Value = Protocollo.getCellRangeByName("A" & Riga).Value

DocName.store
DocName.Close(true)

End Sub
Ant52 ha scritto:E' certo che così ottengo il numero progressivo da me generato e non quello di altri?
Si perché se casualmente altri utenti lanciassero simultaneamente la stessa macro dalla loro postazione riuscirebbero ad aprire il file “Protocollo.ods” ma in sola lettura e l'istruzione “DocName.store” presente nella macro genererebbe un errore che verrebbe segnalato agli stessi.

==========
Da valutare i seguenti miglioramenti/suggerimenti per la macro:
1 - Effettuare una verifica iniziale che tutte le celle del range “B7:K7” (o la parte fondamentale di esse) siano compilate e in caso contrario messaggio segnalante dati origine incompleti e uscire dalla macro ancor prima di attivare l'apertura del file esterno. Quindi senza loro memorizzazione nel file protocollo.
Ciò, in combinazione con quanto indicato al punto successivo, eviterebbe anche la memorizzazione casuale degli stessi dati del range “B7:K7” con altro protocollo progressivo (doppione dati con protocollo diverso) nel caso di attivazione plurima della macro tramite il pulsante cui è collegata.

2 - Svuotare il range “B7:K7” dopo la sua trascrizione nel file esterno. Questo per predisporre nuovamente il file origine a nuovo inserimento dati e alle verifiche del punto precedente.

3 - Intercettare il potenziale errore che altri utenti riceverebbero lanciando simultaneamente la stessa macro dalla loro postazione facendo visualizzare un messaggio più coerente segnalante la mancata registrazione dei dati a causa di un probabile utilizzo simultaneo della stessa macro invitando a riprovare dopo qualche minuto.
.
... fai eventuali prove in tal senso e in caso di difficoltà apri nuovo post segnalando esigenza ...
.

Re: [Risolto]Accodamento in presenza di formule

Inviato: venerdì 12 novembre 2021, 14:02
da Ant52
Grazie mille. Ho provato la soluzione che prevede di mantenere le formule in colonna A e funziona tutto perfettamente. Spero di potere fare le modifiche che hai, molto opportunamente, suggerito ma credo che ci risentiremo presto... Mi è rimasto un ultimo quesito in quanto, volendo differenziare i documenti archiviati con la sigla di chi li produce, avevo pensato di aggiungere nella cella adiacente (F6) una semplice formuletta così fatta: F6="/AV/"&B37 quindi ,per ogni documento mette il numero progressivo e aggiunge nella cella adiacente la barra con la sigla dell'utente di quella postazione e il contenuto della cella B37 dove ho la data del documento. Qui mi è sorto l'inghippo perchè mi scrive tutto bene tranne la data che trasforma in un numero pur avendo formattato le due celle (B37 e F6) come data. C'è modo di trasferire la data dopo la barra con il suo formato corretto GG/MM/AAAA o GG/MM/AA? Ti ringrazio moltissimo per l'aiuto fin qui fornito. Buona giornata.

Re: [Risolto]Accodamento in presenza di formule

Inviato: venerdì 12 novembre 2021, 14:31
da lucky63
.
Per quanto riguarda la cella F6 utilizza:

Codice: Seleziona tutto

="/AV/" & TESTO(B37;"GG/MM/AAAA")
In alternativa puoi impostare in cella F6

Codice: Seleziona tutto

=B37
e poi personalizzare il formato data della cella F6 con il codice formato: "/AV/" GG/MM/AAAA.
Se serve clicca su immagine per ingrandirla.
Formato data.png
...
Per altre esigenze apri nuovo post.
.

Re: [Risolto]Accodamento in presenza di formule

Inviato: venerdì 12 novembre 2021, 15:05
da Ant52
Tutto perfetto, come al solito. Grazie infinite. Avendo già messo il "Risolto" devo ripeterlo?.

Re: [Risolto]Accodamento in presenza di formule

Inviato: sabato 13 novembre 2021, 11:49
da lucky63
No