Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Tout est bien importé, mais je n'arrive pas à comprendre pourquoi
en Ligne 4, l'entête de la Colonne I "Code" est absente.
Cela me pose de gros soucis pour la suite de mon projet.
J'ai vérifié qu'il n'y avait pas de mises en forme particulières
dans la Feuille pompée "ABONNES" du Classeur "DONNEES" ni de liens, fusion, ou autre particularité!
Je pourrais le rectifier en écrivant "Code" dans cette Cellule vide, mais cela ne me plait pas du tout,
car l'utilisateur aurait bien pu préférer "Codes Postaux" à "Code" dans la Feuille d'origine.
Après moult tentatives infructueuses, je me résous à demander votre aide.
Merci par avance,
Yann
Joints: Le Classeur Moteur, et le Classeur Données à mettre dans un même répertoire.
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Salut YANN-56
Si tu transformes la colonne par des valeurs texte avec apostrophe devant
cela fonctionne parfaitement !
Petite info Ce lien n'existe plus
Citation : Avertissement concernant les types de données mixtes Comme mentionné plus haut, ADO doit tenter de déterminer le type de données pour chaque colonne de votre plage ou feuille de calcul Excel. (Les paramètres de mise en forme des cellules Excel n'ont aucune incidence sur ce processus.) Un problème grave peut se produire si une colonne contient à la fois des valeurs numériques et du texte. Les fournisseurs Jet et ODBC renvoient tous deux les données du type majoritaire dans la colonne, mais renvoient des valeurs NULL (vides) pour le type de données minoritaire. Si les deux types sont représentés en proportions égales dans la colonne, le fournisseur choisit le type numérique.
Effectivement, dans une autre application,
J'ai été amené à mettre des apostrophes dans toutes les cellules de la Feuille à pomper,
(D'autant qu'un p'tit con d'ingénieur de production aimait y fiche le Bordel pour taquiner Pépé!)
Cela imposait d'ouvrir le Classeur Cible (Sous VBA, il s'entend), et de venir l'ajouter si absente,
puisqu'il est évident que l'on ne peut pas demander à utilisateur de le faire!
(Mais cela était assez long. Du genre 22000 Lignes avec 14 Colonnes)
J'avais, dans le cas présent pensé l'éviter, au cas où, pour gagner du temps!
Je vais voir s'il est possible de rapidement vérifier cette anomalie, et de n'apporter l'apostrophe que là
où il y en aurait besoin suite au mélange des Valeurs "Texte" et "Numérique",
Cela ne va pas être de la tarte à écrire, mais je vais m'y atteler.
Bravo à toi d'avoir su cibler l'origine du mal, et de m'avoir apporté efficace réponse.
Qu'il est bon de croiser des XLDNautes comme toi. (Quand je serai grand, j'en ferai de même... Promis!) 🙂
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonsoir Yann, Bruno
Je dois bien vous avouer que je n'ai jamais touché à la méthode ADO, mais la curiosité me pousse toujours à chercher via Google et j'ai fouillé comme ceci :
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonjour Bruno, Klin, Habitude, et à ceux qui passeront pas ici,
Merci beaucoup pour votre aide, et vos liens très instructifs.
Au regard de certains risques, j'ai préféré mettre ceci dans le Classeur comportant les Données.
On perd du temps; mais c'est expéditif! Et peu souvent à le subir!
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("ABONNES").Select
ActiveSheet.UsedRange.Select
Dim CELLULE As Range
For Each CELLULE In Selection
If Left(CELLULE, 1) <> "¥" Then
CELLULE = "¥" & CELLULE
End If
Next
ActiveWorkbook.Save
End Sub
D'autant qu'au final, personne n'aura à venir apporter des modifications directes dans ce dernier.
(Sauf l'administrateur, avec un PassWord)
Je joins les deux derniers Classeurs qui vous permettront de mieux comprendre où je veux en venir.
A présent, les modifications apportées ne le sont que dans la feuille "ABONNES" du Classeur Maître,
et il me reste à actualiser celle de la Base de Données.
J'avais songé à un "ADO" à l'envers, mais je ne pense pas que cela soit possible.
(Substituer la Feuille "ABONNES" du Classeur Maître à celle de la Base de Données)
Je pense utiliser "ExecuteExcel4Macro", en espérant que cette fonction soit toujours utilisable
avec les dernières versions d'Excel... Je vais fouiller pour me renseigner.
Qu'il est bon de ne pas se sentir seul quand on a essayé, pendant des heures, plein de trucs en vain!
Sincères Mercis, et plein de bonnes choses à vous,
Yann
P.S. Si j'ai utilisé le Yen plutôt que l'Apostrophe, c'est qu'ADO ignore cette dernière!
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonsoir à tous, Finalement, la méthode ADO est exploitable dans l'autre sens.😉
J'ai ajouté ce Module qui fonctionne:
Code:
Sub ENREGISTRER()
'(A ne pas oublier de cocher "Microsoft ADO Ext. 2.7 for DDL and Sécurity dans les Références)
Dim Cn As ADODB.Connection
Dim Cd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim Fichier As String
Fichier = ThisWorkbook.Path & "\DONNEES_2.xls"
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"";"
Set Cd = New ADODB.Command
Cd.ActiveConnection = Cn
Cd.CommandText = "SELECT * FROM [Feuil1$A1:A1]"
Set Rst = New ADODB.Recordset
Rst.Open Cd, , adOpenKeyset, adLockOptimistic
Rst(0).Value = "¥" & UserForm1.TextBox1.Text
Rst.Update
Cn.Close
Set Cn = Nothing
Set Cd = Nothing
Set Rst = Nothing
End Sub
Cependant j'ai été obligé de créer une Feuille "Feuil1"dans la base de données,
car je ne parviens pas à appeler la Feuille "ABONNES"
Car je suis infichu de traduire cette ligne avec "ABONNES + Cells(x,y)!
Cd.CommandText = "SELECT * FROM [Feuil1$A1:A1]"
J'ai planté Excel plus d'une fois dans mes tests!!!
Le rêve serait de faire une boucle sur la ListView détaillant les coordonnées de l'abonné choisi,
et d'enregistrer les modifications qui y ont été apportées.
Pas simple cette affaire! Mais si quelqu'un veut bien s'y pencher...
J'ai une boite de "Merci" qui est encore bien pleine.🙂🙂🙂
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonsoir à ceux qui passeront par ici, je réponds à moi-même...
Après chaque test, il faut supprimer la Feuille "RECEPTION" du Classeur "BASE",
et en créer une nouvelle du même Non
Il est indispensable de mettre au Format Texte ses cellules de A à N de la ligne 1.
Pas plus ni moins, et laisser les autres au Format Standard.
Cela est bien entendu automatisable, mais vous saurez le faire dans une Appli.
Quant à la forme de la Feuille à copier, il en est suffisamment dit ci-dessus.
Pardon aux "Puristes" d'avoir vulgarisé les variables qui font "Super-pro"
Voici le Code:
Code:
Sub TRANSFERER_VERS_BASE_DE_DONNEES() 'La référence "Microsoft ActiveX Data Object 2.x Library" doit être cochée!
Dim APPEL As New ADODB.Connection
Dim ENREGISTREMENT As New ADODB.Recordset, FEUILLE As ADODB.Recordset
Dim ECOUTE As ADODB.Connection, j As Integer
Dim CLASSEUR_CIBLE As String, CLASSEUR_SOURCE As String
CLASSEUR_CIBLE = ThisWorkbook.Path & "\BASE.xls" 'On pourrait remplacer par une Recherche du Classeur!
CLASSEUR_SOURCE = ActiveWorkbook.FullName
'------------------------------------------------------------------
APPEL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CLASSEUR_SOURCE & ";" & "Extended Properties=""Excel 8.0;HDR=NO;"""
ENREGISTREMENT.Open "SELECT * FROM [TRANSFERT$]", APPEL, adOpenStatic 'FEUILLE A POMPER
'------------------------------------------------------------------
Set ECOUTE = New ADODB.Connection
ECOUTE.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CLASSEUR_CIBLE & ";" & "Extended Properties=""Excel 8.0;HDR=NO;"""
Set FEUILLE = New ADODB.Recordset
FEUILLE.Open "Select * from [RECEPTION$]", ECOUTE, adOpenKeyset, adLockOptimistic ' FEUILLE DE DESTINATION
'------------------------------------------------------------------
Do While Not (ENREGISTREMENT.EOF) 'ON PROCEDE A L'ECRITURE
FEUILLE.AddNew
For j = 0 To FEUILLE.Fields.Count - 1
FEUILLE.Fields(j) = ENREGISTREMENT.Fields(j).Value
Next j
FEUILLE.Update
ENREGISTREMENT.MoveNext
Loop
ENREGISTREMENT.Close: APPEL.Close: FEUILLE.Close: ECOUTE.Close
End Sub
Et le deux Classeur pour tester.
Amicalement, et en me disant que cela pourrait intéresser quelqu'un.
Sans oublier de remercier à nouveau les intervenants ci-dessus, sans lesquels je ne serais pas allé plus loin.
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonjour Yann, Bruno, Klin, Hab
Ton truc, c'est intéressant mais bon, ce bug avec transformation de tout en texte, c'est quand même pas facile pour travailler avec 😕. As tu essayer de séparer les en-têtes et les données pour ne pas avoir à faire des transformations?
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
Bonjour Michel, aux participants, et à ceux qui passeront par là,
Tu as raison; il y a trop d'impératifs dans cette façon de procéder; mais si je persiste,
c'est que je n'ai pas trouvé plus simple; dans l'hypothèse d'une douzaine de postes en réseau.
(J'ai connu ce souci en entreprise, avec une Base de Données laissée ouverte toute une demi-journée!)
Le dernier point qui me reste à régler, est d'écrire par-dessus des données existantes,
et non à la suite comme demander ici:
Code:
Do While Not (ENREGISTREMENT.EOF) 'ON PROCEDE A L'ECRITURE
FEUILLE.AddNew
For j = 0 To FEUILLE.Fields.Count - 1
FEUILLE.Fields(j) = ENREGISTREMENT.Fields(j).Value
Next j
FEUILLE.Update
ENREGISTREMENT.MoveNext
Loop
La bonne mise en forme de la Base de Données est maintenant faite systématiquement,
lors de sa fermeture, dans le cas d'une modification manuelle. (Donc aucune manip à faire)
ODBC? Je vais voir...
Mais si j'arrive à résoudre le dernier point dont je parle ci-dessus; tout sera alors facile et clair.
Pour l'instant; je sèche. Si toi, ou quelqu'un d'autre m'aide ce serait super!🙂
Amicalement, et Merci pour ton encourageant message.
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!
bonjour à tous,
Je répond au post #1 du fil.
Il suffit de mettre le paramètre IMEX de la chaine de connexion à 1 pour que le nom du champ "Code" soit importer avec le reste. Par contre les codes postaux seront au format texte. Peut pas tout avoir.
Avec HDR=NO (par défaut) la colonne Code des données source est considérée comme numérique. "Code" étant une donnée texte il n'est pas importée. Avec IMEX=1, les colonnes mélangées sont considérées traitées comme des données Texte.
'Attention aux guillemets
Code:
With CONNEXION
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & CLASSEUR_A_FOUILLER & ";Extended Properties=""Excel 8.0;IMEX=1"""
.Open
End With
Pour le reste, je n'ai pas le courage de lire toute cette littérature.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD