Newsgroup: it.comp.lang.visual-basic
Titolo: [VBA] Aggiornare Codice dinamicamente

Torno sull'argomento, visto che non eravamo riusciti ad approfondire bene 
l'argomento.
Quello che mi piacerebbe fare č semplicissimo:
Ho una form, inserisco alcuni valori dentro un TextBox che mi creano una 
stringa.
A questo punto vorrei che questa stringa venisse aggiunta, all'interno del 
codice della Form stessa dopo un certo carattere speciale che pensavo di 
inserire io a piacere.
In pratica bisognerebbe controllare dall'inizio il codice e una volta che 
viene identificato questo carattere speciale copiare dopo di esso la stringa 
che č stata calcolata.
A dire č molto semplice, ma per i fatti credo non sia cosě facile.
Avete idee.
Grazie e Buona Giornata 

 A dire č molto semplice, ma per i fatti credo non sia cosě facile.
Non so, ma non credo che VBA abbia un comando per interpretare il codice...
Magari se si tratta di campi di ricerca ecc. puoi vedere di appoggiarti a
un file di testo o simile.
-- 
DBMS Firebird
VB6 + Ado

 un file di testo o simile.
Cosa intendi con campi di ricerca?
Combox, ListBox e queste cose qui.
Purtroppo questo carattere speciale, dopo il quale andrebbe incollata la 
stringa purtroppo a volte si trova dentro procedure diverse da quelle citate 
sopra.
Altrimenti dovrei far compilare i Combobox prendendo le informazioni da un 
Db ma a questo punto il tutto diventerebbe molto ma molto più complicato! 

 Db ma a questo punto il tutto diventerebbe molto ma molto più complicato!
Quindi questo ti servirebbe solo per riempire dati in delle comboBox?
In tal caso se aggiungi gli elementi in un file e gli carichi da li
dovrebbe andarti bene.
In ogni caso dovresti specificare cosa devono fare queste istruzioni
aggiunte, perchè per quanto ne so non c'è modo di fargli interpretare
istruzioni, quindi devi farlo a mano tu in qualche modo.
Mi pare in vba ci fosse una sorta di Evaluate, ma non so se fa quel che
chiedi:
http://groups.google.com/groups?hl=it&q=vba%20evaluate&btnG=Cerca&lr=lang_it&sa=N&tab=wg


 interpreti la stringa.
[cut]
Mi spiego meglio. Postando del codice per farvi capire quello che faccio 
adesso:
---------CODE-------------------
'Per popolare un combox ordinato uso il seguente codice:
Private Sub Inserisci_Marca()
Dim sColl As New Collection
Dim f As Long
    InsertInCollection sColl, "A"
    InsertInCollection sColl, "B"
    InsertInCollection sColl, "H"
  For f = 1 To sColl.Count
        MultiPage1.Tecnologia.ComboBox9.AddItem sColl.Item(f)
    Next f
End Sub
'Con
Private Sub InsertInCollection(aColl As Collection, vValue As Variant)
Dim f As Long
    For f = 1 To aColl.Count
        If aColl.Item(f) > vValue Then
            aColl.Add vValue, , f
            Exit Sub
        End If
    Next f
    aColl.Add vValue
End Sub
'A questo punto quello che sono costretto a fare è la seguente cosa:
Private Sub ComboBox9_Click()
If MultiPage1.Tecnologia.ComboBox9.Text = "A" Then
  MultiPage1.Tecnologia.ComboBox1.Text = "Pippo"
    MultiPage1.Tecnologia.TextBox7.Text = "10,4
  MultiPage1.Tecnologia.TextBox21.Text = "110,78"
   CheckBox6.Value = Checked
    CheckBox7.Value = Checked
    CheckBox8.Value = Checked
    CheckBox21.Value = Checked
End If
If MultiPage1.Tecnologia.ComboBox9.Text = "B" Then
    MultiPage1.Tecnologia.ComboBox1.Text = "Pluto"
    MultiPage1.Tecnologia.TextBox7.Text = "10,6"
    MultiPage1.Tecnologia.TextBox21.Text = "106,04"
    CheckBox6.Value = Checked
    CheckBox7.Value = Checked
    CheckBox8.Value = Checked
    CheckBox21.Value = Checked
End If
'....
End Sub
E ovviamente ad ogni lettera che aggiungo nella collection devo manualmente 
compilare questo campi click.
Ed è per questo che stavo cercando un modo per evitarlo. Anche perchè questi 
campi click leggermente diversi sono 6, e le lettere che si possono inserire 
sono molte. E con il metodo che stavo cercando di fare io, avrebbe permesso 
l'inserimento di nuove lettere anche all'utente finale! 

 l'inserimento di nuove lettere anche all'utente finale!
