split e concatena con condizione
Hai un problema con Excel? 
split e concatena con condizione
di blank (utente non iscritto) data: 23/09/2015 17:17:16
chiedo scusa, ripropongo la richiesta perchè (non so come) è stata incorporata in un altro post di questo forum.
vi scrivo per chiedere il vostro prezioso aiuto in relazione ad una estrazione di dati.
Entrando nel merito ho un range di celle es a1:a30 foglio1 nelle quali ho dati disposti in coppia es.
alfa1 |beta1|alfa2 |beta2
cod10 | 1,2,3|cod18|3,11,8 ecc
cod17 | 1,2,3|cod12|3,4,9 ecc
cod13 | 1,2,3|cod11|3,4,8 ecc
ecc
La mia esigenza è quella di copiare in un'unica cella di un altro foglio2 i dati concatenati relativi alle sequenze alfa beta, ripetendo alfa per ogni valore in beta separato da virgola, questo per tutto il range fino all'ultima cella valorizzata.
Quanto sopra deve avvenire rispettando una sintassi presica, per spiegarmi meglio farò un esempio del risultato da ottenere:
nella cella a1 foglio2 (cod10|cod10)(|)(||1)§(cod10|cod10)(|)(||2)§(cod10|cod10)(|)(||3)§(cod18|cod18)(|)(||3)§(cod18|cod18)(|)(||11)§(cod18|cod18)(|)(||8)§
nella cella 2 foglio2 (cod17|cod17)(|)(||1)§(cod17|cod17)(|)(||2)§(cod17|cod17)(|)(||3)§(cod12|cod12)(|)(||3)§(cod12|cod12)(|)(||4)§(cod12|cod12)(|)(||9)§
ecc
So che è un pò complicato, almeno per me ma per voi immagino sia gioco da ragazzi
Spero di essermi spiegata bene
Attendo con fiducia una soluzione
grazie
A presto
di alfrimpa data: 23/09/2015 18:07:46
Ciao Blank
Onestamente non ho capito niente.
Prova ad allegare un file di esempio con la situazione di partenza ed il risultato desiderato.
Alfredo
di blank (utente non iscritto) data: 23/09/2015 19:12:30
mi rendo conto, ho inserito un file di esempio come richiesto.
sono dati esemplificativi
grazie
di Cucù data: 23/09/2015 19:51:17
Sono previste colonne vuote a partire da sinistra verso destra?
Se si come devono essere valutate?
Cucù
di blank (utente non iscritto) data: 23/09/2015 20:55:31
si, il range di valori va inizia con a2:ad2 segue a3:ad3 ecc e prosegue fino a quando la tabella è popolata dall'alto verso il basso.
Ogni coppia alfa/beta deve essere valorizzata quindi in pratica in fase di lettura sx/dx non appena si incontra una cella vuota finisce il processamento del primo range e inizia il secondo a3:ad3 poi il terzo a4:ad4 ecc
Avevo pensato ad una variabile (che ho omesso per non complicare le cose) ovvero se viene operata una scelta su tutti gli elementi di un insieme beta la cella potrà essere lasciata vuota, il corrispondente alfa andrà comunque concatenato con dati presi da un altro foglio dove sono elencati i valori beta per ogni singolo componente alfa.
Questo cambierebbe la logica del processamento nelle fasi intermedie in quanto non sarebbe più la prima cella vuota a determinare il passaggio al secondo range ma la consecuzione di due celle vuote. Tutto ciò sarebbe troppo bello per essere vero!
Spero di aver chiarito
grazie
di Cucù data: 23/09/2015 22:13:31
cit"So che è un pò complicato, almeno per me ma per voi immagino sia gioco da ragazzi "
Prova il file allegato... Ma in effetti era proprio come dicevi tu...un gioco da ragazzi
di Cucù data: 23/09/2015 22:23:26
Piccola correzione... con tutti quei simboli e a quest'ora... perdonatemi...
Allegato "BIS"
di Cucù data: 23/09/2015 22:40:48
Piccola correzione... con tutti quei simboli e a quest'ora... perdonatemi...
Allegato "BIS"
PS
cit"Avevo pensato ad una variabile (che ho omesso per non complicare le cose) ovvero se viene operata una scelta su tutti gli elementi di un insieme beta la cella potrà essere lasciata vuota, il corrispondente alfa andrà comunque concatenato con dati presi da un altro foglio dove sono elencati i valori beta per ogni singolo componente alfa"
Spero concorderai con me che non si capisce un granchè...
di blank (utente non iscritto) data: 23/09/2015 23:01:35
che dire...spettacolare, complimenti.
Anche il nome scelto non è male, "strana concatenazione"
Fa concettualmente il suo lavoro ma dovendo cambiare le coordinate delle celle (cosa che ho provato) non si comporta come vorrei, il range di cui parlavo nel foglio dei dati iniziale è k3:ad3 in a3:j3 ci sono altri dati, la prima cella del foglio di destinazione è j2
Ora se cambio le cordinate come postasto nella sezione codice, lo script concatena anche i valori precedenti range a:j invece deve procedere da sx/dx:
k3:ad3
k4:ad4
k5:ad5 ecc
dove ho sbagliato nella modifica?
grazie ancora
Sub Strana_Concatenazione()
Dim Ur As Long, Uc As Long
Dim I As Long, U As Long, X As Long
Dim C As Range
Dim Beta As Variant, Num As Variant
Application.ScreenUpdating = False
Sheets("Foglio2").Cells.ClearContents
Ur = Sheets("Dati").Range("k" & Rows.Count).End(xlUp).Row
Uc = Sheets("Dati").Cells(3, Cells.Columns.Count).End(xlToLeft).Column
For U = 1 To Uc Step 2
For X = 2 To Ur
Beta = Cells(X, U + 1)
Num = Split(Beta, ",")
For I = LBound(Num) To UBound(Num)
Sheets("FOGLIO2").Cells(X - 1, 1).Value = Sheets("FOGLIO2").Cells(X - 1, 1).Value & "(" & Cells(X, 1) & "|" & Cells(X, 1) & ")(|)(||" & Num(I) & ")§"
Next I
Next X
Next U
Application.ScreenUpdating = True
MsgBox "Lavoro Finito!"
End Sub |
di blank (utente non iscritto) data: 23/09/2015 23:16:42
cit "cit"Avevo pensato ad una variabile (che ho omesso per non complicare le cose) ovvero se viene operata una scelta su tutti gli elementi di un insieme beta la cella potrà essere lasciata vuota, il corrispondente alfa andrà comunque concatenato con dati presi da un altro foglio dove sono elencati i valori beta per ogni singolo componente alfa"
Spero concorderai con me che non si capisce un granchè..."
...dopo il favore concordo su tutta la linea! Scherzi a parte, cerco di spiegarmi meglio (se riesco), la valorizzazione dei campi beta è riferita a delle scelte, prendiamo l'esempio di alfa1 il quale ha come valori beta1 disponibili 1,2,3,4,5,6 il dato imputato nella cella potrebbe comprendere tutti i valori o solo alcuni es 1,2,3 ma se si ipotizza la scelta di tutti 1,2,3,4,5,6 avevo pensato di lasciare la cella vuota che sta a significare all.
I valori di ogni singolo alfa e i relativi beta sono elencati in un foglio a parte così ho pensato che se la scelta è tutti lo script dovrà andare a scegliere tutti i valori corrispondenti a quel codice alfa presenti nel foglio specifico ed effettuare la concatenazione con tutti.
La sintesi non è il mio forte.
grazie
di Cucù data: 24/09/2015 08:21:49
cit "dovendo cambiare le coordinate delle celle (cosa che ho provato) non si comporta come vorrei
Ovvio che non fa quello che vuoi... è per questo che si chiede un file di esempio sovrapponibile a quello reale.
Se ho tempo guardo dopo intanto tu diverti a provare, sbagliando si impara.
Cucù
di Cucù data: 24/09/2015 08:34:56
PS Allega il file di esempio aderente all'originale con il risultato atteso_
di Cucù data: 24/09/2015 09:35:39
Ecco spero di aver ricostruito lo scenario "corretto"!
Per quanto riguarda la storia della variabile apri un altra discussione e specifica bene il problema.
Cucù
Option Explicit
Sub Strana_Concatenazione()
Dim Ur As Long, Uc As Long
Dim I As Long, U As Long, X As Long
Dim Beta As Variant, Num As Variant
Application.ScreenUpdating = False
Sheets("Foglio2").Range("D:D").ClearContents
Ur = Sheets("Dati").Range("K" & Rows.Count).End(xlUp).Row
Uc = Sheets("Dati").Cells(3, Cells.Columns.Count).End(xlToLeft).Column
For U = 11 To Uc Step 2
For X = 3 To Ur
Beta = Cells(X, U + 1)
Num = Split(Beta, ",")
For I = LBound(Num) To UBound(Num)
Sheets("Foglio2").Cells(X - 1, 10).Value = Sheets("Foglio2"). _
Cells(X - 1, 10).Value & "(" & Cells(X, U) & "|" & _
Cells(X, U) & ")(|)(||" & Num(I) & ")""
Next I
Next X
Next U
Application.ScreenUpdating = True
MsgBox "Lavoro Finito!"
End Sub |
di blank (utente non iscritto) data: 24/09/2015 17:26:02
ottimo lavoro, grazie cucù.
ho riadattato lo script in base alle mie esigenze e fa i suo dovere.
Solo una curiosità, quando vengono concatenati i dati nel foglio2 vorrei che ciò avvenisse nella cella successiva alla riga di intestazione (J2) questo è possibile? Al momento sto facendo eseguire il tutto su un foglio di appoggio nascosto ma se posso ovviare a questa ulteriore passaggio...
Per la questione della variabile, dato che è un opzione, posso continuare valorizzando ogni campo, quindi eventualmente lo potrò fare in seguito.
Per completezza, ho fatto un'aggiunta al tuo script in quanto ho notato che se è attivo il foglio di destinazione (vuoto) non da risultati ma se è attivo il foglio di origine dei dati la concatenazione viene effettuata, inoltre il range nella stringa
Sheets("DatiAppoggio").Range("D:D").ClearContents comporta che se lanciato più volte lo script anzichè sovrascrivere i dati li somma, quindi ho dato "ClearContent" nel range di destinazione, anche perchè mi cancellava una colonna valorizzata.
Come hai detto, ho provato e riprovato, sbagliato ma poi tutto ok
Grazie per l'aiuto
Sub Strana_Concatenazione()
Dim Ur As Long, Uc As Long
Dim I As Long, U As Long, X As Long
Dim Beta As Variant, Num As Variant
Application.ScreenUpdating = False
Sheets("Dati").Select 'aggiunto
Sheets("DatiAppoggio").Range("j2:j5000").ClearContents 'modificato
Ur = Sheets("Dati").Range("K" & Rows.Count).End(xlUp).Row
Uc = Sheets("Dati").Cells(2, Cells.Columns.Count).End(xlToLeft).Column
For U = 11 To Uc Step 2
For X = 2 To Ur
Beta = Cells(X, U + 1)
Num = Split(Beta, ",")
For I = LBound(Num) To UBound(Num)
Sheets("DatiAppoggio").Cells(X - 1, 10).Value = Sheets("DatiAppoggio"). _
Cells(X - 1, 10).Value & "(" & Cells(X, U) & "|" & _
Cells(X, U) & ")(|){||" & Num(I) & ")§" 'modificato
Next I
Next X
Next U
Application.ScreenUpdating = True
MsgBox "Link Creato"
End Sub
|
di Cucù data: 24/09/2015 17:50:32
Ottimo
Vuoi Approfondire?