Convertir les données copiées avec ADODB connection d'un classeur fermé

Cydor007

XLDnaute Occasionnel
Bonjour,

J'ai ici un tableau dont les valeurs ont été copiées avec la fonction ADODB connection.

Mon problème est que je ne suis plus capable de filtrer la colonne D (# outil) en ordre numérique. C'est comme si les données ne sont plus en format texte. Même un fonction recherche V ne trouve même pas une définition dans la colonne E (Description). Même si mes colonnes sont en format Texte, le filtre ne fonctionne pas.

Voici le code que j'utilise pour copier les données d'un classeur fermé:

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 = "Q:\Ingenierie\Outil De Conception\Identification d'outillage\Registre des accessoires\Registre des accessoires de moule_1.xlsm"
'Nom de la feuille dans le classeur fermé
NomFeuille = "Liste unique"

Set Cn = New ADODB.Connection

'--- 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=NO;IMEX=1;""" 'IMEX=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
Feuil15.Range("A1").CopyFromRecordset Rst

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

Le code fonctionne à merveille. C'est le filtrage et la recherche qui ne fonctionne plus.

Je vous laisse une copie de mon tableau pour vous amusez.

Merci de votre Aide.

Cydor007 :)
 

Pièces jointes

  • tableau.xlsm
    287.8 KB · Affichages: 44

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour,

J'ai ici un tableau dont les valeurs ont été copiées avec la fonction ADODB connection.

Mon problème est que je ne suis plus capable de filtrer la colonne D (# outil) en ordre numérique. C'est comme si les données ne sont plus en format texte. Même un fonction recherche V ne trouve même pas une définition dans la colonne E (Description). Même si mes colonnes sont en format Texte, le filtre ne fonctionne pas.


Cydor007 :)
les cellules fusionnées et base de données ne font pas bon ménage !!!
- Déprotéger la feuille
- Supprimer le contenu de la ligne 2
 

job75

XLDnaute Barbatruc
Bonjour Cydor007, Modeste geedee, tatiak,

Si c'est ce que vous voulez, pour convertir les données textes de la colonne D en nombres :
Code:
Sub Conversion()
Dim t, i&
With [A3].CurrentRegion.Columns(4)
  t = .Resize(, 2) 'au moins 2 éléments
  For i = 1 To UBound(t)
    If IsNumeric(CStr(t(i, 1))) Then t(i, 1) = CDbl(t(i, 1))
  Next
  .NumberFormat = "General" 'format Standard
  .Value = t
End With
End Sub
Edit : ajouté CStr() pour ne pas mettre de zéros en D1 et D2 car [A3].CurrentRegion englobe les lignes 1 et 2.

Remarque sur la méthode ADO : elle est utile pour gagner du temps quand on a beaucoup de fichiers fermés à traiter dans une même macro.

Si comme ici il n'y a qu'un seul fichier à traiter, il est bien plus simple de l'ouvrir par Workbooks.Open.

On peut faire ensuite tout ce qu'on veut avec ce fichier avant de le refermer.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Dans la foulée, pour convertir en nombres tout ce qui peut l'être dans les colonnes D:AY :
Code:
Sub Conversion()
Dim t, ncol%, i&, j%
With Intersect([D:AY], ActiveSheet.UsedRange.EntireRow)
  t = .Value 'matrice, plus rapide
  ncol = UBound(t, 2)
  For i = 1 To UBound(t)
    For j = 1 To ncol
    If IsNumeric(CStr(t(i, j))) Then t(i, j) = CDbl(t(i, j))
  Next j, i
  .NumberFormat = "General" 'format Standard
  .Value = t
End With
End Sub
Sur le fichier du post #1 la macro s'exécute chez moi (Win 10 - Excel 2013) en 0,25 seconde.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 033
Messages
2 084 806
Membres
102 674
dernier inscrit
Eloels