Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!!!

YANN-56

XLDnaute Barbatruc
Bonjour à tous,

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.
 

Fichiers joints

BrunoM45

XLDnaute Barbatruc
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
Utilisation d'ADO avec des données Excel à partir de Visual Basic ou de VBA

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.

A+
 

YANN-56

XLDnaute Barbatruc
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!

Bonsoir Bruno, et à ceux qui passeront par là,

Un problème grave peut se produire si une colonne contient à la fois des valeurs numériques et du texte.
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!) :)

Merci encore, et bonne soirée.

Yann
 

klin89

XLDnaute Impliqué
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 :

site:developpez.net Ado +Excel 8.0;IMEX=1
et y ai trouvé des sujets similaires, si cela peut te servir :D

[Toutes versions] Problème Recordset ADO [Résolu] - Forum des professionnels en informatique

Pb : Méthode ADO : ne rapatrie pas toutes les données [Résolu] - Forum des professionnels en informatique

Klin89
 

Habitude

XLDnaute Accro
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!

Bonjour Yann, le forum

Solution que je n'affectionne pas particulièrement.
Avec ajout d'une feuille qui copie les Entete.
Feuille qui est évidemment masquée
 

Fichiers joints

YANN-56

XLDnaute Barbatruc
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!
 

Fichiers joints

Dernière édition:

YANN-56

XLDnaute Barbatruc
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.:):):)

Yann
 

Fichiers joints

YANN-56

XLDnaute Barbatruc
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.

Yann
 

Fichiers joints

MJ13

XLDnaute Barbatruc
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 :confused:. As tu essayer de séparer les en-têtes et les données pour ne pas avoir à faire des transformations?

Sinon ODBC, pourrait peut-être t'aider :).
 

YANN-56

XLDnaute Barbatruc
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.

Yann
 
G

Guest

Guest
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.

A+
 

YANN-56

XLDnaute Barbatruc
Re : Copie Feuille par Méthode "ADO" Ok! Mais une cellule Manque... Incompréhensible!

Bonjour Hasco, et à ceux qui passeront par ici,

J'ai bien regardé du coté "IMEX", mais je n'y ai pas compris grand-chose! Je ne suis pas très doué!
(Je vais y retourner)

L'action "Copier" est à peu près résolue. Ce n'est que celle d'écrire qui reste en chantier!

Merci pour ton aide,

et ta remarque:

Pour le reste, je n'ai pas le courage de lire toute cette littérature.
En effet, je suis bavard, il faut que je fasse attention! :)

Amicalement, et bonne fin de semaine,

Yann
 

Haut Bas