XL 2021 Créer une requête SQL pour lire plusieurs Ranges?

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous
j'essaie de créer une requête SQL pour lire des Ranges (2 voire plus -Soyons fous 🤪) pour avoir un résultat en colonneS correspondant.
Voici mon code avec plusieurs essais de requêtes. J'y ai mis des commentaires au dessus de chacune d'elle.
Bien sûr il y a toujours la solution de faire une requête sur chaque Range et de créer le tableau compilant les résultats mais pourquoi faire simple 😁
Si quelqu'un a une ou des idées par avance merci à vous

VB:
Sub Test1()
Dim Fichier, ConnectString
Dim Query_str
Dim arr, arr2
Dim RsTLigne, RsTCol

'===== Early Binding !! =========
Dim ADOConn As ADODB.Connection
Dim AdoComand As ADODB.Command
Dim RsT As ADODB.Recordset

  Set ADOConn = New ADODB.Connection
  Set RsT = New ADODB.Recordset
  Set AdoComand = New ADODB.Command
 
  Fichier = ActiveWorkbook.FullName
 
  ConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""
  
  ADOConn.Open ConnectString

'' => OK MAIS:
'' Le 1er RANGE du SELECT DOIT INCLURE la zone du RANGE du 2éme SELECT (celui du IN): Ici [Feuil1$A2:B11] et [Feuil1$B2:B11]
'' Close WHERE ET IN à créer complexe si plus de 2 Ranges. Pas testé avec plus de 2 Ranges
  Query_str = "Select * from [Feuil1$A2:B11] where [F2] in (select [F1] from [Feuil1$B2:B11])"

'' => Resultat exact MAIS:
'' PROBLEME j'ai un tableau 1D des 2 Ranges au lieu d'un tableau 2D
'  Query_str = "Select * from [Feuil1$B2:B11] union all Select * from [Feuil1$A2:A11]"

'' => NON! Pas d'erreur mais résultat UNION
'  Query_str = "Select * from [B2:B92],[A2:A92]"

'' => IDEM CI-DESSUS malgré le nom du classeur.
'  Query_str = "Select * from [Feuil1$B2:B11],[Feuil1$A2:A11]"

'' => IDEM CI-DESSUS avec champs nommées F1 plus nom sur 2 classeurs
'  Query_str = "Select [Feuil1$B2:B11.F1], [Feuil2$A2:A11.F1] from [Feuil1$B2:B11],[Feuil2$A2:A11]"

'' => NON! ERREUR!
'  Query_str = "Select [F1],[F2] from [Feuil1$B2:B11],[Feuil1$A2:A11]"

  RsT.Open Query_str, ADOConn, adOpenStatic

' Affichage
  Range("Q2").CopyFromRecordset RsT
 
' Fermeture
  If RsT.State = adStateOpen Then
    RsT.Close
  End If
  Set RsT = Nothing
  If ADOConn.State = adStateOpen Then
    ADOConn.Close
  End If
  Set ADOConn = Nothing

End Sub
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
J'ai trouvé une discussion sur le forum mais à l'époque PatrickToulon disait que ce n'est pas possible sur plusieurs Range avec une seule requête SQL.
Enfin que lui n'y était pas arrivé.

L'objectif final est d'obtenir un seul tableau de Y lignes X Colonnes des Ranges pour un autre traitement.
 
Dernière édition:

dysorthographie

XLDnaute Accro
je comprends et je vois que ta requête rime à rien d'où mes demande d'explication!

