Newsgroup: it.comp.appl.access
Titolo: Selezionare una cartella tramite Browse. Errore di compilazione nel modulo.

Ciao a tutti sto cercando di utilizzare la funzione riportata sotto 
ereditata dalla rete, ma mi da errore nella parte  "  Dim BInfo As 
BROWSEINFO  " con il seguente messaggio. non ho idea su come effettuare la 
correzione; potreste darmi una mano.
Sinceramente non ho idea se riuscir� a mettre il codice per far funzionare 
il tutto, ma se non riesco a risolvere l'errore che segnala non lo sapr� 
mai.
Grazie, Bruno
 
 
Public Function SfogliaCartelle(ByVal Handle As Long) As String
Dim BInfo As BROWSEINFO
 
 
 
  ^^^^^^^^^^^^^
 
 
 
Option Compare Database
Option Explicit
 
 
'Esiste a questo scopo una finestra di dialogo all'interno della DLL 
Shell32. Il suo nome � BrowseForFolder.
'In questo HowTo vedremo come richiamare questa funzione mediante l'API.
'Per il nostro scopo creeremo una funzione che ritorna il percorso, ma prima 
� necessario scrivere alcune dichiarazioni API
'all'interno del nostro form oppure in un modulo standard
 
 
'Private Type BROWSEINFO
    'hOwner As Long
    'pidlRoot As Long
    'pszDisplayName As String
    'lpszTitle As String
    'ulFlags As Long
    'lpfn As Long
    'lParam As Long
    'iImage As Long
'End Type
 
 
'Private Const BIF_RETURNONLYFSDIRS = &H1
'Private Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias 
"SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
'Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" 
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) 
As Long
'Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As 
Long)
 
 
'^^^^^^^^^^^
 
'Le righe dal 3 al 12 definiscono un nuovo tipo di nome BROWSEINFO. Tale 
struttura � richiesta dalla funzione API.
'La riga 14 presenta una costante  BIF_RETURNONLYFSDIRS che indica che 
vogliamo presentate soltanto le cartelle.
'Ulteriori costanti che � possibile utilizzare in questa funzione sono 
presenti nelle dichiarazioni API.
'Per rintracciarle bisogna cercare tutte le costanti il cui nome inizia per 
"BIF_" (BrowseInfo Flags).
'Alla riga 15 viene dichiarata la prima funzione API: SHBrowseForFolders. 
Essa richiede che sia passata una variabile
'di tipo BROWSEINFO (definita prima), mostra la finestra di dialogo per la 
scelta della cartella e, nel momento in cui
'l'utente clicca il pulsante OK alloca in uno spazio apposito il nome della 
cartella selezionata.
'La seconda funzione API (riga 16) estrae il percorso della cartella 
selezionata dall'area di memoria allocata.
'L 'ultima funzione API (riga 17) dealloca l'area di memoria bloccata dalla 
funzione SHBrowseForFolders.
 
'Terminate le dichiarazioni passiamo alla scrittura di una funzione che 
faccia tutto il lavoro mediante un semplice richiamo.
'La nostra funzione prende il nome di SfogliaCartelle.
 
 
Public Function SfogliaCartelle(ByVal Handle As Long) As String
 
    Dim BInfo As BROWSEINFO
    Dim RetVal As Long, PathID As Long, RetPath As String, Offset As Integer
 
 
 
 
'Come gi� accennato prima, la funzione SHBrowseForFolders richiede che sia 
passata una variabile con la struttura BROWSEINFO.
'La nostra variabile si chiamer� BInfo.
 
    Dim CartellaScelta As Long
    Dim PercorsoAllocato As Long
    Dim PercorsoScelto As String
 
