Newsgroup: it.comp.lang.visual-basic
Titolo: ottenere da vba in una cella excel unione di più celle di testo

Ciao a tutti,
innanzitutto i soliti complimenti di rito, sono il più delle volte
solo una questione di forma, ma questa volta, vi assicuro, sinceri!!
Ho cominciato da un paio di mesi a lavorare con il vba per cercare di
snellire il lavoro manuale stando però attenti a nn dimenticare
l'usabilità del prodotto poichè i futuri utenti masticano molto poco
di pc ( e per cominciare bisogna andargli incontro... poi si vedrà!!)
Per ora, vediamo se riesco a farmi capire io con voi...
Premessa:
creazione di un modulo d'ordine.
lavoro con alcune form di excel che progressivamente raccolgono i dati
(puntando a elenchi già pronti o acquisendo nuovi dati di volta o in
volta) e li riportano su un foglio di excel dove è predisposto il
modulo d'ordine.
form scelta articoli.
L'idea di partenza per la scelta dell'articolo era una combobox in una
form: si sceglieva l'articolo, si controllava la scelta su una listbox,
si inseriva la quantità e la si rimandava al modulo d'ordine di cui
sopra.
Purtroppo l'elevato numero di articoli (circa 10000) nn mi rendeva la
vita facile...
allora ho pensato a 3 (o 4) combobox che filtrassero man mano l'elenco
e mi facessero arrivare a una scelta con un sicuramente minor numero di
articoli in una listbox: doppio clik sulla riga interessata,
inserimento della quantità e fatto.
ES. di articolo da scegliere per compilare modulo d'ordine:
auto 5porte rossa con abs
auto 3porte rossa senza abs
auto 3porte blu senza abs
moto 4rapporti rossa con casco
moto scooter verde con casco
camion motrice giallo con navigatore
...
da questo punto, vista l'enorme quantità di articoli, ho diviso:
combobox 1: auto
                    moto
                    camion
combobox2, se cmb1=auto: 5porte
                                         3porte
combobox3, se cmb2=3porte: rossa
                                            blu
e i risultati, che si modificano ogni volta, in una listbox a 3 colonne
cmb1 = auto
listbox =  5porte rossa con abs
              3porte rossa senza abs
              3porte blu senza abs
se cmb2= 3porte
listbox = 3porte rossa senza abs
             3porte blu senza abs
e via discorrendo.
Per arrivare a questo ho scritto sull'evento click ad es. della cmb1
Private Sub ComboBox1_Click()
Worksheets("nome_foglio__incui_ho_gliarticoli").Range("zona_fogliolavoro").ClearContents
                            'zona in cui incollo la selezione fatta con
la combo
Dim CL As Object
Worksheets("nome_foglio__incui_ho_gliarticoli").Select
For Each CL In
Worksheets("nome_foglio__incui_ho_gliarticoli").Range("incui_cisono_leparole_auto,moto,camion")
                                 'zona in cui deve controllare la
corrispondenza del valore in combo
If CL = ComboBox1.Text Then
Range(CL.Offset(0, 1), CL.Offset(0,2)).Select
                            'quando i valori corrispondono seleziona
quelli vicino e copiali
Selection.Copy
Dim iRow As Integer                     'trovo una zona vuota del
foglio, ad es. nella colonna 10
iRow = 1
While Cells(iRow, 1).Columns(10).Value <> ""
iRow = iRow + 1
Wend
Selection.Copy Cells(iRow, 1).Columns(10)               ' e incollo
quello che ho copiato
End If
Next
ListBox1.RowSource = "zona_incui_ho_incollato"
End Sub
come avrete capito il mio database articoli adesso è diviso in più
colonne (almeno le 3 che mi servono per le combo).
Quando la prima trova corrispondenza copia le colonne al fianco e le
incolla in un'altra zona del foglio (quindi ad altre almeno 3 colonne)
a cui la listbox poi punta!
dunque nella listbox ho 3 colonne; da qui il problema che per lo più
deriva dalla poca flessibilità nella formattazione dello strumento
listbox: i valori sono graficamente molto distanti tra loro....
allora mi chiedevo: se riesco a far puntare la listbox nn su tre
colonne ma su una sola, potrei fare la list in questione a una sola
colonna e quel che mi apparrebbe sarebbero semplici righe...
e dunque dovrei fare in modo che dopo aver pescato nell'elenco
originario e copiato e incollato, quello che è stato incollato vada in
un'altra cella che unisce il testo delle altre tre celle... e a questo
elenco, ora da una sola colonna, punterebbe la listbox...
ma qual è il codice per fargli fare questa cosa?
nn posso certo scrivere:
range("cella_incui_vogliol'unione").value= range("primacella") &
range("secondacella") & range ("terzacella")
per ogni cella che potrebbe servire... sarebbero tantissime...
ricapitolando vorrei capire se si può scrivere un codice che faccia
scrivere in un'unica cella un testo, unione di testo di più celle. E'
che questa cosa sia in un range piuttosto elevato di celle...
es.
A1 B1 C1  --->  D1= TESTO DI A1 + TESTO DI B1 + TESTO DI C1.
A2 B2 C2  --->  D2= TESTO DI A2 + TESTO DI B2 + TESTO DI C2
e così via...
grazie a tutti,
scrivendo la domanda, mi sono accorto che dà la sensazione di nn
essere una cosa complicata... ma diamine, nn mi raccapezzo più...
posso contare su di voi???
ciao e buona serata!
mi sono dilungato un pò, ma magari avendo più info a disposizione
potete capirmi un pò di più
grazie ancora!!!
De