tu sélectionnes toutes les colonnes du tableau en fonctions des valeur déjà présente dans la colonne B hors elles y sont alors c'est inutile!
VB:
'HDR=Yes;
ConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1;"""
Query_str = "Select * from [Feuil1$] where [Date] in (select [Date] from [Feuil1$)"
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Merci à tous
Le fichier n'est là que pour fournir des datas comme exemple.
Partant des données, par exemple, je voudrais extraire les données de la colonne Range("A2:A11") et de la colonne des lignes correspondantes Range("B2:B11") .
Au final je désire obtenir un tableau contenant les valeurs des colonnes A et C des lignes 2 à 11
Ici MyArr(1 to 11, 1 to 2) par exemple
01/01/2021​
vendredi
02/01/2021​
samedi
03/01/2021​
dimanche
04/01/2021​
lundi
05/01/2021​
mardi
06/01/2021​
mercredi
07/01/2021​
jeudi
08/01/2021​
vendredi
09/01/2021​
samedi
10/01/2021​
dimanche

Si possible par une seule requête SQL sur les 2 Ranges.
Sinon il faudrait que je fasse 2 requêtes et que je compile les 2 résultats dans un tableau créé.
J'espère que je suis plus clair.
Plus long? Mais plus simple donc pas drôle

… cahier de vacances, que de souvenirs😁
 

Dranreb

XLDnaute Barbatruc
Et de simples formules genre =DECALER(Meteo_Detail333[[#En-têtes];[Jour]];LIGNE()-1;0) ne feraient pas l'affaire ?
Ou en VBA récupérer les valeurs du tableau :
VB:
Private TDon()
Sub RécupDon
TDon = ActiveSheet.ListObjects(1).DataBodyRange.Value
End Sub
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Bonjour DanReb re Dyso

@DanReb
Oui et Non (Suis pas Normand).
Oui cela pourrait sur un classeur actif.
Non si c'est un classeur fermé.
Sauf si je n'ai pas compris, non une 2ème fois puisque je veux obtenir un tableau des Ranges de la SQL résultat.
Quid sur un fichier fermer ?:
TDon = ActiveSheet.ListObjects(1).DataBodyRange.Value
j'ai la totalité des données.
Ca peut être lourd et long non?
En plus derrière il faudrait que j'extrait la partie qui m'intéresse, les Ranges.

@dysorthographie
Oui si je veux recevoir les colonnes "complètes".
Non si ce sont des colonnes partielles (suite à une sélection par exemple)
Imagine que j'ai 2 ranges du genre: Range("A10:A25") et Range("C10:C25") SANS entête de colonnes et, en plus, dans un fichier externe fermé.

Chiant les cahiers de vacances 😂
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Si c'est un classeur fermé il suffit de l'ouvrir le temps de récupérer les données.
Il n'y a pas de dispositif de sélection dans votre fichier joint.
Mais un UserForm pourrait faire l'affaire …
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
@Dranreb
Dispositif de sélection ...
En effet, c'est une image pour dire que ce n'est pas figé.

Un UserForm?
Dans lequel je mettrai les différents RecordSet cote à cote qu'ensuite je n'aurai plus qu'à "sélectionner" pour obtenir le tableau complet.

Exemple:
' Copie chaque résultat dans la UserForm temporaire (Brouillon)
Range("Q2").CopyFromRecordset RsT(1)
Range("R2").CopyFromRecordset RsT(2)
Range("S2").CopyFromRecordset RsT(3)
'Sélection de l'ensemble
My_arr = Range("Q2: S11")

Ainsi My_arr est le tableau résultat.
Pourquoi pas.
A vérifier la mémoire et chronométrer avec de grandes quantité de données.
Est là l'idée?

P.S:
Par contre la solution ouverture/fermeture d'un fichier j'ai déjà testé trop long trop lourd et sujet à problème.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non. Pas du tout.
Mon idée est de récupérer tout le tableau dans un UserForm, puis d'alimenter des ComboBox dynamiques avec toutes les colonnes trouvées.
Après sélections dans ces ComboBox, un CommandButton OK permettrait de vider dans la feuille courante tout le reste des colonnes des lignes correspondant aux choix effectués.
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Non. Pas du tout.
Mon idée est du récupérer tout le tableau dans un UserForm, puis d'alimenter des ComboBox dynamiques avec toutes les colonnes trouvées.
EUH?
Récupérer tout le tableau?
AIE! Bobo non? A priori cela me fait peur.
Jamais testé, même jamais fait. Jamais utilisé de ComboBox avec Excel (avec VB plein .. Y a très très longtemps)

J'ai fait des tests de l'appli avec 1 million de traitement (Lecture, recherche, comparaisons entre datas etc.)
Avant l'évolution de l'appli je traite cette quantité en environ 5 à 8 secondes. Depuis l'évolution/modifications je suis passé à 16 secondes.
J'aimerais revenir à mes anciens chronos. (Question de J.O. quoi😆 )
D'où ma tentative avec SQL
 

Discussions similaires

Statistiques des forums

Discussions
314 698
Messages
2 112 016
Membres
111 395
dernier inscrit
juliendegraef