'Dichiareremo anche una serie di altre variabili: CartellaScelta indica che 
� stato possibile estrarre il percorso scelto dall'area di memoria
'allocata. In caso di mancata estrazione - ovvero quando l'utente preme il 
tasto Annulla della finestra di dialogo - essa avr� il valore 0.
'La variabile PercorsoAllocato conterr� l'indirizzo dell'area di memoria 
allocata dalla funzione. Tale valore sar� in seguito utilizzato
'per ricavare il percorso della cartella selezionata che verr� memorizzato 
nella variabile PercorsoScelto.
 
    BInfo.hOwner = Handle
    BInfo.lpszTitle = "Scegli una cartella:"
    BInfo.ulFlags = BIF_RETURNONLYFSDIRS
 
'La struttura BROWSEINFO ha tre elementi fondamentali: hOwner che indica 
l'handle della finestra dentro la quale apparir� la nostra finestra
'di dialogo. La nostra funzione SfogliaCartelle ci provvede l'handle da 
assegnare a tale elemento (riga 24).
'Altro elemento fondamentale � lpszTitle e indica il testo che apparir� 
nella parte superiore della finestra di dialogo.
'L'ultimo elemento � anche il pi� importante: esso indica il tipo di azione 
da eseguire con tale finestra: noi assegneremo il valore
'della costante BIF_RETURNONLYFSDIRS dichiarata prima.
 
    PercorsoAllocato = SHBrowseForFolder(BInfo)
 
'Eseguiamo la chiamata alla funzione SHBrowseForFolders che mostrer� la 
finestra di scelta della cartella.
'All'uscita della finestra, la variabile PercorsoAllocato conterr� un 
puntatore all'area di memoria allocata dall'ultima funzione.
 
    PercorsoScelto = Space$(512)
'Come per tutte le funzioni API che utilizzano stringhe, � necessario 
prepare prima la variabile mediante l'istruzione Space$.
 
    CartellaScelta = SHGetPathFromIDList(PercorsoAllocato, PercorsoScelto)
 
'La funzione SHGetPathFromIDList estrae il percorso allocato dall'area di 
memoria indicata da PercorsoAllocato
'e lo memorizza nella variabile PercorsoScelto.
'Se L 'utente ha annullato la scelta, il tentativo di estrazione del 
percorso ritorner� il valore 0.
 
    If CartellaScelta Then
 
'Quindi segue un controllo che si assicura che l'utente abbia scelto qualche 
cartella. In caso negativo il programma salta alla riga 34.
 
        SfogliaCartelle = Left$(PercorsoScelto, InStr(PercorsoScelto, 
Chr$(0)) - 1)
 
'Tutte le funzioni API restituiscono le variabili stringa con un terminatore 
(codice ASCII 0) alla fine.
'Questa riga provvede a eliminare il terminatore finale da PercorsoScelto e 
memorizza il rimanente nella variabile SfogliaCartelle
'che sar� il valore ritornato all'uscita della funzione.
 
        CoTaskMemFree PercorsoAllocato
 
'Fatto questo � necessario deallocare la memoria allocata.
'La funzione CoTaskMemFree provvede a questo e richiede un puntatore.
 
    Else
        SfogliaCartelle = ""
 
'L 'utente ha annullato la selezione. Non sar� ritornata alcuna cartella 
all'uscita.
 
    End If
End Function
 
'Terminata la nostra funzione possiamo passare alla semplice interfaccia.
'Inseriamo sopra il nostro form due controlli: un pulsante di comando di 
nome Sfoglia ed una casella di testo di nome Percorso.
 
'Nel momento in cui l'utente clicca il pulsante Sfoglia viene richiamato 
l'evento click:
 
        'Private Sub Sfoglia_Click()
            'Percorso.Text = SfogliaCartelle(Me.Hwnd)
        'End Sub
 
'Questa semplice routine scrive il percorso della cartella selezionata 
all'interno della casella di testo di nome Percorso.
'� terminata qui. Basta cliccare il pulsante Sfoglia per vedere apparire la 
finestra di dialogo "Sfoglia per Cartelle". 
 

Perchè non usi FileDialog invece delle API, che con i nuovi SO devono
essere adatatte al 64Bit...?
 
