IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Choisir le disque de destination


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut Choisir le disque de destination
    Comment choisir parmi les lecteurs disponibles ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub Choisir_Un_Lecteur_Disponible()
     
    Lecteurs = ShowDriveList
     
    t = Split(Lecteurs, vbLf)
     
    LecteurChoisi = InputBox(result, "Entrez le lecteur choisi", t(UBound(t) - 1))
     
    chemin = LecteurChoisi & ":\"
     
    End Sub
     
    Function ShowDriveList()
       Dim fso, d, dc, s, n
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set dc = fso.Drives
     
       ShowDriveList = ""
       For Each d In dc
          s = d.DriveLetter
          If d.DriveType = 3 Then
          ElseIf d.IsReady Then
             n = d.VolumeName
             ShowDriveList = ShowDriveList & d.DriveLetter & vbLf
          End If
       Next
     
    End Function
    Cordialement

    Docmarti.

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonsoir docmarti
    je pense que ca devrait mieux marcher comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     Sub Choisir_Un_Lecteur_Disponible()
        Dim liste,monchemin
        liste = ""
        lecteurs = Split(ShowDriveList(liste), ".")
        monchemin = InputBox(liste, "choisir la cle usb", lecteurs(0) & ":\")
    End Sub
    Function ShowDriveList(liste)
        Dim fso, d, dc, s, n
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set dc = fso.Drives
        ShowDriveList = ""
        For Each d In dc
            If d.DriveType = 1 Then
                If d.IsReady Then
                    liste = liste & "USB " & d.DriveLetter & ":" & d.VolumeName & vbCrLf
                    ShowDriveList = ShowDriveList & d.DriveLetter & "."
                End If
            End If
        Next
    End Function
    prends la première cle dans la hérarchie
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Petit test pour ceux qui, comme moi, ne laissent pas passer ce lourdaud de FSO sur leur machine

    un bouton de commande (ou une macro), une listbox listbox1 et ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
    Private Sub CommandButton1_Click()
      Listbox1.Clear
      For i = 0 To 25
        If (GetLogicalDrives() And 2 ^ i) <> 0 Then
           Listbox1.AddItem Chr$(65 + i) & ":\" ' si tu veux choisir dans une listbox
        End If
      Next
    End Sub
    EDIT je n'ai pas inclus le lecteur A:\, réservé au lecteur de disquettes. Si on le veut également, démarrer à 64 au lieu de 65
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    a oui!!! bien vu je l'avais zapé la kernel
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour patricktoulon

    J'ai choisi la librairie kernel32 car la plus rapide et élégante.
    On pouvait toutefois s'en passer également, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Listbox1.Clear
      For i = 0 To 25
        If Dir(Chr(65 + i) & ":\", vbDirectory) <> "" Then
           Listbox1.AddItem Chr$(65 + i) & ":\" ' si tu veux choisir dans une listbox
        End If
      Next
    un peu moins rapide que mon code précédent mais plus rapide que FSO.

    EDIT (et au passage) : une discussion a été fermée aujourd'hui (une histoire d'identification de clé USB en vue d'y écrire).
    Il suffirait à ce demandeur de "marquer" sa fameuse clé par la présence, en sa racine, d'un fichier (nommé par exemple "abracadabra". Un simple dir lui permettrait alors de vérifier que sa clé usb est bien là et d'en identifier la lettre).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui mais on a pas les noms dans le cadre de cle usb ou disque amovible c'est important

    il y a bien getlogicaldrivestring() avec kernel aussi mais je suis pas sur pour les noms j'ai divers vieux exemple mais un peu usine a gaz
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    j'ai reduit a l'essentiel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
    Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
    Private Sub CommandButton1_Click()
            For i = 0 To 25
                   If (GetLogicalDrives() And 2 ^ i) <> 0 Then
                lettre_disque = Chr$(65 + i) & ":\"    ' si tu veux choisir dans une listbox
                Debug.Print lettre_disque & " son nom est " & GetVolumeName(lettre_disque)
            End If
        Next
    End Sub
    Function GetVolumeName(ByVal cDrive As String) As String
        Dim sBuffer As String
        sBuffer = Space$(500)
        GetVolumeInformation cDrive, sBuffer, Len(sBuffer), 0&, 0&, 0&, vbNullString, 0&
        GetVolumeName = Trim(sBuffer)
    End Function
    EDIT (et au passage) : une discussion a été fermée aujourd'hui (une histoire d'identification de clé USB en vue d'y écrire).
    je suppose que comme ca disait un truc du genre
    "en fait je suis étudiant et je veux......"

    ca n'a pas du plaire a un modérateur
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Super. Je ne connaissais pas GetLogicalDrives et je n'avais pas pense a DIR.

    Merci.
    Cordialement

    Docmarti.

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    pour avoir des infos système, ne pas oublier la possibilité d'utiliser ce "lourdaud" de WMI.

    avec ce code par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public Sub LecteursDisponibles()
    Dim sWQL As String
    Dim oWMISrvEx, oWMIObjSet As Object
    sWQL = "Select DeviceID,Description,SystemName,FileSystem,DriveType,Mediatype From Win32_LogicalDisk"
    Set oWMISrvEx = GetObject("winmgmts:root/CIMV2")
    Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
    For Each oWMIObjEx In oWMIObjSet
    For Each oWMIProp In oWMIObjEx.Properties_
    If Not IsNull(oWMIProp.Value) Then
    If IsArray(oWMIProp.Value) Then
    For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
    Debug.Print oWMIProp.Name & "(" & n & ")", oWMIProp.Value(n)
    Next
    Else
    Debug.Print oWMIProp.Name & " : " & oWMIProp.Value
    End If
    End If
    Next
    'End If
    Debug.Print "==============================="
    Next
    Set oWMISrvEx = Nothing
    Set oWMIObjSet = Nothing
    End Sub
    j'obtiens ceci :
    Description : Disque fixe local
    DeviceID : C:
    DriveType : 3
    FileSystem : NTFS
    MediaType : 12
    SystemName : PC-LCM2
    ===============================
    Description : Disque fixe local
    DeviceID : D:
    DriveType : 3
    FileSystem : NTFS
    MediaType : 12
    SystemName : PC-LCM2
    ===============================
    Description : Disque CD-ROM
    DeviceID : E:
    DriveType : 5
    MediaType : 11
    SystemName : PC-LCM2
    ===============================
    Description : Disque fixe local
    DeviceID : F:
    DriveType : 3
    FileSystem : NTFS
    MediaType : 12
    SystemName : PC-LCM2
    ===============================
    Description : Disque amovible
    DeviceID : W:
    DriveType : 2
    SystemName : PC-LCM2
    ===============================
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    je ne trouve pas WMI lourdaud (aucune déclaration d'API) bien au contraire comme dans cette récente discussion

    Apparemment Doc cherche juste le dernier disque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function DernierDisque$()
        Dim oDisks As Object, oDisk As Object
        Set oDisks = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_LogicalDisk")
        For Each oDisk In oDisks:  DernierDisque = oDisk.DeviceID & "\":  Next
        Set oDisks = Nothing
    End Function
     
    Private Sub Choisir_Un_Lecteur_Disponible()
     
    chemin = InputBox("", "Entrez le lecteur choisi", DernierDisque)
     
    End Sub
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Merci J.P. Interessant ton WMI.

    Merci a tous.
    Cordialement

    Docmarti.

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    @Marc peut avoir le VolumeName avec WMI?????

    j'ai rien trouvé sur ce point
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    c'est bon j'ai trouvé au piff!!! c'est pareil qu'avec l api

    "volumeName"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Salut Patrick !

    En affichant les démonstrations de la discussion en lien dans mon précédent post …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    c'est bon!! j'ai trouvé tout seul , j'ai reussi a faire ce que je fait avec l'api ou le fso

    dans le input tu a la liste des disque dispo dans la catégorie choisie et le dernier disque sélectionné comme ton exemple
    attention les indexs de type sont différent qu'avec l'api ou le FSO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function Disques(TpE As Long, liste) As Variant
        Dim oDisks As Object, oDisk As Object, Tp, typDisk As String
        Tp = Array(, , "USB", "disque Dur", , "DVD/CD ROM")
        If TpE <> 0 Then typDisk = "Where DriveType =" & TpE
        Set oDisks = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_LogicalDisk " & typDisk)
        For Each oDisk In oDisks: d = d & oDisk.DeviceID & "\" & vbCrLf: liste = liste & Tp(oDisk.DriveType) & "---" & oDisk.DeviceID & "\  ---" & oDisk.VolumeName & vbCrLf: Next
        Disques = Split(d, vbCrLf)
        Set oDisks = Nothing
    End Function
     
    Private Sub Choisir_Un_Lecteur_Disponible()
    d = Disques(2, liste)          '2 pour les clefs USB ,    3 pour les autre disques ,    5 pour les dvdrom/cdrom,   0 pour tout type de disques
    chemin = InputBox(liste, "Entrez le lecteur choisi", d(0))
    'ou pour le dernier disque disponible dans le type precisé
    'chemin = InputBox(liste, "Entrez le lecteur choisi", d(UBound(d) - 1))
     
    End Sub
    Nom : demo2.gif
Affichages : 838
Taille : 166,3 Ko
    c'est classe non?

    Attention tout de meme !!!! des l'ors que la cle fait 64 giga elle n'est pas considérer comme une cle mais un disque avec WMI
    donc si on choisi 2 (usb) elle ne figure pas dans la liste
    pas ce soucis avec les api
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Choisir un emplacement de destination
    Par witch dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/02/2009, 12h10
  2. Choisir un disque dur
    Par varex dans le forum Composants
    Réponses: 8
    Dernier message: 14/12/2008, 18h08
  3. Choisir un Disque Dur Externe
    Par miketidy dans le forum Périphériques
    Réponses: 6
    Dernier message: 24/09/2008, 18h12
  4. Réponses: 10
    Dernier message: 15/01/2007, 09h17
  5. [Disque Dur]Comment choisir mon disque dur (vitesse)
    Par pierrot10 dans le forum Composants
    Réponses: 4
    Dernier message: 07/09/2006, 02h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo