Userform

Résolu
Bonjour Le forum,
j'ai un userform avec un combobox pour alimenter les données de l'userform et les remplir dans un classeur par la suite.
je souhaiterais récupérer la liste dans un classeur fermé
j'ai essayé ce code mais il me met une erreur 13
merci pour votre retour
belle journée
Sub Nom_Freelance_Change()

Workbooks.Open "C:\Users\Sandrine\Desktop\CANDIDATS\CANDIDATS implémentés dans le Book\BOOK candidats_ Version FINALE en cours.xlsm"
ActiveWindow.WindowState = xlMinimized

Nom_Freelance.RowSource = Sheets("GLOBAL").Range("A2:A4000")

End Sub

4 réponses

Résumé de la discussion

Problématique centrale : récupérer une liste pour alimenter un combobox à partir d'un classeur fermé en VBA, l'erreur 13 (type mismatch) apparaissant lors de l'ouverture et de l'affectation de RowSource. Des réponses proposent plusieurs approches: utiliser une connexion ADODB/Jet OLEDB pour interroger une feuille d'un classeur fermé, employer une macro Excel 4 via ExecuteExcel4Macro, ou lire les cellules avec une fonction dédiée. D'autres pistes mentionnent des détails pratiques comme le nom exact du fichier, le nom de la feuille et la plage A2:A4000, ou la nécessité d'ouvrir le classeur avant d'alimenter le contrôle. En cas de fichier au format différent (.xlsm vs .xlsb) ou d'incompatibilité de chaîne de connexion, il est recommandé de normaliser l'extension et de vérifier l'accessibilité du chemin.