FD è nativo basta referenziare OFFICE.
 
@Alex

 ha scritto nel messaggio 
news:4afcd670-8c7a-4023...@n2g2000yqg.googlegroups.com...
Perch� non usi FileDialog invece delle API, che con i nuovi SO devono
essere adatatte al 64Bit...?
 
FD � nativo basta referenziare OFFICE.
 
@Alex
 
^^^^^^^^^^^^^
 
Ciao Alex, non ho idea su come fare. E' una cosa complicata? Puoi darmi 
maggiori indicazioni.
 
Grazie, Bruno 
 
 

 ha scritto nel messaggio 
news:4afcd670-8c7a-4023...@n2g2000yqg.googlegroups.com...
Perch� non usi FileDialog invece delle API, che con i nuovi SO devono
essere adatatte al 64Bit...?
 
FD � nativo basta referenziare OFFICE.
 
@Alex
 
^^^^^^
 
Dimenticavo..... io possiedo un 64 bit, pertanto il tuo consiglio calza a 
pennello, ma come si fa? 
 
 

Bruno62 ha scritto:

Nel codice che hai proposto noto delle virgolette ad inizio rigo. Il
codice cos� diventa un commento... comunque eccoti quello che uso e che
funziona perfettamente con W7 64 bit e Access 2007 in un file .accdb
 
In un modulo inserisci:
 
Option Compare Database
Option Explicit
 
Private Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
            "SHGetPathFromIDListA" (ByVal pidl As Long, _
            ByVal pszPath As String) As Long
 
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
            "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
            As Long
 
Private Const BIF_RETURNONLYFSDIRS = &H1
 
Public Function BrowseFolder(szDialogTitle As String) As String
  Dim x As Long, bi As BROWSEINFO, dwIList As Long
  Dim szPath As String, wPos As Integer
 
    With bi
        .hOwner = hWndAccessApp
        .lpszTitle = szDialogTitle
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
 
    dwIList = SHBrowseForFolder(bi)
    szPath = Space$(512)
    x = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
 
    If x Then
        wPos = InStr(szPath, Chr(0))
        BrowseFolder = Left$(szPath, wPos - 1)
    Else
        BrowseFolder = vbNullString
    End If
End Function
 
Nella finestra Immediata scrivi:
 
?BrowseFolder("C:")
 
e dai invio.
 
--
sv
 
-- 
 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

 
 
"sv"  ha scritto nel messaggio news:kiotv4$o3v$1...@news.newsland.it...
 
[CUT]

^^^^^^^^^^^^^^^
 
Ciao, se non erro questo codice � depositato nel sito comune, codice che ho 
provato e mi dava lo stesso errore che mi da il tuo, cio� mi dice che 
microsoft Access a smesso di funzionare e di chiude il db; si pianta 
proprio.
 
Cosa pu� essere ?
 
Bruno 
 

Bruno - S95 ha scritto:

Con l'aiuto dell'help di Access....:-))
 
In una maschera inserisci un pulsante ed una casella di testo
Il pulsante lo chiami "cmd1" e la casella "filepath"
 
Imposta i riferimenti come gi� detto da Alex
 
Private Sub cmd1_Click()
' Richiede i riferimenti alla Microsoft Office 12.0 Object Library. '
    Dim fDialog As Office.FileDialog
    Dim varFile As Variant
    ' Imposta File Dialog. 
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
 
    With fDialog
 
        ' Imposta il titolo di dialog box. '
        .Title = "Seleziona"
        .InitialFileName = "C:"
 
        ' Aggiunge il filtro dei file'
        .Filters.Clear
        .Filters.Add "All Files", "*.*"
 
        ' Mostra la dialog box. Se il metodo .Show restituisce True   '
        ' l'utente ha un file. Se restituisce False l'utente ha cliccato
su Annulla '
 
        If .Show = True Then
            For Each varFile In .SelectedItems
                Me.filepath = varFile
            Next
        Else
            MsgBox "Hai cliccato Annulla in dialog box."
        End If
    End With