Se ho capito bene č il classico caso dove usare una tabella DB o un files
d'appoggio.
Permetti all'utente di inserire roba nuova e la inserisce in questa
tabella, o se proprio non vuoi usarla in un file di testo campizzato con
una type (quindi aperto for Random)
Poi i dati li ri-carichi da lě.



Il problema, non è tanto per l'inserimento delle possibili lettere nella 
collection, che in effetti potrebbero essere prese da un file di testo. Ma 
come diavolo potrei fare dinamicamente la parte degli If ..... 

 come diavolo potrei fare dinamicamente la parte degli If .....
Partendo da questo:
Private Sub ComboBox9_Click()
If MultiPage1.Tecnologia.ComboBox9.Text = "A" Then
  MultiPage1.Tecnologia.ComboBox1.Text = "Pippo"
    MultiPage1.Tecnologia.TextBox7.Text = "10,4
  MultiPage1.Tecnologia.TextBox21.Text = "110,78"
   CheckBox6.Value = Checked
    CheckBox7.Value = Checked
    CheckBox8.Value = Checked
    CheckBox21.Value = Checked
End If
Type MioRec
 Combo1  as string *1' qui salvi "A"
 Combo2  as string *10' qui salvi "pippo"
 Tecn1  as currency'qui salvi 10,4
 Tecn2  as currency'qui salvi 110,78
 Check1 as byte' qui salvi se checked=0 o 1
 Check2 as byte' qui salvi se checked=0 o 1
 Check3 as byte' qui salvi se checked=0 o 1
 Check4 as byte' qui salvi se checked=0 o 1
end Type
Questo è quello che memorizzerai in un file di testo con:
Dim Pippo as MioRec
with MioRec
	.combo1=ComboBox9.Text
	.combo2=ComboBox1.Text
	.tecn1=val(TextBox7.Text)
	.tecn2=val(TextBox21.Text)
	.check1=val(CheckBox6.Value)
ecc.
end with
A questo punto salvi il record su file


 with MioRec
With Pippo ovviamente


 A questo punto salvi il record su file
E come farei a salvare il record?


 E come farei a salvare il record?
Nel tuo programma darai la possibilità di salvare quello che ha scritto
aggiungendo o modificando quel record.
Lo fai (con una tabella) con una INSERT INTO o UPDATE (per la modifica)
Per un file di testo lo fai con una Print,Put a seconda.
Ti consiglio una tabella che la gestisci molto meglio, e di guardarti con
una guida i comandi base per accedere alle tabelle.


 una guida i comandi base per accedere alle tabelle.
Sei stato molto ma molto gentile,ma per un utente non professionista come 
me, ti devo ammettere che la vedo molto ma molto difficile. Non credo che ne 
sarò mai in grado! 

 una guida i comandi base per accedere alle tabelle.
Non hai una mail privata od un contatto msn, che volevo chiederti ancora 
qualche aiutino, evitando di postare troppo codice sorgente qui su un news 
pubblico?
Stavo pensando e se creassi per ogni modello un file differente in questo 
modo?
Private Sub CommandButton1_Click()
    Open "c:\Downloads\" & TextBox1.Text & ".txt" For Output As #1
    Print #1, TextBox1.Text, ",", TextBox2.Text, ",", TextBox3.Text, ",", 
TextBox4.Text, ",0, 0, 0, 0;"
    Close #1
End Sub
Ho creato una form di prova con 4 textbox per inseire la stringa A, pippo, 
valore1, valore2
In questo modo il file si chiamerebbe A.txt
e conterrebbe
A             ,             pippo         ,             13,5          , 
144,2         ,0, 0, 0, 0;
ed un eventuale secondo file conterrebbe (B.txt)
B, pluto, 14.5, 455.6,0,0,0,0;
Adesso bisognerebbe capire come popolare i combobox con tutti i valore A, B 
, ...
e una volta che l'utente ha selezionato A opp B opp C fargli compilare in 
automatico gli altri TextBox o Combobox e fargli spuntare o meno i CheckBox

 automatico gli altri TextBox o Combobox e fargli spuntare o meno i CheckBox
Sub CaricaDati (Selezione as string)
  Dim TmpVet () as string, Appo as string
  Dim PathFile as string
  Selezione=ucase(selezione)
  PathFile="c:\Downloads\" & Selezione & ".txt"
  if dir(pathfile)="" then exit sub'non trovo il file
  Open pathfile for input as #1
  lineInput #1,appo
  TmpVet=split(appo,",") 'attento a non usare la virgola nei campi,
altrimenti usa un altro carattere tipo "#"
  combo1.additem tmpvet(0)
  combo2.additem tmpvet(1)
  check1.value= tmpvet(2)
ecc.
end Sub


 altrimenti usa un altro carattere tipo "#"