<mega cut>
ricapitolando vorrei capire se si può scrivere un codice che faccia
scrivere in un'unica cella un testo, unione di testo di più celle. E'
che questa cosa sia in un range piuttosto elevato di celle...
es.
A1 B1 C1  --->  D1= TESTO DI A1 + TESTO DI B1 + TESTO DI C1.
A2 B2 C2  --->  D2= TESTO DI A2 + TESTO DI B2 + TESTO DI C2
e così via...
**************************************************
Public Sub m()
    Dim lng As Long
    With Worksheets("Foglio1")
        lng = .Range("A" & Rows.Count).End(xlUp).Row
        .Range("D1").Value = "=A1&B1&C1"
        .Range("D1").AutoFill Destination:=Range("D1:D" & lng)
        .Range("D1:D" & lng).Copy
        .Range("D1:D" & lng).PasteSpecial Paste:=xlPasteValues, 
Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        Application.CutCopyMode = False
    End With
End Sub
Sostituisci a Foglio1 il nome del tuo foglio.
<cut>
**************
scrivendo la domanda, mi sono accorto che dà la sensazione di nn
essere una cosa complicata... ma diamine, nn mi raccapezzo più...
***********************************************
Difficile farlo per chiunque.....
-- 
---------------------------
Mauro Gamberini
http://www.riolab.org/
 

Mauro Gamberini ha scritto:

ma no, dai....
son sicuro che per voi è una passeggiata ;))
a parte gli scherzi, grazie Mauro soprattutto per la perdita di tempo
che vi ho creato...
provo e vi faccio sapere!
;)

Dede ha scritto:

allora... continuando a ringraziare vi annuncio che il codice funziona!
ho solo bisogno di un altro aiutino: devo dare uno spazio tra A1 e B1 e
tra B1 e C1 quando questi vanno in D. Così com'è il risultato, pur
funzionando, risulta tutto attaccato...
ho provato a "inventarmi" qualcosa ma nn sono ancora arrivato a niente
(spazi come nelle textbox, fargli vedere anche una cella vuota tra le
tre, mettere gli "@" chissà poi perchè.. :)) )
grazie ancora ragazzi... ;)

         .Range("D1").Value = "=A1&B1&C1"
a:
         .Range("D1").Value = "=A1&" "&B1&" "&C1"


 
http://www.riolab.org/
urca... era una delle tante prove (casuali) che avevo fatto...
ma purtroppo nn va... mi dice:
errore di compilazione
previsto: fine istruzione
mi colora tutta la riga di codice in rosso e mi seleziona questo
tratto:  "&B1&"
ho provato a togliere lo spazio tra le virgolette (???)
ma ovviamente sbaglia e  fa una cosa del tipo: testoA1&B1&testoC1
...

Dede ha scritto:

eccomi!!!
      .Range("D1").Value = "=A1&"" ""&B1&"" ""&C1"
così mi funziona....
grazie mauro, sei grande! senza di te nn sarei mai riuscito ad
arrivarci!
a questo punto riesco a proseguire nel mio difficile cammino verso la
comprensione....
però conto sul fatto che potrai/potrete ancora avere la voglia di
sopportarmi!!!
grazie grazie grazie
De

Scusa, errore stupido mio...


a questo punto riesco a proseguire nel mio difficile cammino verso la
comprensione....
però conto sul fatto che potrai/potrete ancora avere la voglia di
sopportarmi!!!
***************************************************
Ti ricordo che per Excel ed il suo vba esiste
uno specifico ng:
microsoft.public.it.office.excel


Mauro Gamberini ha scritto:

:))))
abbiamo scritto quasi insieme... io c'ho messo 1ora, tu 1 secondo :)))
grazie mauro, ancora!

Sicuramente mi rivolgerò al gruppo specifico...
almeno nn faccio confusione! ;)
Intanto però credo di fare una domanda pertinente anche al vb.
e' possibile dividere l'elenco di una listbox con delle semplici righe??