End Sub 


[cut]
 
Da me funziona perfettamente.. Non saprei cosa dirti. Sicuramente problemi
con le dll.
 
Lascia perdere questa soluzione se ti combina questo guaio.
 
Prova la soluzione con filedialog che ti ho gi� postato.


sv ha scritto:

Nel copia incolla ho inserito una seconda parte che si riferiva ad
un'altra caso.. Pertanto viene corretto cos�:
 
.
.
.
 
' Mostra la dialog box. Se il metodo .Show restituisce True   '
        ' l'utente ha un file. Se restituisce False l'utente ha cliccato
 su Annulla '
 
         If .Show = True Then
 
                 Me.filepath = .SelectedItems.Item(1)
 
         Else
             MsgBox "Hai cliccato Annulla in dialog box."
         End If
     End With
 
.
.
.
Non abbiamo bisogno tra l'altro della variabile "varfile"


Bruno
 
Per le problematiche 32/64 bit:
 
http://msdn.microsoft.com/en-us/library/ee691831.aspx
 
http://www.jkp-ads.com/articles/apideclarations.asp
 


Bruno
 
Per le problematiche 32/64 bit:
 
http://msdn.microsoft.com/en-us/library/ee691831.aspx
 
http://www.jkp-ads.com/articles/apideclarations.asp
 
 
--
sv
 
 
 
-- 
 
 
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 
^^^^^^
 
Riciao, ora provo quanto scritto nell'ultimo tuo post.
 
Giusto per......... ho trovato in rete queste due stringhe alle quali ho 
aggiunto i commenti per maggior comprensione. Eccole.
Già provato, l'unica cosa è che non riesco a memorizzare solo la path della 
cartella. Per il resto funziona alla grande anche su 64 bit
Ciao, Bruno
 
 
 
 
 
 
Private Sub Comando0_Click()
 
'-----------------------------------------------------------------------------------------------
'     Scelta                                    Cosa fa
'msoFileDialogFilePicker               1) Lets users select one or more 
files
'msoFileDialogFolderPicker             2) Lets users select a folder path
'msoFileDialogOpen                     3) Lets users select one or more 
files to open
'msoFileDialogSaveAs                   4) Lets users select a single file to 
save
 
'-----------------------------------------------------------------------------------------------
 
Dim objDialog As Object
 
'In "Application.FileDialog(2)" inserire il numero corrispondente alla voce 
suindicata desiderata
Set objDialog = Application.FileDialog(2)
 
With objDialog
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count = 0 Then
        MsgBox "No file selected."
    Else
        'Me.FileNameTextBox = Dir(.SelectedItems(1)) ' Stringa originale
        Me.FileNameTextBox = Dir(.SelectedItems(1))
    End If
End With
Set objDialog = Nothing
 
End Sub
 

 
 
"sv"  ha scritto nel messaggio news:kip40d$1q2$1...@news.newsland.it...

^^^^^^^^^^^^^^^^^^^^^^^^^
 
OK, funziona. Ho fatto riferimento alla libreria Microsoft Office 14.0 
Object Library   su Office 2010
 
l'unica cosa � che anche qu� non riesco a salcare solo il percorso cartella 
senza il file, infatti ho la necessit� di avere il per corso cos�, ad 
esempio:  C:\CartellaPippo\CartellaFranco e non 
C:\CartellaPippo\CartellaFranco\File.estensionefile
 
Come se pu� f�..
Bruno
 

Bruno
 
Con un workaround...
Utilizza CurDir... punti al file e ti restituisce il path..
Diventa quindi:
.
.
.
 If .Show = True Then
 
                  Me.filepath = .SelectedItems.Item(1)
                  Me.filepath=CurDir(Me.filepath) & ""
 
          Else
              MsgBox "Hai cliccato Annulla in dialog box."
          End If
     End With
.
.
 



Ottimo, questo è quello da usare.
 
