› Excel e gli applicativi Microsoft Office › Concatena con 2 condizioni
-
AutoreArticoli
-
Avevo già previsto questo problema. Togli l'intera riga perchè è ininfluente.
Il resto dovrebbe prevedere range già qualificati.
.AutoFilter field:=2, Criteria1:=CStr(ce) in .AutoFilter field:=2, Criteria1:=CDate(ce)
Questa è corretta. Con CDate a me funziona 🙂
Buon pomeriggio @vecchio frac;
Posta pure la tua soluzione!
Come dicevo sono entrato solo ora in questa Discussione, quindi per la soluzione mi servirà qualche tempo.
In sintesi, volevo calcolare quante date sono previste nel Foglio di lavoro "Giornale_Lavori", e utilizzare una matrice che contenga tutte le date.
Fatto ciò attivo il Foglio di lavoro "ARCHIVIO", calcolo quanti Record sono attivi e, tramite la Funzione "Select case", vado a valutare il Campo "GRUPPO" in funzione del Campo "Data".
Il risultato sarà il Campo "NOME"; tutti i Nominativi del GRUPPO "1" saranno separati da Chr(10).
Analogamente per il Campo "3".Purtroppo al vecchietto Giuseppe servirà diverso tempo, e diverse birre, per postare il Codice opportunamente testato; domani inizio a scrivere il Codice.
Abbiate Fede!Giuseppe
ok. funziona
perfetto,
lascio aperta la discussione non la metto come risolto, perchè son curioso di vedere anche la soluzione di Giuseppe,
che saluto e ringrazio ancora per avermi dato una mano anche lui in un'altra discussione.
cerco di apprendere ma rispetto a voi mi diletto a creare piccoli gestionali che mi alleviano il duro lavoro e di essere sempre in linea con le richieste da parte dell'azienda e dei committenti.
intanto B.W.
sto alla finestra a vedere e curiosare anche per la soluzione di Giuseppe.
Buon pomeriggio @vecchio frac;
non è perfetto, bisogna togliere Chr(10) dal primo Record calcolato ma ... ho finito le birre, quindi, operazione rimandata.Per attivare il Codice VBA, click sul "semaforo in F1".
Giuseppe
Allegati:
You must be logged in to view attached files.quindi per la soluzione mi servirà qualche tempo
Non c'è una data di scadenza, e tutte le idee sono interessanti, non ci sono soluzioni univoche e comunque si impara sempre qualcosa.
In sintesi
Si tratta di un approccio che coinvolge solo i metodi built in di VBA, mentre io ho mescolato funzionalità proprie di Excel (l'uso dei filtri, la gestione dirette delle Areas cioè di porzioni di intervallo). Il vantaggio di quell'approccio è che svincola il programmatore dal pensare agli oggetti dell'applicazione che ha sottomano: la conseguenza è che il metodo utilizzato potrebbe essere proposto, senza eccessive modifiche, anche per altri applicativi come per esempio Word. Lo svantaggio è che il codice diventa più lungo (ma non meno performante, se è scritto bene).
al vecchietto Giuseppe servirà diverso tempo, e diverse birre
Il vecchietto Giuseppe ha tutto il tempo che vuole. Sulle birre, se possibile, mi accodo
Per attivare il Codice VBA, click sul "semaforo in F1".
Neanche il tempo di scrivere il post precedente e tu hai già finito
bisogna togliere Chr(10) dal primo Record
Il codice è perfetto ed, essendo svincolato dagli oggetti di Excel, funzionerà perfettamente in qualsiasi condizione.
Per risolvere questo, propongo un sistema semplice prima dell'immissione in cella:Cells(x + 1, 6).Value = Mid$(Opz(1, x), 2)Ben fatto Giuseppe,
una domanda, e possibile estendere il concatena anche sulla colonna Subappalti?
a questo punto chiedo, e sono in debito con Vecchio Frac per una birra al chiosco sulle rive dell'Adige.
poi per Giuseppe cosa dire, grazie mille di cuore, aspettando anche l'estensione sulla colonna Subappalti
Comunque butto lì una sfidettina, il Select Case è superfluo, come può essere rimpiazzato? solo VBA, niente trucchi Excel.
e possibile estendere il concatena anche sulla colonna Subappalti?
Il codice di Giuseppe è sufficientemente flessibile da accettare fino a 8 codici gruppo.
Non è per niente difficile estendere la resa dei gruppi superiori al codice 3. Prova a mettere qualche codice 4 nella colonna del gruppo e poi aggiungi una riga come questa nel ciclo finale che si occupa di valorizzare il foglio:Cells(x + 1, 9).Value = Opz(4, x)Ecco, in colonna subappaltatori avrai le righe il cui gruppo è identificato dal 4.
Sul mio codice non ho ancora fatto alcuna modifica
Il mio progetto ha un altro difetto , si inchioda se non ci sono corrispondenze nell'elenco filtrato.
Allego la revisione del file, in cui ho esteso a un fantomatico gruppo 4 il recupero dei dati (il gruppo 4 viene inserito nella colonna del subappaltatore). Basta aggiungere il codice nell'array della variabile g nel suo For Each.
Allegati:
You must be logged in to view attached files.ho dovuto aggiungere anche
Case 4
For x = 1 To NrD
If Cells(y, 2) = DtX(x) Then
Opz(4, x) = Opz(4, x) & Chr(10) & Cells(y, 4).Value
End If
Next xsaluti,
mi e chiaro e semplice, il codice di Giuseppe,
il tuo, buon vecchio Frac. ancora devo finire di interpretarlo per adeguarlo ad altre eventuali soluzioni.
Ah ok, stavi ancora esaminando il codice con Select Case. Io l'ho eliminato e appena tutti pronti vi illustro la semplice modifica 🙂
ciao
quando avete finito io sono pronto eh!

quando avete finito io sono pronto
Hai pagato il biglietto?
Buona sera @vecchio frac;
rieccomi.Comunque butto lì una sfidettina, il Select Case è superfluo, come può essere rimpiazzato?
Sono d'accordo con Te, e ci mancherebbe altro, domani provo a togliere "Select case", che mi era servito per testare il Codice VBA sostituendolo con il valore del Campo "GRUPPO".
Voglio dire, molto probabilmente il riferimento in "Select case".
Cells(y, 3).Value
potrebbe essere tranquillamente sostituendo i vari "Case" con il Valore del "GRUPPO".Voglio dire anziché scrivere:
Case 1For x = 1 To NrDIf Cells(y, 2).Value = DtX(x) ThenOpz(1, x) = Opz(1, x) & Chr(10) & Cells(y, 4).ValueEnd IfNext xcredo si potrebbe scrivere:
For x = 1 To NrDIf Cells(y, 2).Value = DtX(x) ThenOpz(Cells(y, 3), x).Value = Opz(Cells(y, 3).Value, x) & Chr(10) & Cells(y, 4).ValueEnd IfNext x
o qualche cosa di questo tipo.Ma, gran premio Moto GP permettendo, preferisco testare questa ipotesi e aggiornarVi.
Buona serata.
Giuseppe
Ecco prima che finisce la sfida volevo sollevare un problema che mi è sorto usando le vostre soluzioni sul file originale con la userform.
Quando faccio la registrazione e richiamo il comando concatena(vostra soluzione)
Ci mette un eternità perché tutte le volte rielabora il foglio,
Quello che chiedevo, è possibile farlo funzionare solo sui dati inseriti nell'ultima registrazione senza che va a rielaborare il tutto e ricopiare i dati nel foglio giornale lavori?
Spero di aver spiegato bene.
Premesso che comunque la soluzione di Giuseppe ha il vantaggio di essere molto chiara e comprensibile ma è probabilmente più lenta della mia, che sfrutta il filtro e esegue pochi cicli di confronto (mi piacerebbe fare un test su qualche centinaio di migliaio di righe, per curiosità), in entrambi i casi tuttavia il codice riparte da zero e spazzola il range di dati come fosse la prima volta.
Si potrebbe aggiungere un campo finale di controllo nel foglio di Archivio, da marcare con una "x" quando la relativa riga è stata processata (cioè al termine dell'esecuzione della macro di concatenaggio) ed evitare così, durante l'esecuzione del codice, di considerarla.
Ti allego la mia revisione del file che tiene conto di questa nuova possibilità.
Se in colonna O di Archivio c'è una x, quella riga non verrà processata.Non ho messo mano al codice di Giuseppe ma tieni presente che qualunque soluzione adotti, devi essere consapevole di come funziona per poterla modificare e adattare alle tue esigenze.
Allegati:
You must be logged in to view attached files.potrebbe essere tranquillamente sostituendo i vari "Case" con il Valore del "GRUPPO".
Sì: con un semplice ciclo For.
credo si potrebbe scrivere:
Più semplice:
For y = 2 To NrC i = Cells(y, 3).Value For x = 1 To NrD If Cells(y, 2) = DtX(x) Then Opz(i, x) = Opz(i, x) & Chr(10) & Cells(y, 4).Value End If Next NextE quindi, per recuperare i valori, allo stesso modo:
Worksheets("Giornale_lavori").Select For x = 1 To NrD If Cells(x + 1, 2) = DtX(x) Then For i = 1 To 4 Cells(x + 1, i + 5).Value = Mid$(Opz(i, x), 2) Next End If NextNota anche come, elegantemente, si risolve in un colpo solo il problema de ritorno a capo all'inizio di cella.
Riallego il tuo file modificato.
Nota: non ho implementato in questo file l'ultima richiesta di Dodi.Allegati:
You must be logged in to view attached files.Buona sera @vecchio frac;
... mi piacerebbe fare un test su qualche centinaio di migliaio di righe, per curiosità ...
Dopo i 1.500 2.000 record, non ho dubbi:
ACCESSA mio modesto parere Excel non è un Database relazionare come ACCESS che richiede una programmazione più impegnativa ma poi ripaga sia in tempo di esecuzione che in possibilità di utilizzo delle "Relazioni".
Ma questa è solo una mia modesta opinione.A margine di quanto sopra, a meno di richieste di chiarimento, credo di aver concluso il mio contributo a questa Discussione; tanto è dovuto per consentire all'Ottimo @gianfranco55 che, giustamente, "scalpita"
quando avete finito io sono pronto eh!
per rientrare nella Discussione oppure ...
per una birra al chiosco sulle rive dell'Adige
Buona serata.
Giuseppe
per Vecchio Frac,
la soluzione con la X a fine ciclo mi piace,
e devo dire che il tuo codice concatena sembra che gira meglio,
mentre il codice di Giuseppe
per me è più comprensibile per il mio livello,
e mi è più facile da adattare alle mie esigenze future,
se mi posta anche la soluzione per risolvere il problema della rielaborazione di tutti i dati, per il mio livello di comprensione penso di capirlo meglio,
cmq terrò anche conto della formula di Gianfranco , che a mali estremi la uso manualmente,
grazie per la pazienza.
gainfranco
Dopo i 1.500 2.000 record, non ho dubbi: ACCESS
Finalmente qualcuno che la pensa come me!... Anch'io sono un Accessista convinto!
-
AutoreArticoli
