PDA

View Full Version : [vba] come fate se volete ricercare un file su tutto il disco ?


misterx
20-07-2004, 09:50
ci vorrebbe una bella ricorsione usando abilmente ed opportunamente il comando.....


Dir() di VB


Siccome penso che qualcuno lo ha già implementato vi ringrazio da subito se..... :)

a2000
20-07-2004, 11:48
per esempio:


Sub aMain()
NomePath = "c:\"
NomeFile = "pippo.xls"
Call TrovaFile(NomePath, NomeFile, ElencoFile)
MsgBox ElencoFile
End Sub



Sub TrovaFile(NomePath, NomeFile, ElencoFile)

If Dir(NomePath & NomeFile) <> "" Then
ElencoFile = ElencoFile & NomePath & NomeFile & Chr$(10)
End If

NomeDir = Dir(NomePath, vbDirectory)
Do While NomeDir <> ""
If (GetAttr(NomePath & NomeDir) And vbDirectory) = vbDirectory Then
If NomeDir <> "." And NomeDir <> ".." Then ElencoDir = ElencoDir & NomeDir & ","
End If
NomeDir = Dir
Loop

ipos1 = 1
Do
ipos2 = InStr(ipos1, ElencoDir, ","): If ipos2 = 0 Then Exit Do
Call TrovaFile(NomePath & Mid$(ElencoDir, ipos1, ipos2 - ipos1) & "\", NomeFile, ElencoFile)
ipos1 = ipos2 + 1
Loop


End Sub

misterx
20-07-2004, 12:10
pensavo utilizzassi una chiamata ricorsiva

a2000
20-07-2004, 12:49
infatti è ricorsiva.

misterx
20-07-2004, 13:07
pardon, hai ragione

intendevo senza creare una sorta di stringa separata da ,

beh, poi ognuno ha i suoi metodi :)

a2000
20-07-2004, 13:58
Originariamente inviato da misterx
...
intendevo senza creare una sorta di stringa separata da ,
...



è dovuto per il corretto richiamo reiterato di Dir

comunque è a piacere.

misterx
20-07-2004, 13:59
Originariamente inviato da a2000
è dovuto per il corretto richiamo reiterato di Dir

comunque è a piacere.



ma te lo sei inventato tu ?

io stavo lavorando su questo esempio che è compreso nell'help in linea di excel


Sub Prova()

Range("a1:a500").Clear


' Visualizza i nomi in c:\ che rappresentano directory.
MyPath = "c:\windows\" ' Imposta il percorso.

MyName = Dir(MyPath, vbDirectory) ' Recupera la prima voce.


Do While MyName <> "" ' Avvia il ciclo.
' Ignora la directory corrente e quella di livello superiore.
If MyName <> "." And MyName <> ".." Then
' Usa il confronto bit per bit per verificare se MyName è una directory.
If (GetAttr(MyPath & MyName) And vbDirectory) <> vbDirectory Then
Cells(i + 1, 1) = MyName: i = i + 1 ' Visualizza la voce solo
End If ' se rappresenta una directory.
End If
MyName = Dir ' Legge la voce successiva.
Loop

End Sub

a2000
20-07-2004, 19:58
Originariamente inviato da misterx
ma te lo sei inventato tu ?

ca va sans dire. :)

misterx
21-07-2004, 07:47
così se vi dovesse servire non ammattite per niente

A che mi serve ?
a trova tutti i file di un particolare tipo, esempio: BitMap "*.bmp" in tutto il disco partendo dalla cartella da voi fornita e ve li mostra incolonnati nella colonna "A1:An" di Excel




Option Explicit
Dim gFiles() As String
Dim g As Integer




