Récupération de données dans un classeur fermé pour des string > 255 caractères

Jackfly

XLDnaute Nouveau
Bonjour,

voici le code que j'utilise pour récupérer des données dans un classeur fermé
Code:
 ...
Do Until valcode = "" Or valcode = 0
            For i = 1 To 4
               indexcol = Application.WorksheetFunction.Choose(i, "b", "c", "d", "e")
               Worksheets("init").Cells(y - 26, i).Value = ExtraireValeur(sDossier, sFichier, sFeuille, indexcol & y)
            Next i
      y = y + 1
      valcode = ExtraireValeur(sDossier, sFichier, sFeuille, "B" & y)
Loop

avec la fonction Extrairevaleur suivante :
Code:
Public Function ExtraireValeur(ByVal Dossier As String, ByVal Fichier As String, ByVal Feuille As String, ByVal Cellule As String)
Dim Argument As String
    Argument = "'" & Dossier & "[" & Fichier & "]" & Feuille & "'!" & Range(Cellule).Address(, , xlR1C1)
    ExtraireValeur = ExecuteExcel4Macro(Argument)
End Function

Tout fonctionne à merveille sauf que... si le nombre de caractères présents dans la cellule à récupérer est > 255 , j'ai "#valeur" comme contenu de la cellule...
Pourquoi ?
J'ai pourtant lu que "le type de données String peut stocker des chaînes de longueur fixe dont la longueur est comprise entre 0 et environ 63k de caractères et des chaînes dynamiques dont la longueur est comprise entre 0 et environ 2 milliards de caractères".
Où est-ce que le bas blesse ? du côté de "ExecuteExcel4Macro" ?... comment y remédier ?
Merci pour votre aide
 
G

Guest

Guest
Re : Récupération de données dans un classeur fermé pour des string > 255 caractères

Bonjour, ou Re,

Je ne me souviens plus des limites des cellules excel 4 apparue en 1992 et dont le langage de macro a été pratiqué jusqu' à la version 7 (excel 95) mais oui, cela doit provenir de ExecuteExcel4Macro.

Sans doute devras-tu faire appel à ADO ou autre technique (Msquery) d'interrogation.

A+
 

Jackfly

XLDnaute Nouveau
Re : Récupération de données dans un classeur fermé pour des string > 255 caractères

Re,

Merci pour la confirmation...
J'ai trouvé un moyen de récupérer l'info via des liens OLE... mais cela ouvrait le fichier et il fallait le fermer après "usage"...pas top...

Je me suis donc rabattu sur le code de Frédéric Sigonneau trouvé ici (Ce site n'existe plus
Cela fonctionne à merveille !.

voilà ce que j'ai maintenant :
Code:
...
Do Until valcode = "" Or valcode = 0
            For i = 1 To 4
               indexcol = Application.WorksheetFunction.Choose(i, "b", "c", "d", "e")
               Worksheets("init").Cells(y - 26, i).Value = GetValueWithADO(ListView1.ListItems.Item(ListView1.SelectedItem.Index).Tag, sFeuille, Range(indexcol & y))
            Next i
       y = y + 1
       valcode = GetValueWithADO(ListView1.ListItems.Item(ListView1.SelectedItem.Index).Tag, sFeuille, Range("B" & y))
Loop

et voici la fonction de F.Sigonneau :
Code:
Function GetValueWithADO(Classeur$, Feuille$, Cell As Range)

Dim RcdSet As Object
Dim strConn As String
Dim strCmd As String
Dim dummyBase As Range
  
  'prépare une "base de données" bidon pour la clause SELECT
  '(une entête fictive et une ligne de données)
  Set dummyBase = Cell.Resize(2)
  
  'prépare les commandes ADO et SQL
  strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & Classeur & ";" & _
                "Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
  strCmd = "SELECT * FROM [" & Feuille & "$" & dummyBase.Address(0, 0) & "]"
  
  'crée l'objet Recordset
  Set RcdSet = CreateObject("ADODB.Recordset")
  
  'va chercher l'info
  RcdSet.Open strCmd, strConn, 0, 1, 1 'adOpenForwardOnly, adLockReadOnly, adCmdText
  
  'et la renvoie
  GetValueWithADO = Application.Clean(RcdSet(0))
  
  'nettoyage
  Set RcdSet = Nothing
End Function

Merci à lui... et à vous pour l'info et la "piste" à suivre...
Voilà "encore" un problème de résolu

@+
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 370
Messages
2 087 693
Membres
103 641
dernier inscrit
anouarkecita2