Serve capire bene la questione del 32/64Bit in quanto tutte le
dichiarazioni API che avete esposto non sono per il 64Bit, ma per il
32bit.
 
Mi viene il sospetto che abbiate un SO non a 64 oppure Office a 32...
 
Potete vederlo da Access 2010 leggendo il valore della COSTANTE VBA7
 
# IF VBA7 THEN
 
# ELSE
 
# END IF
 
Leggere questo articolo:
 
http://www.jkp-ads.com/articles/apideclarations.asp
 
 
@Alex

[CUT]
 
 
Scusate, ma con i vari codici postati, per avere il percorso di una cartella 
a quanto pare � necessario che all'interno vi sia per forza un file da 
selezionare, diversamente non funzia, o sbaglio.
 
Per ora ho risolto con le due sub a seguire. Nella prima ho aggiunto "
Dim filepath As Variant
" perch� non mi restituiva quanto desiderato, salvo che io non abbia fatto 
qualche casotto. La seconda, se non erro non ha bisogno di riferimenti a MS 
Office.
 
Certo, non riesco a capacitarmi sul fatto che non si possa selezionare una 
cartella da memorizzare, anche se vuota. Sicuramente sono io che non sono in 
grado.
 
Attendo un vostro cortese  riscontro.
 
Ciao, bruno
 
 
 
 
----------------------INIZIO  PRIMA 
SUB ----------------------------------------
 
Private Sub Comando0_Click()
 
'-----------------------------------------------------------------------------------------------
'     Scelta                                    Cosa fa
'msoFileDialogFilePicker               1) Lets users select one or more 
files
'msoFileDialogFolderPicker             2) Lets users select a folder path
'msoFileDialogOpen                     3) Lets users select one or more 
files to open
'msoFileDialogSaveAs                   4) Lets users select a single file to 
save
 
'-----------------------------------------------------------------------------------------------
 
'In una maschera inserisci un pulsante ed una casella di testo
'Il pulsante lo chiami "cmd1" e la casella "filepath"
 
' Richiede i riferimenti alla Microsoft Office 12.0 Object Library.
Dim fDialog As Office.FileDialog
Dim varFile As Variant
 
Dim filepath As Variant
 
' Imposta File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
 
With fDialog
 
' Imposta il titolo di dialog box. '
.Title = "Seleziona"
.InitialFileName = "C:"
 
' Aggiunge il filtro dei file'
.Filters.Clear
.Filters.Add "All Files", "*.*"
 
'Mostra la dialog box. Se il metodo .Show restituisce True
'l'utente ha un file. Se restituisce False l'utente ha cliccato
'su Annulla
 
If .Show = True Then
 
'Me.filepath = .SelectedItems.Item(1)               'Restituisce l'intero 
percorso compreso il file scelto
 
 
Me.filepath = CurDir(.SelectedItems.Item(1)) & "\"      'Restituisce 
l'intero percorso della cartella prescelta
 
       'selezionando un file all'interno della stessa
Else
MsgBox "Hai cliccato Annulla in dialog box."
 
End If
    End With
 
End Sub
 
---------------------- FINE PRIMA 
SUB ----------------------------------------
 
e se fosse necessario avere solo il file, ma non penso, allora uso la 
seguente
 
 
rivate Sub Comando0_Click()
 
'     Choice                                     What it does
'msoFileDialogFilePicker               Lets users select one or more files
'msoFileDialogFolderPicker             Lets users select a folder path
'msoFileDialogOpen                     Lets users select one or more files 
to open
'msoFileDialogSaveAs                   Lets users select a single file to 
save
 
 
Dim objDialog As Object
 
Set objDialog = Application.FileDialog(3)
 
With objDialog
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count = 0 Then
        MsgBox "No file selected."
    Else
        Me.FileNameTextBox = Dir(.SelectedItems(1))


 selezionare, diversamente non funzia, o sbaglio.
 
No. Se ti serve solo memorizzare il percorso di una cartella anche vuota
eccoti il codice:
 