Sub SearchFolder(FolderName As String, FilePattern As String)
Dim FileNames() As String
Dim FolderNames() As String
Dim FileName As String
Dim i As Integer
Dim j As Integer
FileName = Dir$(FolderName & "\" & FilePattern)
Do Until FileName = ""
ReDim Preserve gFiles(g)
gFiles(g) = FolderName & "\" & FileName
g = g + 1
FileName = Dir$()
Loop

FileName = Dir$(FolderName & "\*.*", vbDirectory)
Do Until FileName = ""
If (GetAttr(FolderName & "\" & FileName) And vbDirectory) = vbDirectory Then
If Left$(FileName, 1) <> "." Then
ReDim Preserve FolderNames(i)
FolderNames(i) = FileName
i = i + 1
End If
End If
FileName = Dir$()
Loop
For j = 0 To i - 1
SearchFolder FolderName & "\" & FolderNames(j), FilePattern
Next j
End Sub





Sub TrovaUnTipoDiFile()

Columns("A:A").Clear

Dim i As Integer

SearchFolder "C:", "*.bmp" 'qui mettere cartella di partenza e tipo di file

For i = 0 To g - 1
Cells(i + 1, 1) = gFiles(i)
Next i

End Sub

a2000
21-07-2004, 08:59
copiato ? :p

misterx
21-07-2004, 09:10
Originariamente inviato da a2000
copiato ? :p



se esiste già che ti reinventi, l'acqua calda ?


quello sopra poi, è solo la punta dell'iceberg ;)



ma tu gli ambienti di sviluppo te li scrivi oppure usi quelli messi a disposizione da Microsoft ?


se ci pensi è la stessa cosa :D:D:D

a2000
21-07-2004, 09:36
ok ok (cioè no), nun te incazzà ! :)

comunque l'ambiente di sviluppo perfetto è il foglio di carta (bianca).

misterx
27-07-2004, 09:41
ma è possibile che per avere un valore di ritorno da una funzione devo scrivere quello che vedete sotto in bold ?


Sub test()

stringa = "vada via i ciap"
ncar = NumeroDiA(stringa)

MsgBox( ncar )

End Sub

Function NumeroDiA(stringaAs String)

For i = 1 To Len(stringa)
If Mid$(stringa, i, 1) = "a" Then sp = sp + 1
Next i

NumeroDiA= sp

End Function

a2000
27-07-2004, 09:48
Function NumeroDiA(stringaAs String)

For i = 1 To Len(stringa)
NumeroDiA = NumeroDiA - (Mid$(stringa, i, 1) = "a")
Next i

End Function

misterx
27-07-2004, 09:49
Originariamente inviato da a2000

Function NumeroDiA(stringaAs String)

For i = 1 To Len(stringa)
NumeroDiA = NumeroDiA - (Mid$(stringa, i, 1) = "a")
Next i

End Function




mi interessa conoscere come VBA ritorna un valore tra funzioni
:)

a2000
27-07-2004, 11:02
come in algebra.
senza C-ca@ate tipo return nomevar.

nelle ultime versioni puoi utilizzare nei calcoli direttamente il nome della funzione come una variabile.
nelle precedenti no ed era necessaria l'assegnazione finale.

a2000
27-07-2004, 11:03
ma questi misterx sono dettagli di piccolo conto.
:)

misterx
27-07-2004, 12:04
Originariamente inviato da a2000
come in algebra.
senza C-ca@ate tipo return nomevar.




io ero rimasto che nel BASIC il return servisse solo per ritornare da una sub-routine, il malefico GOSUB

Originariamente inviato da a2000
nelle ultime versioni puoi utilizzare nei calcoli direttamente il nome della funzione come una variabile.
nelle precedenti no ed era necessaria l'assegnazione finale.

intendi come nell'esempio che ho postato io ?

a2000
27-07-2004, 12:09
Originariamente inviato da misterx

- io ero rimasto che nel BASIC il return servisse solo per ritornare da una sub-routine, il malefico GOSUB

- intendi come nell'esempio che ho postato io ?

- esatto.
ma in pascal e C (e anche fortran last edition) c'è la possibilità di restituire il valore di una variabile con una istruzione tipo return nomevar

- sì.

a2000
27-07-2004, 12:47
e hai mai restituito un variant array, magari su un range di celle ?


Function f_fff(v) As Variant
Dim vf(1 To 1, 1 To 4) as Variant
......

vf(1, 1) = nIG - SnIG
vf(1, 2) = SyI - 1
vf(1, 3) = SxI - 1
vf(1, 4) = TI
f_fff = vf

End Function


e sul foglio:

={f_fff(A17)} ......... ={f_fff(A17)} ......... ={f_fff(A17)} ......... ={f_fff(A17)}

immessi sotto forma di matrice con Ctrl+Shift+Enter

misterx
27-07-2004, 13:25
per il momento nò!

a2000
27-07-2004, 13:45
misterx per le interfacce dobbiamo passare a Visio ... :)

misterx
29-07-2004, 10:37
sto cacchio di VBA :mad:

come faccio a settare come directory di lavoro la medesima nella quale si trova il mio file (foglio di lavoro) di Excel ?

chdir (Appilication.path) non funziona e quindi ?

a2000
29-07-2004, 13:07
ThisWorkbook.Path

misterx
29-07-2004, 18:50
grazie 1000

a2000

a2000
29-07-2004, 20:24
ma passiamo a Visio o no ?

misterx
29-07-2004, 21:04
non so nemmeno cosa sia

a2000
30-07-2004, 13:15
è la GUI input-output dati personalizzabile pronta all'uso.

basta con ListBox ComboBox e ButtonMinchia ! :D

praticamente è la morte di tutti i linguaggi VisualMinchia. :eek:

no matter ovviamente per VBA ;)

misterx
10-09-2004, 08:03
domanda

ho un foglio di Excel che contiene una macro; tale foglio sarà il destinatario della mia applicazione

apro un secondo foglio di Excel (sorgente) che contiene dei dati da copiare nel foglio di destinazione

se ora scrivo:

Set sorgente = WorkBooks("sorgente.xls")
Set destinazione = WorkBooks("destinazione.xls")

dovrei anche poter scrivere ad esempio:

for i = 1 to 10
destinazione.Cells(i,1) = sorgente.Cells(i,1)
next i

ma non funziona perchè vuola anche il riferimento al foglio ??

misterx
10-09-2004, 08:15
Sub asd()
Set sorgente = Workbooks("sorgente.xls")
Set destinazione = Workbooks("destinazione.xls")

For i = 1 To 10
destinazione.Worksheets(1).Cells(i, 1) = sorgente.Worksheets(1).Cells(i, 1)
Next i
End Sub

misterx
20-09-2004, 07:38
un bel link


http://www.vba-programmer.com/