nomi di unità di lettura



  • nomi di unità di lettura
    di Luca.Donati data: 03/04/2013 14:47:00

    Buongiorno a tutti.
    Vorrei recuperare in VBA sotto Excel i nomi dei vari dischi esterni, pennette, e robetta varia per poter individuare univocamente un supporto che va a spasso tra un PC e l'altro, indipendentemente dalla lettera che prende. L'ideale sarebbe avere una lista nelle celle (es.: da A1 in giù) con tutte le unità di lettura, con l'indicazione della lettera e del nome, p.es: "Iomega_HDD (F:)".
    In un forum francese ho preso il codice qui sotto, che parla di fare una tabella se ci sono più unità di rete; ma mentre io non capisco come usare questo codice in una macro, altri commentatori dicono che a loro funziona e a me non risponde nessuno (uffa...!).
    La discussione sta qui: h t t p : / / w w w .developpez.net/forums/d1327019/logiciels/microsoft-office/excel/macros-vba-excel/recuperer-noms-lecteurs-pc/

    Qualcuno di voi, qui, saprebbe aiutarmi a capire? Vi preciso anche qualche mio dubbio:

    1- il codice mi si ferma sulla riga "For Each ds..." dicendo che è richiesto un oggetto e ds resta vuoto: evidentemente non è stato definito.
    2- Non capisco cosa siano ReDim e ReDim Preserve: dichiarazione di tabelle con preservazione elementi presenti? - Non ho trovato niente su Internet
    3- Possibile che costui non usi un EndIf e che nonostante questo il codice funzioni agli altri visitatori di quel forum?
    4- come si usa poi la tabella, una volta che VBA l'ha compilata?
    5- visto che solo io non riesco a farlo funzionare, mi sono bevuto il cervello?

    Vi ringrazio in anticipo per i vostri suggerimenti, nonché per il velo pietoso che vorrete stendere sul mio dubbio n. 5.
     
    ReDim rm_List(1 to 1)
     
    For Each ds in Lecteur.Drives
     
    's'il ya plus d'un lecteur Réseau à trouver rassembler dans un tableau.
     
          if ds.DriveType = 3 Then _
              n = n + 1: Redim Preserve rm_List( 1 to n): rm_List(n) = ds.ShareName
     
    'sinon
          nom = ds.ShareName
    Next



  • di Luca.Donati data: 03/04/2013 15:20:46

    Intanto ho trovato finalmente cos'è ReDim.
    Ho detto "trovato", non "capito"...
    Continuo a riflettere...



  • di Vecchio Frac data: 03/04/2013 15:30:54

    Sul problema specifico, per adesso, passo :)

    Sulle altre domande, sinteticamente, e premesso che non si può esaminare uno spezzone singolo di codice, bisogna analizzarlo nel contesto:

    1. Sì, manca un Dim ds As ...

    2. ReDim, formalmente, "rialloca lo spazio di memorizzazione per una variabile a una o più dimensioni", si usa per modificare l'indice di un vettore (matrice) che sia già stato dichiarato e dimensionato. Mentre Erase cancella la variabile, ReDim semplicemente ne modifica la dimensione, però ne perdi il contenuto (per questo si usa il modificatore Preserve, utilizzato per mantenere i dati nella matrice esistente quando si modificano le dimensioni, e in tal caso esclusivamente dell'ultima dimensione).

    3. EndIf non serve in questo caso perchè come vedi c'è un underscore "_" che indica che la riga di codice non va intesa spezzata ma continua sulla riga successiva; è come scrivere tutto l'If su una riga sola, ma per motivi di leggibilità costui l'ha scritta su due righe; e per far capire all'interprete che è una riga sola, ci ha messo l'underscore, evitando quindi l'errore di EndIf mancante

    4. passo

    5. passo :)






  • di Luca.Donati data: 03/04/2013 15:58:11

    Grazie, Vecchio Frac. Cominciamo a sfrondare.
    Ho quindi capito che fra tabella e array c'è poca differenza, quindi ho tentato il codice qui sotto, che mi avrebbe dovuto mettere i dati nelle celle: niente da fare.
    Si blocca sulla stessa riga, ds è passato da vuoto a Nothing e ho proprio l'impressione che l'oggetto mancante sia "Lecteur", parola francese in mezzo a un codice in inglese non può essere che un nome attribuito dall'utilizzatore. Che roba è? E come si definisce?
    Grazie ancora.
     
    Sub listadrives()
    Dim ds As Object
    ReDim rm_List(1 To 1)
     
    For Each ds In Lecteur.Drives
     
    's'il ya plus d'un lecteur Réseau à trouver rassembler dans un tableau.
     
          If ds.DriveType = 3 Then _
              n = n + 1: ReDim Preserve rm_List(1 To n): rm_List(n) = ds.ShareName
     
    'sinon
          nom = ds.ShareName
    Next
    ActiveSheet.Range("A1").Select
    For i = 1 To n
        ActiveCell.Value = rm_List(i)
        ActiveCell.Offset(1, 0).Select
    Next i
    End Sub



  • di Textomb data: 03/04/2013 16:44:14

    Ho rivisitato il codice che hai postato...
    Così come si trova va in errore.
    Prova così come l'ho riscritto e mi dici.
    Questo ti elenca tutti i dispositivi che hai e li inserisce in elenco nella tabella del foglio attivo a partire dalla cella a1
    Spero che ti serve... Più o meno.

     
    Sub ListDrives()
    Dim rm_List(), Lecteur, ds As Object, n As Byte, i As Byte
    
    ' Pulisco i dati precedenti sulla colonna A
    Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
    
    Set Lecteur = CreateObject("Scripting.FileSystemObject")
    ReDim rm_List(1 To Lecteur.drives.Count, 2)
     
    On Error Resume Next
        For Each ds In Lecteur.drives
        n = n + 1: rm_List(n, 1) = ds.Path: rm_List(n, 2) = ds.VolumeName
        Next
    On Error GoTo 0
        
        For i = 1 To UBound(rm_List)
        Cells(i, 1).Value = rm_List(i, 1) & " " & rm_List(i, 2)
        Next
    
    End Sub
    



  • di Vecchio Frac data: 03/04/2013 17:10:44

    Bravo Textomb

    Set Lecteur = CreateObject("Scripting.FileSystemObject")

    ci avrei messo un po' a esaminare i diversi attributi prima di capire che era un semplice fso (io ho sempre visto associato a una variabile fso un oggetto di FileSystemObject, come anche logico).

    @Luca
    Chiamare una ReDim, aggiungendo per giunta Preserve, ad ogni chiamata del ciclo For, è del tutto inefficiente in termini di prestazioni e, quando si può, si deve evitare. Allocare e riallocare, compattando l'array, è un'operazione pesante.
    Textomb ha risolto efficacemente, preleggendo i drives a disposizione e operando un solo ridimensionamento.





  • di Textomb data: 03/04/2013 22:27:43

    grazie VF. Troppo buono.



  • di Luca.Donati data: 04/04/2013 10:13:58

    Textomb, è vero, davvero un bel lavoro. Grazie!
    Vecchio Frac, ci ho messo un bel po' a capire cosa volevi dire, ma hai ragione. Il fatto è che quel codice l'ho semplicemente copiato senza capirlo; adesso comincio anche a capirlo grazie anche ai tuoi commenti.
    Grazie di tutto e arrivederci al prossimo quesito (imminente).