Private Sub button1_Click()
' Richiede i riferimenti alla Microsoft Office 12.0 Object Library. '
    Dim fDialog As Office.FileDialog
    ' Imposta File Dialog. '
    Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
    With fDialog
        ' Imposta il titolo di dialog box. '
        .Title = "Seleziona"
        .InitialFileName = "C:"
        ' Mostra la dialog box. Se il metodo .Show restituisce True   '
        ' l'utente ha un file. Se restituisce False l'utente ha cliccato
su Annulla '
 
        If .Show = True Then
            Me.filepath = .SelectedItems.Item(1)
        Else
            MsgBox "Hai cliccato Annulla in dialog box."
        End If
    End With
End Sub
 
[cut]


 ha scritto nel messaggio 
news:kirjpe$ph5$1...@news.newsland.it...

^^^^^^^^^^^^^^^^^^^^^^^
 
Non posso fare altro che ringraziarti di cuore per l'aiuto prezioso.
Grazie, Grazie Grazie
 
Bruno 
 
 

 ha scritto nel messaggio 
news:kirjpe$ph5$1...@news.newsland.it...

Ciao Salvino, ho provato la funzione che mi hai postato e nel lanciarla da 
il seguente errore evidenziando solo "fDialog As Office.FileDialog" senza 
evidenziare dim, con messaggio "tipo definito dall'utente non definito". hai 
idea di cosa vuol dire e cosa devo fare?
 
sono andato a vedere nel dettaglio d'aiuto e riporta il seguente testo. 
Peggio che mai. Cosa da marziani.Non ci capisco un fico secco anche se mi 
impegno.
 
Bruno
 
 
Tipo definito dall'utente non definito
Vedere anche     Informazioni aggiuntive
 
Quando in Visual Basic vengono creati tipi di dati personalizzati, � 
necessario definirli prima in un'istruzione Type...End Type oppure in una 
libreria degli oggetti o libreria dei tipi registrate correttamente. Cause e 
soluzioni dell'errore:
 
  a.. � stata dichiarata una variabile o un argomento con un tipo di dati 
non definito oppure � stato specificato un nome di classe o di oggetto 
sconosciuto.
  Definire un nuovo tipo di dati utilizzando l'istruzione Type in un modulo. 
Se si desidera creare un riferimento a una classe, questa deve essere 
riconosciuta dal progetto. Se viene fatto riferimento a una classe del 
programma, il progetto deve includere un modulo di classe con il nome 
specificato. Controllare l'ortografia del nome del tipo o dell'oggetto.
 
  b.. Il tipo che si desidera dichiarare � incluso in un altro modulo, ma � 
stato dichiarato come Private.
  Spostare la definizione del tipo in un modulo standard in cui pu� essere 
Public.
 
  c.. Il tipo � valido, ma la libreria degli oggetti o dei tipi in cui � 
definito non � registrata in Visual Basic.
  Visualizzare la finestra di dialogo Riferimenti, quindi selezionare la 
libreria degli oggetti o dei tipi adeguata. Se, ad esempio, nella finestra 
di dialogo Riferimenti non viene attivata la casella di controllo degli 
oggetti di accesso ai dati (DAO), i tipi Database, Recordset e TableDef non 
saranno riconosciuti e i relativi riferimenti nel codice genereranno questo 
errore.
 
Per ulteriori informazioni, selezionare l'elemento desiderato e premere F1 
(in Windows) oppure AIUTO (in Macintosh).
 
 
 
 

 
[CUT]
 
Scusami, ho risolto facendo riferimento alla libreria office 14. Meno male 
che lo avevi scritto... pensa un pocchino se non l'avessi precisato.
 
Mi sa che sono un pocchino cotto.
 
Comunque sarebbe interessante capire come fare il  Type.... end Type per il 
"fDialog As Office.FileDialog" al fine di evitare di mettere il riferimento. 
Io ho provato, ma si vede che ho una grande confusione in testa, come mi ha 
detto anche Alex.
 
