Programmation VBA Excel 2007

yapson2011 Messages postés 4 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je voudrais pouvoir à partir d 'un userform :
1 - accéder à une plage (cellule spécifiée, ligne spécifiée après l'instruction Find dans une colonne) d'une feuille nommée LISTE d'un classeur Excel 2007 fermé et partagé, extraire ces informations et les afficher dans une listview et dans le classeur appelant
2 - ajouter une ligne (enregistrement) à cette cette feuille en dernière position, informations transférées à l'aide d'un userform à partir de plusieurs postes avec l'instruction Range("A65536").End(xlUp)
3 - modifier une ligne spécifiée trouvée à l'aide de Find, modification opérée par plusieurs utilisateurs
Tous les codes obtenus sur le net et qui utilisent les instructions SQL et la connexion ADO ne s'exécutent pas ou pas correctement
Je signale que la connexion ADO m'interesse beaucoup car le classeur en question contient des photos dans des cellules (trombino) pour identifier des candidats. Son ouverture pendant la saisie ralentit le travail et des problèmes d'instabilité surviennent

Pourrais-je avoir des pistes de solution pour résoudre cet épineux problème qui me donne l'insomnie?

Merci

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    Tu parles d'appel de ton classeur fermé par ADO -ce qui n'ouvre pas le classeur mai s'y connecte le classeur restant fermé-, alors pourquoi FIND ? il me semble (pas sûr) que FIND travaille sur le classeur ouvert de m^me que la recherche de la dernière ligne...
    si tu cherches une valeur dans un champ avec ADO la syntaxe SQL sera du genre
    "SELECT lesdifférentschamps FROM latableduclasseur WHERE lechamp=lavaleurcherchée";"
    

    Autre chose: c'est une erreur de coller les photos dans XL( grand ralentissement comme tu l'as constaté): il faut les mettre dans un répertoire et appeler la photo

    voilà, mais il faudrait que tu sois plus précis
    pour joindre une pièce
    mettre les classeurs (l'opérateur et le serveur) sans données confidentielles en pièce jointe (format XL97-2003) sur
    https://www.cjoint.com/
    et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse

    mais ce que tu demandes pourrait se faire tranquilou avec access sans peut-être trop utiliser VBA ....
    0
    1. yapson2011 Messages postés 4 Statut Membre
       
      Bonjour michel,

      En réalité, j'enregistre des candidats à l'inscription d'un concours à l'aide d'un classeur partagé d'excel 2007 localisé dans un dossier partagé. La feuille a une ligne d'en- tete (Nbre | NumCand | Sexe | Nom | Prenoms | DateNaiss). A chaque saisie dans un userform (ce dernier classeur contient les codes et est copié sur tous les postes), les données sont ajoutées (dernière ligne) dans la feuille . Je peux modifier une ligne (fiche) ou une cellule, consulter une ligne ou la modifier. Les photos ne sont insérées (à partir des numéros des candidats) que pendant l'élaboration des listes de salle et l'édition des résultats (admissibilié et admission). Cela marche mais le classeur partagé pose des problèmes d'ouverture et de sauvagarde, donc d'instabilité. Alors l'on m'a conseillé d'utiliser Ado connexion pour lire et écrire dans un classeur fermé. Malheureusement je n'y arrive pas. Aussi, je ne connais pas Access. Je vais m'y mettre mais pas maintenant compte tenu de l'urgence.

      Le lien https://www.cjoint.com/?AInm77ZCR84

      Merci de m'aider
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Guère de temps cet après midi, je te conseille donc de lire ce tuto
    https://silkyroad.developpez.com/VBA/ClasseursFermes/
    qui te donnera un aperçu de la technologie ADO et pourra t'aider dans tes questions éventuelles (on peut améliorer les techniques indiquées notamment en se dispensant de cocher les références à ADO)
    https://silkyroad.developpez.com/VBA/ClasseursFermes/

    concernant les photos, il faudra revoir le systeme car le numéro d'inscription sera donné par le classeur partagé
    Tu trouveras ci joint un exemple de gestion de photos (trombinoscope) que j'avais réalisé pour l'association 1901 d'un forumeur CCM qui te fournira peut- ^tre une piste
    https://www.cjoint.com/?3InortrO67a

    désolé pur cet aprèm!
    0
  3. yapson2011 Messages postés 4 Statut Membre
     
    Bonjour Michel,

    J'ai adapté le code de silkyroad comme suit :

    Sub LireClasseurFerme()
    '
    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 qui contient une feuille avec la première ligne
    'comme ligne des champs : Nbr|NumCand|Sexe|Nom|Prenoms|DateNaiss
    'La feuille Liste contient les données
    Fichier = "e:\ClasseurFermé.xlsx"

    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Liste$"

    '--- Connexion ---
    Set Cn = New ADODB.Connection
    With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    .Open
    End With

    '..... Définit la requête.

    Texte_SQL = "SELECT * FROM [" & NomFeuille & "]"
    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(Texte_SQL)

    'Ecrit le résultat de la requête (ici toute la base) dans la cellule A2 de la feuille active du classeur actif
    Range("A2").CopyFromRecordset Rst

    '
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
    '
    End Sub

    J'ai adapté et çà marche mais j'aimerais spécifier un classeur donné pour le résultat de la requête. Je veux comprendre les différentes commandes

    De même, les modules "Ajouter un enregistrement", "Modifier les enregistrements" ne fonctionnent pas dans Excel 2007 sous Vista. En particulier

    Merci et bon après midi

    yapson2011
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      Je serai absent toute la journée. donc réponse ce soir ou demain: Beaucoup de choses à dire sur ton envoi.

      merci de mettre tes codes ente les balises de l'onglet "<>" en haut des messages... :o)
      0
    2. yapson2011
       
      Bonsoir Michel,

      Est-il possible d'avoir un mail pour t'envoyer les codes (ou tout le projet) par pièce jointe? Le site http://cjoint.com/ ne fonctionne pas très bien., je n'ai pas réussi à ouvrir ton exmple sur l'association 1901

      Merci et à demain sinon à lundi. Bon week end
      0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    P...! je viens de perdre pour la 2° fois tout le baratin que je t'avais préparé (micro coupures electricité):-((

    ci dessous code d'extraction des inscrits sain et sauf

    Option Explicit
    Public Source As Object
    Const Fichier  As String = "e:\ClasseurFermé.xlsx"
    Const Plage  As String = "T_inscrits"
    
    Sub Extraire_liste_inscrits()
    Dim Requete As Object
    
    se_connecter
    
    '..... Définit la requête.
    Set Requete = CreateObject("ADODB.Recordset")
    Set Requete = Source.Execute("SELECT * FROM [" & Plage & "]")
    
    'Ecrit le résultat de la requête (ici toute la base) dans le  classeur actif
    Sheets(1).Range("A2").CopyFromRecordset Requete 'sheets(1) à adapter
    '
    '--- Fermeture connexion ---
    Requete.Close
    Source.Close
    Set Requete = Nothing
    Set Source = Nothing
    '
    End Sub
    
    Sub se_connecter()
    '--- Connexion ---
    Set Source = CreateObject("ADODB.Connection")
    With Source
         .Provider = "Microsoft.Jet.OLEDB.4.0"
         .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
         .Open
    End With
    
    End Sub
    


    je reviens avec des explications (sur Word que je puisse sauvegarder)
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      la plage "A1:F1" est nommée "T_inscrits"

      la macro est coupée en Z car "se connecter" va être utilisée pour l'ajout et la modification, donc inutile de la recopier N fois...

      le fait de déclarer en "object et d'utiliser
      set xxx=createobject(".......") évite d'avoir à cocher les références sur chaque poste

      ces macros sont à installer dans les classeurs "source" de chaque opérateur

      j'attends de tes nouvelles avant de continuer mon pensum
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      abandon du suivi suite à demande technique sur MP
      0