J'essaie de créer une sous-table à partir d'une autre table de tous les champs de nom de famille triés de A à Z qui ont un champ de numéro de téléphone qui n'est pas nul. Je pourrais le faire assez facilement avec SQL, mais je ne sais pas comment exécuter une requête SQL dans Excel. Je suis tenté d'importer les données dans postgresql et de les interroger là-bas, mais cela semble un peu excessif.
Pour ce que j'essaie de faire, la requête SQL SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname
ferait l'affaire. Cela semble trop simple pour que ce soit quelque chose qu'Excel ne puisse pas faire en natif. Comment puis-je exécuter une requête SQL comme celle-ci à partir d'Excel?
Il existe de nombreuses manières de procéder, que d'autres ont déjà suggérées. En suivant le "Obtenir des données Excel via une piste SQL", voici quelques pointeurs.
Excel dispose de "l'Assistant de connexion de données" qui vous permet d'importer ou de créer un lien depuis une autre source de données ou même au sein du même fichier Excel.
Dans le cadre de Microsoft Office (et du système d’exploitation), il existe deux fournisseurs d’intérêt: l’ancien "Microsoft.Jet.OLEDB" et le dernier "Microsoft.ACE.OLEDB". Recherchez-les lors de la configuration d'une connexion (comme avec l'Assistant Connexion de données).
Une fois connecté à un classeur Excel, une feuille de calcul ou une plage est l’équivalent d’une table ou d’une vue. Le nom de table d'une feuille de calcul est le nom de la feuille de calcul avec un signe dollar ("$") ajouté à celle-ci et entouré de crochets ("[" et "]"); d'une plage, c'est simplement le nom de la plage. Pour spécifier une plage de cellules non nommée comme source d’enregistrement, ajoutez entre les crochets la notation standard ligne/colonne Excel à la fin du nom de la feuille.
Le SQL natif sera (plus ou moins) le SQL de Microsoft Access. (Dans le passé, cela s'appelait JET SQL; cependant, Access SQL a évolué et je pense que JET est obsolète, ancien technicien.)
Exemple, lecture d'une feuille de calcul: SELECT * FROM [Sheet1 $]
Exemple, lecture d'une plage: SELECT * FROM MyRange
Exemple, lecture d'une plage de cellules sans nom: SELECT * FROM [Sheet1 $ A1: B10]
Il existe de nombreux livres et sites Web disponibles pour vous aider à résoudre ces problèmes.
=== Notes complémentaires ===
Par défaut, il est supposé que la première ligne de votre source de données Excel contient des en-têtes de colonne pouvant être utilisés comme noms de champs. Si ce n'est pas le cas, vous devez désactiver ce paramètre ou votre première ligne de données "disparaît" pour être utilisée comme nom de champ. Pour ce faire, vous ajoutez le paramètre optionnel HDR = aux propriétés étendues de la chaîne de connexion. La valeur par défaut, qui n'a pas besoin d'être spécifiée, est HDR = Yes. Si vous n'avez pas d'en-tête de colonne, vous devez spécifier HDR = No; le fournisseur nomme vos champs F1, F2, etc.
Avertissement concernant la spécification des feuilles de calcul: le fournisseur suppose que votre tableau de données commence par la cellule supérieure, la plus à gauche et non vide de la feuille de calcul spécifiée. En d'autres termes, votre table de données peut commencer à la rangée 3, colonne C sans problème. Toutefois, vous ne pouvez pas, par exemple, saisir un titre de feuille de travail au-dessus et à gauche des données de la cellule A1.
Avertissement concernant la spécification de plages: lorsque vous spécifiez une feuille de calcul comme source d'enregistrements, le fournisseur ajoute de nouveaux enregistrements en dessous des enregistrements existants dans la feuille de travail, dans la mesure où l'espace le permet. Lorsque vous spécifiez une plage (nommée ou non), Jet ajoute également de nouveaux enregistrements en dessous des enregistrements existants dans la plage, dans la mesure où l'espace le permet. Toutefois, si vous effectuez une nouvelle recherche sur la plage d'origine, le jeu d'enregistrements résultant n'inclut pas les enregistrements nouvellement ajoutés en dehors de la plage.
Types de données (à essayer) pour CREATE TABLE: Court, Long, Simple, Double, Monnaie, DateTime, Bit, Octet, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.
Connexion à "old tech" Excel (fichiers avec l'extension xls): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;
. Utilisez le type de base de données source Excel 5.0 pour les classeurs Microsoft Excel 5.0 et 7.0 (95), ainsi que le type de base de données source Excel 8.0 pour les classeurs Microsoft Excel 8.0 (97), 9.0 (2000) et 10.0 (2002).
Connexion à la "dernière" Excel (fichiers avec l’extension de fichier xlsx): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"
Traitement des données en tant que texte: le paramètre IMEX traite toutes les données en tant que texte. Fournisseur = Microsoft.ACE.OLEDB.12.0; Source de données = Excel2007file.xlsx; Propriétés étendues = "Excel 12.0 Xml; HDR = OUI; IMEX = 1";
(Plus de détails sur http://www.connectionstrings.com/Excel )
Plus d'informations sur http://msdn.Microsoft.com/en-US/library/ms141683(v=sql.90).aspx et sur http://support.Microsoft.com/kb/ 316934
Connexion à Excel via ADODB via VBA, voir http://support.Microsoft.com/kb/257819
Les détails de Microsoft JET 4 sur http://support.Microsoft.com/kb/275561
Vous pouvez le faire nativement comme suit:
=C6=""
Où C6 est la première cellule de données de la colonne de numéros de téléphone.Si vous voulez le faire par programme, je vous suggère d’utiliser le Macro Recorder pour enregistrer les étapes ci-dessus et consulter le code.
tl; dr; Excel fait tout cela nativement - utilisez filtres et tableaux
( http://office.Microsoft.com/en-gb/Excel-help/filter-data-in-an-Excel-table-HA102840028.aspx )
Vous pouvez ouvrir Excel par programme via une connexion oledb et exécuter SQL sur les tables de la feuille de calcul.
Mais vous pouvez faire tout ce que vous demandez, sans utiliser de formules, mais uniquement des filtres.
avoir un jeu .. quelques choses à noter:
Faites-le avec des filtres à moins que vous ne le fassiez souvent ou que vous souhaitiez automatiser l'importation de données quelque part ou quelque chose d'autre .. mais pour être complet:
Option A c #:
OleDbConnection ExcelFile = new OleDbConnection( String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES\"", filename));
ExcelFile.Open();
pour commencer, jetez un coup d’œil au schéma, car il pourrait y en avoir plus que vous ne le pensez:
List<String> excelSheets = new List<string>();
// Add the sheet name to the string array.
foreach (DataRow row in dt.Rows) {
string temp = row["TABLE_NAME"].ToString();
if (temp[temp.Length - 1] == '$') {
excelSheets.Add(row["TABLE_NAME"].ToString());
}
}
puis quand vous voulez interroger une feuille:
OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile);
dt = new DataTable();
da.Fill(dt);
NOTE - Utilisez les tableaux dans Excel !:
Excel possède des fonctionnalités de "tables" qui permettent aux données de se comporter davantage comme une table. Cela vous donne de grands avantages, mais ne vous permettra pas de faire tous les types de requêtes.
http://office.Microsoft.com/en-gb/Excel-help/overview- of-Excel-tables-HA010048546.aspx
Pour les données tabulaires dans Excel, c’est ma configuration par défaut. La première chose à faire est de cliquer sur les données, puis de sélectionner "formater sous forme de tableau" dans la section "Accueil" du ruban. Cela vous donne le filtrage et le tri par défaut et vous permet d'accéder à la table et aux champs par leur nom (par exemple, table [nom du champ]). Cela permet également d'agréger des fonctions sur des colonnes, par exemple. max et moyenne
Vous pouvez utiliser SQL dans Excel. Ce n'est que bien caché ... Voir ce tutoriel:
http://smallbusiness.chron.com/use-sql-statements-ms-Excel-41193.html
Si vous devez le faire une fois, suivez simplement les descriptions de Charles, mais vous pouvez également le faire avec des formules Excel et des colonnes auxiliaires au cas où vous souhaiteriez dynamiser le filtre.
Supposons que vos données se trouvent sur la feuille DataSheet et commence à la ligne 2 des colonnes suivantes:
Vous avez besoin de deux colonnes d'assistance sur cette feuille.
=if(A2 = "", 1, 0)
, il s'agit de la colonne de filtre correspondant à votre condition where.=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))
, cela correspond à la commande parCopiez ces formules dans la mesure où vos données disparaissent.
Sur la feuille qui devrait afficher votre résultat, créez les colonnes suivantes.
=match(A2, DataSheet!$E$2:$E$1048576, 0)
, il s’agit de la ligne des données correspondantes=iferror(index(DataSheet!A$2:A$1048576, $B2), "")
, il s’agit des données réelles ou vide si aucune donnée n’existeCopiez les formules dans B2 et C2 et copiez la colonne C vers D et E.
Si vous souhaitez exécuter SQL sur des données combinées provenant de plusieurs feuilles Excel ou de plusieurs fichiers Excel, vous pouvez utiliser le service cloud appelé Rockset . Rockset vous fournit une interface SQL pouvant combiner des données Excel, Pdf ou txt/xml/json/csv.
Puis-je suggérer de donner QueryStorm a try - c'est un plugin pour Excel qui facilite l'utilisation de SQL dans Excel.
En outre, c'est freemium. Si vous ne vous souciez pas de l'auto-complétion, des erreurs d'erreur, etc., vous pouvez l'utiliser gratuitement. Il suffit de télécharger et d'installer, et vous avez un support SQL dans Excel.
Disclaimer: je suis l'auteur.