XL 2019 Combobox à partir d'un fichier fermé

gui64600

XLDnaute Nouveau
Bonjour,
Jai un fichier source.xlsm qui en colonne A de la feuille "source" contient des noms.
Je voudrais dans un autre fichier résultat.xlsm créer une combobox me permettant une saisie semi-automatique des noms du fichier source en cellule C2

Le fichier A est fermé.

Merci de votre aide
 

Dudu2

XLDnaute Barbatruc
Pareil...
1607236501324.png


1607236876178.png
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Je comprends rien à ton astuce. Je vois pas ce que le "m/d/yyyyy" qui est le NumberFormat (et pas le NumberFormatLocal) d'une date jj/mm/aaaa vient faire la-dedans.
J'attends de voir ce que donne ton code quand j'aurai pu le faire fonctionner.
 

patricktoulon

XLDnaute Barbatruc
alors tu a un soucis dans tes librairies
attention!!!!!
si tu a eu installé plusieurs versions d'excel cette librairie est presente dans ta liste sous plusieurs versions
si tu ne la pas réenregisté dans le registre manuellement tu ne dois plus l'utiliser il te faut prendre la derniere version perso je les ai toutes réenregistré pour pouvoir travailler avec des fichiers créé avec toute versions
Capture.JPG
 

patricktoulon

XLDnaute Barbatruc
Je comprends rien à ton astuce. Je vois pas ce que le "m/d/yyyyy" qui est le NumberFormat (et pas le NumberFormatLocal) d'une date jj/mm/aaaa vient faire la-dedans.
J'attends de voir ce que donne ton code quand j'aurai pu le faire fonctionner.
c'est ce que j'essaie de te dire "m/d/yyyy" ne veut pas dire mois/jour/année c'est un format spécial que office a intégré pour corriger le probleme d'inversion

ne le vois pas tel que sa syntaxe ;) mais plutôt comme un sauf conduit
 

Dudu2

XLDnaute Barbatruc
RsT.Open AdoComand, , 1 ', 3
Je retombe sur la 1ère erreur.

c'est ce que j'essaie de te dire "m/d/yyyy" ne veut pas dire mois/jour/année c'est un format spécial que office a intégré pour corriger le probleme d'inversion
Je ne connais pas ce format, mais en VBA si IsDate(DateTexte) => Date = CDate(DateTexte) et pas besoin de format magique et tu contrôles. C'est le CDate() qui est magique :)

De toutes façons en retour de SQL, avant de mettre un format Date, il faut déjà identifier que la donnée SQL texte est bien une date en texte. Donc il faut passer par un IsDate(DateTexte) pour le savoir. Et ensuite faire un CDate() et appliquer un format. Et des formats de date différents il y en a plein: voir mon tableau du Post #23 lignes 11 à 16 pour des exemples.
Et la difficulté est là qu'un format même magique "m/d/yyyy" ne résoudra pas.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Je retombe sur la 1ère erreur.


Je ne connais pas ce format, mais en VBA si IsDate(DateTexte) => Date = CDate(DateTexte) et pas besoin de format magique et tu contrôles.
heu... je vais mettre sur le compte que tu n'est pas bien réveillé 🤪
et datetexte il viens d'ou? et c'est quoi un string ou une date(pose toi les bonnes question)
je vais pas t'apprendre qu'un string de date est inversé automatique si il est injecté en string

demande toi quels sont les formats dans arr du string, des dates, des nombres
si c'est du string les dates vont forcément etre inversée ?
alors on les inverses
mais que dis je donc si je les inverse les cellules vont me les réinverser?
ok l'affichage est bon mais leur value est est elle correcte ?
ho ben ça par exemple leur value est identique a l'affichage

demo7.gif
 

Dudu2

XLDnaute Barbatruc
J'ai pu faire marcher ton code avec ton fichier base.xlsx.

En effet, merci, c'est une belle démonstration pour le format ""m/d/yyyy"" qui agit sur la variable pour la mettre au "bon" format date.

Plusieurs remarques:
1 - Pour le chargement en cellule:
[A1].Value = CDate(Arr(A))
[A1].Value = Format(CDate(Arr(A)), "m/d/yyyy")
sont strictement équivalents et donnent le même résultat.

2 - Si la date est dans un autre format que jj/mm/aaaa (20-03-1970 10:30 ou 20 mar 1970), cette manip rendra toujours jj/mm/aaaa (20/03/1970).

3 - En formatant ainsi la variable date directement dans le tableau rendu par SQL, on se prive de pouvoir analyser ce format texte SQL pour en déduire un format de cellule correspondant (jj-mm-aaaa hh:mm ou jj mmm aaaa), ce que je fais dans mon code du Post #8 pour formater correctement les cellules du Range cible.

4 - Ton code ne fonctionne pas avec mon fichier de test ci-joint qui est bien plus complet en A1:A20 que ton jeu d'essai limité à quelques dates uniquement jj/mm/aaaa, quelques nombres toujours entiers, et quelques textes.
1607258453487.png

D'ailleurs ton code plante pour un rien. J'ai remplacé "fifi" par le chiffre 40 et ça plante.

5 - Prends mon fichier de test ci-joint Range A1:A20 et essaie d'obtenir les valeurs qui résultent de mon code en colonne E du tableau du Post #23. Je peux te dire, encore une fois, que c'est impossible puisque le texte rendu par SQL n'est pas formatable par Excel directement, à quelques exceptions près. Il faut donc faire du code pour analyser le texte et définir les bons formats des cellules.
 

Pièces jointes

  • ClasseurTestSQL.xlsx
    9.9 KB · Affichages: 5
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bien sur que c'est impossible tu ne peut pas tout faire avec ado il y aura des formats qui vont sauter
c'est sur ado n'est pas fait pour ca
et puis ton post #23 aiguillant sur ton post #8 non mais ca va pas non!!!!????
tu utilise excel4macro et Ado
tu biaise les résultats 😂

cependant me permet tu un dernier essai?
VB:
Sub test_récup_plage()
    Dim fichier$, Tbl
    fichier = ThisWorkbook.Path & "\BASE.xlsx"    'à adapter
    Tbl = GetcolumnValueOnClosedWbookskeepblank(fichier, "A1:A20", "Feuil1", False)
    'With ActiveSheet.ComboBox1: .Clear: .List = Tbl: End With
    Sheets("Feuil2").[A1].Resize(UBound(Tbl), 1) = Tbl
End Sub

Function GetcolumnValueOnClosedWbookskeepblank(fichier As String, RnG As String, Feuille As String, Optional headerTable As Boolean = False)
    Dim AdConn As Object, AdoComand As Object, HDR$, RsT As Object, RsTLigne&, RsTCol&, v$, Arr()
    Set AdConn = CreateObject("ADODB.Connection")
    Set AdoComand = CreateObject("ADODB.Command")
    Set RsT = CreateObject("ADODB.RecordSet")
    HDR = Array("No", "Yes")(Abs(headerTable))
    AdConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fichier & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1"""
    AdoComand.ActiveConnection = AdConn
    AdoComand.CommandText = "SELECT * from `" & Feuille & "$" & RnG & "`"
    RsT.Open AdoComand, , 1    ', 3
    RsT.MoveFirst
    Do While Not RsT.EOF
        For RsTLigne = 1 To RsT.RecordCount  'lignes
            If Not IsNull(RsT.Fields(0).Value) Then a = a + 1: ReDim Preserve Arr(1 To a): Arr(a) = RsT.Fields(0).Value
            If Not Arr(a) Like "*[A-z,:,€]*" Then
                If IsDate(Arr(a)) Then Arr(a) = Format(CDate(Arr(a)), "m/d/yyyy")
            Else
            Arr(a) = "'" & Replace(Arr(a), ",", ".")
            End If
            RsT.MoveNext
        Next
    Loop

    MsgBox "je fout le boxon j'inverses le format de date" & vbCrLf & Join(Arr, vbCrLf)
    AdConn.Close: Set RsT = Nothing: Set AdoComand = Nothing: Set AdConn = Nothing
    GetcolumnValueOnClosedWbookskeepblank = Application.Transpose(Arr)
End Function
voyons voir
demo7.gif


😁
 

Dudu2

XLDnaute Barbatruc
tu utilise excel4macro et Ado
tu biaise les résultats
J'utilise Excel4macro quand le Range à copier n'est constitué que d'une seule cellule car la requête SQL ne fonctionne pas dans ce cas. C'est donc pour couvrir tous les cas que je fais ça, ce que tu ne fais pas.
Je ne biaise rien du tout, c'est toi qui biaise l'interprétation du code.
et puis ton post #23 aiguillant sur ton post #8 non mais ca va pas non!!!!????
Si tu n'avais pas relancé l'affaire on en serait resté au post #8 😈

J'ai essayé ton dernier code (contrairement à toi qui n'as jamais essayé le mien, je te connais ;))
Et voici le résultat comparatif... En jaune ce qui ne va pas dans ton résultat. Et avec ta méthode tu n'es pas près d'y arriver. Mais je veux bien essayer ta prochaine version 😍

1607274768895.png
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
j’essaierais tout a l'heure le tiens c'est bien le post #8 ?
mais déjà recalculé j'aime pas ça Ado c'est Ado et rien d'autre
j'ai eu une autre idée dans la matinée mais j’étais trop occupé a autre chose
il m'est venu a l'idée de faire carrément un tableau de format mais là je suis sur un autre coup
 

Dudu2

XLDnaute Barbatruc
Ok essaie tout ce qui te vient à l'esprit, il peut y avoir des choses auxquelles je n'ai pas pensé.
J'avais pensé au tableau des formats mais comment les récupérer par SQL ? That is the question !

mais déjà recalculé j'aime pas ça Ado c'est Ado et rien d'autre
Dans ce cas, il faut se contenter du texte et ne pas chercher à avoir des données autres que texte dans un Range cible à quelques exceptions près gérées par Excel, qui d'ailleurs, par souci de cohérence, devraient être inhibées en formatant le Range.NumberFormat = "@" avant affectation de la table.

Ceci dit il y a une solution hyper-simple... Ouvrir le classeur source et l'affaire est réglée.
Mais bon, l'idée c'est de rester sur le principe du classeur fermé.
 
Dernière édition:

Discussions similaires