Bobot (l’IA à votre service)
  1. Bon jour,

    https://answers.microsoft.com/fr-fr/msoffice/forum/all/executeexcel4macro/03971baf-a1ce-4407-bbdc-2a96ee3e7697
    En utilisant la fonction:
    Function LireClosedCell(Dossier As String, _
    Fichier As String, Feuille As String, Adr As String)


    vous arriverez a vos fin.

    un exemple (salut michel_m):
    Userform
    Private Sub CommandButton1_Click()
        Dim Dossier As String, Fichier As String, Feuille As String, Adr As String
        
        Dossier = "E:\_Docs_Prog_Excel\_Excel_a_traiter\Excel_ferme_ado_xl4\michel_m_recup_x_fichier\"
        Fichier = "sv1.xls"
        Feuille = "Feuil1"
        
        For n = 1 To 18     'nombre de cellule a recuperer
            Adr = "B" & n    'colonne et ligne
            VC = LireClosedCell(Dossier, Fichier, Feuille, Adr)
            ComboBox1.AddItem VC
        Next n
    End Sub


    Module
    Function LireClosedCell(Dossier As String, Fichier As String, Feuille As String, Adr As String)
        Dim R As Long, C As Long, F As String
        R = Range(Adr).Row
        C = Range(Adr).Column
        F = ("'" & Dossier & "[" & Fichier & "]" & Feuille & "'!R" & R & "C" & C)
        LireClosedCell = ExecuteExcel4Macro(F)
    End Function


    Par contre 3999 items dans une combobox, ca pique les yeux
    1
    1. Bonjour f894009
      alors j'ai essayé ton code en modifiant pour mon fichier.
      il m'ouvre le chemin et je dois sélectionner le fichier correspondant ... je pensais qu'il ne l'ouvrait pas ;(
      après il me met une erreur d'exécution '-2147352571(800200005)
      et surligne mon texte titre de combobox .additemvc
      ma volonté était de retrouver le nom d'une personne dans le fichier fermé et de remplir les autres champs de mon userform..
      Sub Nom_Freelance_Change()

      Dim Dossier As String, Fichier As String, Feuille As String, Adr As String

      Dossier = "C:\Users\Sandrine\Desktop\PERSO\SOCIETE\Suivi SJTC\Candidats"
      Fichier = "Base de données Frelance.xls"
      Feuille = "GLOBAL"

      For n = 3 To 4000 'nombre de cellule a recuperer
      Adr = "A" & n 'colonne et ligne
      VC = LireClosedCell(Dossier, Fichier, Feuille, Adr)
      Nom_Freelance.AddItem VC
      Next n
      End Sub


      Merci par avance
      belle journée
      0
    2. @titi17-08Bonjour,

      Manque un "\" en fin de chemin de, votre classeur variable Dossier
      0
    3. @f894009Bonjour f894009
      Je vous remercie pour votre aide,
      j'ai ecris cela et j'ai une erreur indice n'appartient pas a la selection .. j'avoue que je suis un peu paumé
      merci et belle journée

      Sub CommandButton1_Click()
      Dim RechercheNom As String
      Dim chemin As String
      Dim Fichier As String
      Dim Plage As String
      Dim req_SQL As String
      Dim c As Range
      'Plage = Range(Cells(3, 1), Cells(3, 4000))
      chemin = "C:\Users\Sandrine\Desktop\PERSO\SOCIETE\Suivi SJTC\Candidats\"
      Fichier = "Base de données Freelance.xls"
      RechercheNom = InputBox(" Quel est le nom recherché ?")
      Dim Cn As ADODB.Connection

      'Définit le classeur fermé servant de base de données

      Set Cn = New ADODB.Connection

      '--- Connexion ---
      With Cn
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .ConnectionString = "Data Source=" & Fichier & _
      ";Extended Properties=Excel 8.0;"
      .Open
      With Worksheets("GLOBAL").Range("A3:A4000")
      MsgBox ("okt")
      Range("A3:A4000") = .Find(RechercheNom, LookIn:=xlValues)
      If Not c Is Nothing Then
      firstAddress = c.Address
      Do
      Me.Nom_Freelance.Value = RechercheNom
      Set c = .FindNext(c)
      Loop While Not c Is Nothing
      End If

      End With
      End With

      Cn.Close
      Set Cn = Nothing
      End Sub
      0
  2. Bonjour,
    je vais regarder cela et vous remets un commentaire par la suite
    merci encore
    belle journée excelldiene
    1
    1. Bonjour,

      Pouvez mettre votre fichier a dispo?
      Vous faites une connection ADO fichier ferme et semble-t-il vous voulez faire comme si ce fichier est ouvert excel, pas marche

      un exemple de code pour classeur xls si vous souhaitez plancher un peu avant de mettre a dispo votre fichier

      'Voici une macro qui permet de se connecter à un classeur afin d'extraire le contenu de la feuille nommée "Feuil1".
      'VBA

      Sub RequeteClasseurFerme()
          Dim cn As ADODB.Connection
          Dim Fichier As String
          Dim NomFeuille As String, texte_SQL As String
          Dim Rst As ADODB.Recordset
          
          'Définit le classeur fermé servant de base de données
          Fichier = "C:\monClasseurBase.xls"
          'Nom de la feuille dans le classeur fermé
          NomFeuille = "Feuil1"
          
          Set cn = New ADODB.Connection
          
          '--- Connection ---
          With cn
              .Provider = "Microsoft.Jet.OLEDB.4.0"
              .ConnectionString = "Data Source=" & Fichier & _
                  ";Extended Properties=Excel 8.0;"
              .Open
          End With
          '-----------------
          
          'Définit la requête.
          '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
          texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
          
          Set Rst = New ADODB.Recordset
          Set Rst = cn.Execute(texte_SQL)
          
          'Ecrit le résultat de la requête dans la cellule A2
          Range("A2").CopyFromRecordset Rst
          
          '--- Fermeture connexion ---
          cn.Close
          Set cn = Nothing
      
      End Sub


      Pour transmettre un fichier,
      Veillez a ce qu'il n'y ait PAS DE DONNEES CONFIDENTIELLES
      il faut passer par un site de pièce jointe tel que cjoint.com

      Allez sur ce site : https://www.cjoint.com/
      Clic sur parcourir,
      Cherche ton fichier,
      clic sur ouvrir,
      Clic sur "Créer le lien cjoint",
      Copier le lien,
      Revenir ici le coller dans une réponse...

      ou
      www.grosfichiers.com

      ou
      www.transfernow.net 'fichier jusqu'a 4G
      1
    2. Bonjour,

      Je recupere les fichier et regarde la chose

      Le fichier personnal.xlsb ne fait l'affaire, impossible a ouvrir!!
      Vous devez avoir un .xlsm

      "Base de données Frelance.xls" nom fichier dans votre code d'origine
      Base-de-données-Freelance.xlsx nom fichier mis a dispo
      Lequel est le bon car la chaine de connection n'est pas la meme
      2
      1. Les deux
        Un fichier basé de données et un fichier personal ou le code est dans le module créer un contrat normalement
        Merci
        0
      2. @titi17-08Re,

        Fichier base ok, mais xlsb pas ok, rien.
        Mettez un fichier xlsm a dispo pas de xlsb

        Quel version office avez vous?

        Ok, c'est bon pour xlsb. Nom fichier personaltest pas bon seulement personal

        Les entetes de colonne fichier base posent un petit probleme. Doivent etre sur une seule ligne



        Je reprends la chose demain
        0
      3. @f894009Bonsoir f894009,
        Merci pour votre aide
        je suis sous
        voici le fichier modèle qui est en lien avec le personal( a la base le fichier sous le nom de personal.xlsb, j'ai du le modifier pour l'enregistrer ailleurs..:( )
        Pour quelle raison l'entête doit etre sur une seule ligne ?( la recherche sera nulle car cellule fusionnées ?
        lien du fichier modele : https://www.cjoint.com/c/KIvtEMhj4pz
        Merci et belle soirée
        Titi
        0
      4. @titi17-08Bonjour,

        je suis sous
        L' abus d'acool est préjudiciable a la sante. Mais c'est vous que cela regarde.
        En attendant, votre office quel version?

        Pour quelle raison l'entête doit etre sur une seule ligne ?
        Beaucoup plus simple pour la requête SQL de recherche
        0
      5. @f894009Bonjour
        Pardon j’étais sous la fatigue hier soir
        Je travaille sur office 365 :)
        0