Ti consiglio di creare il file cosě:
Print #1, TextBox1.Text, "|", TextBox2.Text, "|", TextBox3.Text, "|",
TextBox4.Text, "|0|0|0|0"
Ovviamente senza spazi


"Andrea" <nos...@invalid.invalid> ha scritto nel messaggio 
news:1e6mb9128vlcx.h...@40tude.net...

So che ti sto rompendo all'infinito, ma cerchiamo un attimo di procedere per 
gradi, perchč non č che ci capisca moltissimo.
Allora io a questo punto ho dentro una cartella del mio computer i file di 
testo
A.txt
B.txt
C.txt
ecc...
La prima cosa che devo fare č popolare un ComboBox con il nome del file. 
Sarebbe meglio che il combobox restasse ordinato in ordine alfabetico, per 
non metterci un secolo per cercare il nome voluto.
Questo come lo faccio? 

 Questo come lo faccio?
Una cosa del genere:
SearchFile="C:\downloads\*.txt"
      appo = Dir(searchfile)
      Do Until appo = ""
	combo.additem left(appo,1) 'verifica quello che hai in appo ed estrai il
nome
        appo = Dir
      Loop


      Loop
ma appo,1 indica la prima posizione. Ovvero la prima cosa che trova prima 
della prima   |   ?
No aspetta c'è qualche cosa che non va o meglio che non capisco.
Io pensavo di lanciare (al click del combobox)la funzione CaricaDati ("il 
nome del file")
Ed il nome del file lo deve andare a leggere nel combobox che per prima cosa 
vorrei caricare. Quindi come faccio ad usare appo e queste cose del genere, 
visto che non sono state definite.
Io all'inizio ho solo tanti file
A.txt
B.Txt
e basta.
Dove sbaglio?

"Andrea" <nos...@invalid.invalid> ha scritto nel messaggio 
news:1ic88ptuxd0so.x...@40tude.net...

Ho provato ad inserire questo
'Tentativo di popolare il ComBox con il nome dei file trattati
        Dim SearchFile As String, Appo As String
        SearchFile = "C:\Downloads\*.txt"
        Appo = Dir(SearchFile)
        Do Until Appo = ""
        MultiPage1.Orientamento.ComboBox4.AddItem Left(Appo, 1) 'verifica 
quello che hai in appo ed estrai il nome
        Appo = Dir
        Loop
Purtroppo pero' mi prende solamente il primo carattere del nome del file. Se 
metto (Appo, 10), rischio che mi prenda anche il .txt che non mi interessa.
E se gli volessi far leggere la prima posizione all'interno del file prima 
di | che contiene con esattezza solamente la stringa voluta? 

 di | che contiene con esattezza solamente la stringa voluta?
Allora credevo i files si chiamassero A.txt, in tal modo di prendi il nome
del file che è anche il tuo valore per riempire la combo.
Una volta che dalla tua combo scegli A o B o quello che vuoi, vai ad aprire
il file relativo (che sarà path + combo1.itemselezionato + .txt)
E riempi tutti i vari campi (combo e check) leggendo dal file.
Ti merita dare un nome "sensato" ai file, e per quello che devi fare
sicuramente A.txt, B.txt è il più comodo, anche perchè la dir te li
dovrebbe dare in ordine già alfabetico.
Quindi se puoi usa come nome del file lo stesso valore del primo campo
nella combo (o al limite Aquellochevuoi.txt, Bquellochevuoi.txt) in modo da
avere una corrispondenza diretta e univoca fra elemento della combo e nome
del file.
Se invece non usi A e B ma hai nomi più complessi, devi prima aprire ogni
file per prendere la prima posizione, magari mettendo ogni elemento in una
matrice con struttura
matrice(0,x)=NOME FILE .txt
matrice(1,x)=Primo elemento (il tuo A,B ecc)
A questo punto devi ordinarla (cercando un algoritmo con google o
scrivendolo tu).
Quando clicki sulla combo devi aprire il file relativo ricercando A,B ecc
nella matrice.
Ma il tutto si complica forse inutilmente. Tanto che ti converrebbe usare
un solo files e non uno per ogni tipologia.



Si scusami hai ragione tu, avevo messo A e B solo per semplificare la 
lettura, ma in realtà il nome del file oppure la prima posizione del file 
(0) contengono il nome dei comuni italiani che è di lunghezza variabile.
Mi va bene usare un file per ogni comune. Ma vorrei che il combobox mi 
caricasse la prima posizione che trova dentro al file. Chiamandosi il primo 
campo allo stesso modo del nome file, dovrebbero anche restare già ordinati.
Per esempio
Milano.txt
Roma.txt
Torino.txt
ecc....
(Sono tutti di Lunghezza Variabile)
Dentro il file c'è
Milano | valore1 | valore2 ....
Roma | valore1 | .....
Torino | valore 1 | .....
Non vorrei incasinarmi il tutto con una matrice. A me servirebbe soltanto 
che ogni file venisse aperto, letta la prima posizione e compilato il 
combobox.
Questo per l'inizializzazione del ComboBox.
Poi all'evento click ho già assegnato la lettura dati che mi hai dato tu 
ieri. Purtroppo questa funziona solamente se nel combobox trova COMUNE e non 
ovviamente COMUNE.tx
Dai ce l'hai quasi fatta a far capire ad un neofita come me, questa cosa, 
manca solo l'ultimo sforzo. 


Ho provato ad inserire questo
            Dim SearchFile As String, Appo As String
        Dim TmpVet() As String
        SearchFile = "C:\Downloads\*.txt"
        Appo = Dir(SearchFile)
        Do Until Appo = ""
         Open SearchFile For Input As #1
         Line Input #1, Appo
        TmpVet = Split(Appo, "|")
        ComboBox4.AddItem TmpVet(0)
        Appo = Dir
        Close #1
        Loop
Ma purtroppo c'è qualche cosa che non funziona, e lanciandolo 
all'inizializzazione non mi partire nemmeno la Form 

 manca solo l'ultimo sforzo.
Per caricare la combo una volta che hai Appo puoi fare
Dim ComboName as string
if len(appo)>4 then
  ComboName=left(appo,len(appo-4))'toglie gli ultimi 4 caratteri
endif
Oppure
ComboName=replace(ucase(appo),".TXT","")'cerca ".TXT" e lo sostitui con ""
In questo modo ti dovrebbe tirar fuori il nome corretto ogni volta.


 all'inizializzazione non mi partire nemmeno la Form
Metti un blocco (F9) nel Do Until....
E vedi cosa ti tira fuori Appo.
Sicuramente dovrai fare al posto di questo:
Open SearchFile For Input As #1
questo
Open "C:\Downloads\" & appo For Input As #1
Perchè appo ti tira fuori Milano.txt e non "C:\Downloads\Milano.txt"
Comunque usa il debug mettendo blocchi con F9 prima delle istruzioni e vai
avanti passo/passo con F8 e vedrai che risolverai molti problemi.


         TmpVet = Split(RecComune, "|")
Giusto perchè Appo lo usi per fare le dir.
Comunque usa nomi variabili significativi, Appo l'avevo messo lì per
rapidità, FileComune sarebbe più appropriato per capire subito a cosa
serve.


  ComboName=left(appo,len(appo-4))'toglie gli ultimi 4 caratteri
Grazie ho risolto in questo modo:
Dim SearchFile As String, Appo As String
        Dim ComboName As String
        SearchFile = "C:\Studio_Ambientale\Baricentri\*.txt"
        Appo = Dir(SearchFile)
        Do Until Appo = ""
            If Len(Appo) > 4 Then
            ComboName = Left(Appo, Len(Appo) - 4) 'toglie gli ultimi 4 
caratteri
            End If
          MultiPage1.Orientamento.ComboBox4.AddItem ComboName 'verifica 
quello che hai in appo ed estrai il nome
        Appo = Dir
        Loop
Avevi sbagliato una parentesi ma adesso mi pare che tutto funzioni, 
perfettamente. Adesso passo agli altri ComboBox ed agli altri click. Spero 
tanto di non avere problemi. Sei stato, super gentile e soprattutto 
paziente! 

 paziente!
Appunto le ultime parole famose.
Il problema adesso è nel salvataggio del file.
Infatti come ti avevo detto io salvo ogni volta che  clicco con:
    Open "c:\Downloads\" & ComboBox4.Text & ".txt" For Output As #1
    Print #1, ComboBox4.Text, "|", TextBox9.Text, "|",TextBox10.Text
    Close #1
Purtroppo pero' il file mi resta salvato come
Milano  |          12,5644          |             105,35543
invece che come
Milano|12,5644|105,35543
E quindi quando mi va ad esportare le stringe mi esporta anche gli spazi. 
Quindi magari dentro un TextBox mi trovo Valore: 
12,5644
Ho invece la necessità visto che quei valori vengono usati per fare dei 
conti che i textbox contengano solamente i valori numerici e non gli spazi
Idee?

 Milano|12,5644|105,35543
Funzione Trim$ e usare la & per concatenare
Prova con:
Dim StrInsert as string
StrInsert=trim$(ComboBox4.Text) & "|" & trim$(TextBox9.Text) & "|" &
trim$(TextBox10.Text)
Print #1,StrInsert
Comunque le prox. volte cerca anche da qui:
http://groups.google.com/group/it.comp.lang.visual-basic
Sicuramente trovi le soluzioni più velocemente.


 Sicuramente trovi le soluzioni piů velocemente.
Ti ADORO
Grazie per l'aiuto. Mi memorizzo anche il link