Archivi categoria: Visual Basic 6

[VB6] – Leggere un file Excel

Problema: Leggere un file excel senza l’utilizzo di nessuna libreria esterna

Soluzione: La soluzione relativamente semplice e prevede l’utlizzo di un file Excel come una sorta di database sul quale fare una query, per fare questo andremo ad utilizzare il recordset come struttura dati ospite ecco le pochissime righe di codice che servono, ricordatevi di includere (Progetto -> Riferimenti ) tutti i riferimenti necessari per l’utilizzo dei recordset


'Dichiarazione delle variabili
Dim rs As ADODB.Recordset
Dim sconn As String
'Impostazione del recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenKeyset
rs.LockType = adLockBatchOptimistic
'Preparo la stringa di connessione
sconn = "DRIVER=Microsoft Excel Driver (*.xls);" & "DBQ=" & sFile
'Apro la connessione ed effettuo la query
rs.Open "SELECT * FROM [Foglio1$] WHERE Colonna = '" & condizione & "'", sconn
rs.Close

[VB6] – Unzip di files SENZA librerie esterne

Problema: decomprimere (unzippare) un file zip in Visual Basic 6 senza l’utilizzo di librerie esterne

Soluzione:
Sostanzialmente la soluzione semplice, basta invocare la shell ed utilizzare il supporto del sistema operativo (il codice funziona sicuramente su Windows xp e superiori, ma non ho testato su altri sistemi operativi, magari ditelo voi se su sistemi operativi pi vecchi funziona); ma vediamo passo passo quello che c’ da fare.

1. Inserire il riferimento a (men: Progetto -> Riferimenti) Microsoft Shell Controls and Automation

2. Inserire la seguente routine dove vi pare:

Public Sub unzip()
Dim nomefile As String
Dim nomedir As String

Dim ClasseShell As Shell32Ctl.Shell
Dim FileDaUnzip As Shell32Ctl.Folder
Dim DestUnzip As Shell32Ctl.Folder
Dim CopiaUnzip As Shell32Ctl.FolderItems

nomefile = “C:\temp\file.zip”
nomedir = “C:\temp”

Set ClasseShell = New Shell32Ctl.Shell
‘ file da unzippare
Set FileDaUnzip = ClasseShell.NameSpace(nomefile)
‘ directory out
Set DestUnzip = ClasseShell.NameSpace(nomedir)
‘ esecuzione della copia
Set CopiaUnzip = FileDaUnzip.Items

Call DestUnzip.CopyHere(CopiaUnzip, 20)

End Sub

Bene ecco le opzioni di CopyHere:
0 Default. Nessuna opzione specificata.
4 Non mostra il box con la barra di progressione.
8 Rinomina il file di destinazione se il esiste un file con lo stesso nome nella directory di destinazione.
16 Clicca “Yes to All” in qualsiasi finestra di dialogo che viene mostrata.
64 Mantieni le informazioni, se possibile.
128 Esegui le operazioni solo se viene specificata una wildcard (*.*).
256 Mostra una finestra di dialogo con la progress bar ma senza mostrare i nomi dei file.
512 Non confermare la creazione di una nuova directory se l’operazione ne richiede la creazione.
1024 Non mostrare un’interfaccia utente se si verifica un errore.
4096 Disabilita la ricorsione.
9182 Non copiare i file collegati come un gruppo. Copia solo i file specificati.

[VB6] – Elenco ricorsivo di file

Problema: Elencare tutti i file presenti in una cartella root e tutti quelli presenti nelle sue sottocartelle.

Soluzione:
La soluzione si avvale di una procedura ricorsiva che prende in input la radice da cui far partire la ricerca.

1 Passo: inserire i riferimenti (clicca su: Progetto -> Riferimenti ) a Microsoft Scripting Runtime

2 Passo: nella parte dichiarazioni inserire le seguenti linee di codice


Option Explicit

Dim FSO As New FileSystemObject
Dim BASEPATH As Folder

e poi ovunque voi vogliate inserite la seguente routine:


Sub ScanFolders(Path As String)

Dim FLD As Folder
Dim FIL As File
Dim curr_ext As String 'l'estensione del file corrente

Set BASEPATH = FSO.GetFolder(Path)

For Each FLD In BASEPATH.SubFolders
ScanFolders FLD.Path
For Each FIL In FLD.Files
' se vi serve ragionare in base all'estensione del file l'istruzione questa
curr_ext = Mid(FIL.Name, InStrRev(FIL.Name, ".") + 1)

Select Case UCase(curr_ext)
case else
Debug.Print FIL.Path
End Select
DoEvents
Next FIL
DoEvents

Next FLD

End Sub

Un altro tipo di funzione potrebbe invece prevedere l’uso di una variabile globale:


Public Function ListaFile(path As String, ByRef elenco() As String) As Boolean

'Questa funzione si occupa di gestire la copia dei file delle Curve di Carico

Dim FSO As FileSystemObject
Dim BASEPATH As Folder
Dim FLD As Folder
Dim FIL As File
Dim max As Long

On Error GoTo ListaFile_Err

Set FSO = New FileSystemObject
Set BASEPATH = FSO.GetFolder(path)

max = UBound(elenco_file)

For Each FIL In BASEPATH.Files
elenco_file(max) = FIL.path
max = max + 1
ReDim Preserve elenco_file(max)
Next FIL

For Each FLD In BASEPATH.SubFolders
Call ListaFile(FLD.path, elenco_file)
Next FLD

ListaFile = True

End Function