Questo esempio  � stato reperito in 
http://www.mrwebmaster.it/visual-basic/guide/tipi-definiti-dallutente_648.html
 
, solo che fa riferimento a dati stringa e numerici, non ad oggetti.
 
Come si fa per un oggetto?????
 
Bruno
 
 
 
Tipi definiti dall'utente
 
Home > Visual Basic > Guide > Guida VBA > Tipi definiti dall'utente
 
Nel paragrafo precedente abbiamo trattato l'argomento sulle variabili, 
costanti e tipi di dati. Sulle variabili sono stati correlati i seguenti 
concetti:
 
  1.. si � discusso del concetto di variabile semplice che memorizza un dato 
elementare (una data, una stringa, un valore booleano);
  2.. � stata fatta l'esortazione a tutti gli utenti di utilizzare la 
direttiva Option Explicit, al fine di non permettere di creare variabili a 
casaccio ed evitare uno spreco irrazionale della memoria, creando variabili 
di tipo Variant;
  3.. � stata data una tabella riassuntiva dei tipi di dati elementari 
disponibili per VBA;
Adesso dobbiamo argomentare invece:
 
  1.. la dichiarazione e l'utilizzazione di tipi di dati definiti 
dall'utente,usando l'istruzione Type;
  2.. come si dichiarano i vettori (o array monodimensionali) e le matrici 
(o array pluridimensionali);
Il codice per dichiarare un tipo � il seguente:
 
Type archivio
 
    cognome As String*30
 
    nome As String*30
 
    credito As Double
 
End type
 
All'interno dell'istruzione type, come anche del resto, nelle istruzioni di 
dichiarazione Dim, le stringhe a lunghezza fissa sono dichiarate cos�:
 
cognome as String*30
 
dove 30 � la lunghezza caratteri.
 
Ricordo che avete creato un tipo di dato personalizzato. In Memoria non 
avete creato nessun riferimento. Al fine di creare un riferimento in 
memoria, dovremmo dichiarare questo tipo di dato con l'istruzione Dim.
 
Dim elenco As archivio
 
 
Osservate che dopo aver indicato la clausola As, grazie alla tecnologia 
dell'Intellinsense (o completamento automatico dell'istruzione), 
caratteristica insita nel linguaggio Visual Basic, troviamo, tra tutti gli 
oggetti, il nostro tipo di dati personalizzato.
 
Cognome, nome, credito immaginiamo che le abbiamo create con tre istruzioni 
Dim singole. Adesso per assegnare un dato, per mezzo del tipo di dato 
dichiarato (elenco), si procede cos�:
 
...
 
elenco.cognome="Rossi"
 
elenco.nome="Marco"
 
elenco.credito=302.20
 
...
 
In queste istruzioni di assegnazione:
 
  1.. i valori alle variabili di tipo stringa vengono indicate tra doppi 
apici;
  2.. i valori decimali sono indicati secondo la notazione inglese, usando 
il punto.
Come esistono le variabili semplici, per creare delle variabili strutturate, 
per le quali a ciascun elemento si accede con uno o pi� indici interi 
positivi, si procede cos�:
 
Dim elenco(dimensione) As TIPO
 
dove dimensione � possibile indicarla cos� 1 to 10 ad esempio, oppure solo 
l'indice superiore, ossia la dimensione massima di elementi memorizzabili
 
Dim elenco(10) As TIPO
 
� equivalente a:
 
Dim elenco(1 to 10) as TIPO
 
TIPO pu� essere uno dei tipi elementari disponibili per VBA, oppure un tipo 
dati personalizzato.
 
Con un tipo di dato definito dall'utente e le variabili strutturate � 
possibile costruire i cosiddetti Array di record
 
La dichiarazione avviene cos�:
 
Dim elenco(1 to 10) as archivio
 
Ad ogni elemento si accede cos�:
 
elenco(1).cognome