Programmation VBA Excel 2007

Fermé
yapson2011 Messages postés 4 Date d'inscription lundi 12 septembre 2011 Statut Membre Dernière intervention 25 septembre 2011 - 12 sept. 2011 à 12:59
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 20 sept. 2011 à 07:48
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

A voir également:

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
12 sept. 2011 à 16:47
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
yapson2011 Messages postés 4 Date d'inscription lundi 12 septembre 2011 Statut Membre Dernière intervention 25 septembre 2011
13 sept. 2011 à 13:28
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
13 sept. 2011 à 14:25
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
yapson2011 Messages postés 4 Date d'inscription lundi 12 septembre 2011 Statut Membre Dernière intervention 25 septembre 2011
14 sept. 2011 à 18:29
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
15 sept. 2011 à 07:57
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 sept. 2011 à 10:33
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 sept. 2011 à 14:07
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 20/09/2011 à 07:48
abandon du suivi suite à demande technique sur MP
0