|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
[VBA] Excel, programmino per il lavoro
Ciao, premetto che sono totalmente a digiuno di visual basic, mi sono dilettato nella programmazione alle superiori frequentando il corso di elettronica ma poi mi sono "spostato" su ing meccanica.
Cmq in questi giorni mi è venuto lo schizzo di realizzare un piccolo programmino in visual basic per excel per importare alcuni file dati al lavoro e convertirli per una maschera in excel. Diciamo che leggendo qua e là me la sto cavando, mi sono bloccato nell'analisi di una matrice ricavata dalla funzione GetOpenFileName...mi spiego: vorrei dare la possibilità di selezionare più file dati, ottengo perciò una matrice riportante riga per riga il percorso dei file che si vogliono modificare, bene, ora voglio analizzare tali file ma non riesco a trovare la funzione che riporti il numero di righe di tale matrice e senza questa informazione non posso impostare un ciclo "for", mi sapreste dare qualche consiglio? Utilizzerò questo thread per eventuali altri consigli...se mai ne avrò ancora bisogno. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Se non conosci la dimensione esatta dell'array, ti conviene usare un ciclo while.
Come condizione di uscita dal ciclo, potresti ad esempio l'informazione sul fatto che il nome del file deve contenere qualcosa, se è nullo vuol dire che hai terminato l'elaborazione (è un'ipotesi, non conosco la tua applicazione). Una cosa del tipo: Codice:
dim file_processato as integer file_processato = 0 while array_dei_nomi(file_processato) <> "" [... processa array_dei_nomi(file_processato)...] file_processato = file_processato + 1 wend
__________________
Il sole è giallo |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Grazie per la risposta, non credo però di essermi spiegato bene.
Utilizzando la funzione GetOpenFileName vorrei dare l'opportunità di aprire più file dati contemporaneamente, ottengo in uscita dalla funzione perciò una stringa riportante il percorso per esteso in cui è collocato ciascun file selezionato, da ciò che mi pare di avere intuito analizzando la variabile ciascun percorso è su una riga diversa dalla matrice stringa, vorrei riuscire a ricavare da ciascun percorso il nome nel file ripulendolo dal percorso. Se devo fare l'operazione su una matrice di cui non conosco la dimensione, non sapendo quanti file l'utente potrà andare a selezionare come posso agire? Premetto che su una stringa monodimensionale l'operazione mi riesce bene, il mio problema in poche parole, è risalire al numero di righe della matrice per impostare un ciclo for che vada ad analizzare ciscuna riga |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Non ho capito granchè, andiamo per esempi: com'è la matrice ?
Ad esempio, se l'utente/programma apre 3 files, la matrice sarà del tipo Codice:
matrice(0)="c:\windows\....\file1" matrice(1)="c:\windows\....\file2" matrice(2)="c:\windows\....\file3"
__________________
Il sole è giallo |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Proprio così!
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Ok, allora il codice che ti ho postato precedentemente dovrebbe funzionare nel tuo caso, devi solo aggiungere l'istruzione che "ripulisce" il nome del file dal percorso.
Codice:
dim file_processato as integer dim nome_ripulito as string file_processato = 0 while array(file_processato) <> "" and file_processato<=ubound(array()) nome_ripulito = mid(array(file_processato), InstrRev(array(file_processato),"/")+1) file_processato = file_processato + 1 wend
__________________
Il sole è giallo |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Non capisco, ci deve essere un problema di tipologia di variabile che causa l'errore perchè passando riga per riga il codice con F8 nel momento in cui tento di fare una qualsiasi operazione sulla stringa restituita da GetOpenFilename risulta un errore. Analizzando nella finestra espressioni di controllo la variabile su cui vengono memorizzati i percorsi dei file è di tipo Variant/String, può essere questo?
Per capirci riporto alcune righe di codice fileDATToOpen = Application.GetOpenFilename("Dati origine DAT (*.dat), *.dat", , , , True) a questo punto volendo ad esempio riportare i percorsi dei file con una listbox farei in un ciclo for each lstDAT.additem fileDATToOpen(i) ma ottengo un errore di incompatibilità di tipi se provo a scrivere una riga del tipo dim prova as string prova = fileDATToOpen(0) ottengo un errore di "indice non incluso nell'intervallo", insomma non riesco ad lavorare su sta cavolo di stringa fileDATToOpen, sicuramente credo di sbagliare nell'assegnazione del tipo di variabili ![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Nessuno saprebbe come aiutarmi? Ho provato a fare una conversione da variant a string ma non ne scappooo cmq! Se è utile posso postare il listato del codice...
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
questo va.
![]() Codice:
Sub aaa() Dim v As Variant v = Application.GetOpenFilename(, , , , True) For i = 1 To UBound(v) v(i) = Mid$(v(i), InStrRev(v(i), "\") + 1) Next i End Sub
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Tornando al tuo tentativo, il codice VBA corretto per popolare la tua listbox con i percorsi completi dei files selezionati dall'utente è questo : Codice:
lstFiles.Clear Dim arrayNomi() As Variant ChDir ThisWorkbook.Path & "\Test" On Error Resume Next arrayNomi = Application.GetOpenFilename("Files DAT (*.DAT), *.DAT", , "Selezionare i files :", , True) Dim i As Integer i = 0 For i = 1 To UBound(arrayNomi) lstFiles.AddItem (arrayNomi(i)) Next i Infine ChDir ThisWorkbook.Path & "\Test" in questo caso permette di aprire la dialogBox in una directory desiderata ( la cartella "Test" che sta nella stessa dir del Workbook corrente ). ![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Grazie mille a tutti per l'aiuto...scusate il ritardo ma ho avuto un pò da fare in questo periodo. La parte finale di codice che ho utilizzato è la seguente:
For i = 0 To UBound(fileDATToOpen) If i = 0 Then nDAT = 0 ElencoDAT = fileDATToOpen lstDAT.Clear temp = CStr(fileDATToOpen(i + 1)) RevPos = InStrRev(temp, "\") nomeFile(i) = Mid$(temp, RevPos + 1) lstDAT.AddItem nomeFile(i) Else temp = CStr(fileDATToOpen(i + 1)) RevPos = InStrRev(temp, "\") nomeFile(i) = Mid$(temp, RevPos + 1) lstDAT.AddItem nomeFile(i) nDAT = nDAT + 1 End If Next i Pare non dare alcun problema. Ora sto testando un pò il programmino, alcuni problemi ci sono ancora...nel caso non risolva mi rivolgerò nuovamente a voi, in questo thread ![]() In verità avrei già un quesito, mi sapreste consigliare qualche riga di codice per individuare l'inizio di una serie di dati numerici? Mi spiego meglio, il file dati che viene generato dalla macchina riporta un'intestazione che può occupare diverse righe e colonne, con codici numerici o parole, dopodichè, ad una certa riga, partendo dall'alto, (supponiamo la riga 9) iniziano i dati, che possono occupare più colonne ma comunque dalla riga 9 in poi si avranno solo numeri. Vorrei individuare la riga in cui iniziano questi dati numerici; ricordo che tutte le celle di questo foglio hanno formato generico e tale foglio è ottenuto utilizzando la funzione Workbooks.OpenText mediante la quale importo il appunti il file dati generato dalla macchina. |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Grazie mille ragazzi! Con l'utilizzo del programma mi vengono in mente idee per cercare di automatizzare sempre più operazioni.
Vorrei porvi questo problema: solitamente nei fogli XLS in cui vengono importati i dati è presente un grafico che utilizza valori presenti in 2 colonne (del foglio in cui ho importato i dati) che a priori non posso conoscere, ci sarebbe un modo per poter individuare il grafico presente nel foglio, le colonne di dati che utilizza e fare in modo che di volta in volta venga settato il range di righe occupate da valori numerici (il numero di righe sarà lo stesso per tutte e due le colonne ovviamente) e quindi da utilizzare per il grafico? |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 414
|
Nessuna idea?
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:35.