Dans Excel, j'ai une feuille de calcul qui extrait les données d'une base de données SQL dans une table, puis génère un rapport basé sur ces données. Malheureusement, les données de cette base de données SQL sont incomplètes et je souhaite inclure des lignes supplémentaires dans le jeu de résultats qui sont entrées manuellement dans la feuille de calcul.
Autant que je voudrais, je ne peux pas simplement insérer manuellement ces lignes supplémentaires dans le tableau car elles seraient supprimées chaque fois qu'Excel extrait de nouvelles données de la base de données SQL. Donc, à la place, j'envisage de créer une table distincte avec les mêmes en-têtes de colonne sur une nouvelle feuille et d'y entrer les données, puis de créer une troisième table sur une autre feuille qui combine en quelque sorte les lignes de la table qui extrait les données de SQL et de la table où j'entre les données manuellement. Comment puis-je accomplir cela? (Ou alternativement, y a-t-il une meilleure façon de faire cela qui me manque en quelque sorte?)
Exemple:
Table 1 (From Database):
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Foo | 12 |
| Mary | 1/6/13 | Foo | 7 |
| Mary | 1/6/13 | Bar | 5 |
| John | 1/6/13 | Foo | 5 |
| John | 1/13/13 | Foo | 13 |
-
Table 2 (Entered Manually):
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Baz | 3 |
| Mary | 1/6/13 | Baz | 2 |
| John | 1/13/13 | Baz | 5 |
-
Result:
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Foo | 12 |
| Mary | 1/6/13 | Foo | 7 |
| Mary | 1/6/13 | Bar | 5 |
| John | 1/6/13 | Foo | 5 |
| John | 1/13/13 | Foo | 13 |
| Bob | 1/6/13 | Baz | 3 |
| Mary | 1/6/13 | Baz | 2 |
| John | 1/13/13 | Baz | 5 |
Réponses:
Voici une solution Excel pure sans VBA. Il fonctionne en utilisant une fonction INDEX pour descendre les lignes et les colonnes des données SQL jusqu'à ce que les valeurs soient épuisées et qu'une condition d'erreur se produise. Une fonction IFERROR intercepte l'erreur et utilise une deuxième fonction INDEX pour descendre les lignes et les colonnes des données saisies manuellement, jusqu'à ce que ces valeurs soient épuisées et qu'une condition d'erreur se produise. Une deuxième fonction IFERROR intercepte l'erreur et renvoie un tiret ("-"). (Les données SQL doivent être actualisées via le ruban pour que les formules produisent un résultat correct.)
Créez une plage nommée dynamique SQLDB pour les données SQL de la feuille Sheet1 à l'aide de la formule:
Créez une deuxième plage nommée dynamique EXCELRNG pour les données saisies manuellement dans la feuille Sheet2 à l'aide de la formule:
Ces deux plages nommées supposent que les noms de variables sont entrés dans la ligne 1 de chacune des deux feuilles.
Entrez les noms des variables dans la ligne 1 de la feuille Sheet3 (commençant dans la cellule A1).
Entrez la formule suivante dans la cellule A2 de la feuille Sheet3:
Copiez la formule dans les colonnes de nom de variable, puis descendez les lignes jusqu'à ce que les résultats des formules soient tous des tirets ("-").
Il est possible dans une prochaine étape de créer un tableau croisé dynamique dans une autre feuille pour l'analyse et l'organisation.
Encore une fois, la première étape consiste à créer une plage nommée dynamique, disons RESULTRNG, en insérant la formule suivante dans la zone de saisie Gestionnaire de noms pour la plage nommée:
Créez ensuite un tableau croisé dynamique dans une nouvelle feuille, en définissant RESULTRNG comme tableau que vous souhaitez analyser. Cela filtrera tous les tirets de fin du tableau de formule dans la feuille Sheet3.
Cela fonctionne car la formule RESULTRNG compte le nombre total de lignes dans Sheet1 et Sheet2 (à l'exclusion de l'en-tête dans Sheet2) et le nombre total de colonnes dans Sheet1, et définit son étendue en fonction de ces nombres, à l'exclusion des tirets dans les lignes de fin ( ou colonnes) dans la table de formule Sheet3.
la source
J'ai trouvé un moyen de le faire. Cette solution est un peu délicate et nécessite que les deux tables aient leurs propres feuilles séparées (sans rien d'autre), mais à part cela, elle fait presque exactement ce que je veux. (Il semble également y avoir beaucoup de potentiel pour effectuer des opérations plus complexes telles que les jointures.)
Accédez à l'onglet de données sur le ruban, cliquez sur "À partir d'autres sources" et "À partir de Microsoft Query". Cliquez ensuite sur Fichiers Excel, sélectionnez le fichier dans lequel vous travaillez actuellement et cliquez sur OK. Ensuite, appuyez sur Annuler et lorsque vous êtes promu si vous souhaitez continuer la modification dans Microsoft Query, cliquez sur "Oui". À partir de là, vous pouvez cliquer sur le bouton SQL et écrire une requête SQL personnalisée sur n'importe quelle feuille de la feuille de calcul. Dans mon cas:
Remarque: Pour moi, cette méthode cesse de fonctionner après avoir fermé le fichier et l'ouvrir à nouveau. Je le poste ici de toute façon, même si c'est juste un problème avec mon ordinateur ou si quelqu'un d'autre peut le faire fonctionner.
la source
Si vous êtes intéressé par une solution VBA, j'ai pu faire fonctionner les éléments suivants:
Définissez une plage nommée dynamique pour les données que vous extrayez de SQL Server. Ouvrez le gestionnaire de noms, entrez un nouveau nom (par exemple, "SQLDB") et copiez la formule suivante dans la zone de saisie Fait référence à. J'ai supposé que vos données récupérées se trouvent dans la feuille Sheet1:
Définissez une autre plage nommée pour la plage dans laquelle les données manuelles sont entrées. J'ai utilisé le nom EXCELRNG et j'ai supposé que c'était dans Sheet2. La plage nommée commence à la ligne 2 pour exclure une ligne d'en-tête. La formule ici est identique à la première sauf pour la feuille à laquelle elle se réfère:
Voici le premier ensemble de paramètres que j'ai utilisé pour la connexion à la table SQL. La boîte de dialogue est accessible en sélectionnant Connexions dans l'onglet Données du ruban. La désactivation de l'actualisation en arrière-plan garantit que la macro VBA se met en pause jusqu'à ce qu'une actualisation des données dans la feuille Excel soit terminée. Il peut ne pas être nécessaire d'actualiser la connexion lorsque la feuille de calcul s'ouvre, mais je voulais m'assurer que toute authentification serait effectuée avant l'exécution de la macro.
Enfin, c'est le code VBA. Pour l'insérer, choisissez Visual Basic sous l'onglet Développeur. Mettez en surbrillance le nom de la feuille de calcul dans la liste de gauche. Il sera référencé comme "Projet VBA (nom de la feuille). Ensuite, choisissez Insérer un module dans la barre de menus en haut de l'écran et collez le code dans le nouveau module. Notez que j'ai mis la table consolidée dans la feuille Sheet3. Comme écrit, la macro ne trie pas la nouvelle table, bien que cela ne soit pas difficile à ajouter.
la source
Voici une version de la solution "Pure Excel" de @ chuff conçue spécifiquement pour fonctionner avec des tableaux. (IE Les deux sources de données que vous souhaitez fusionner sont des tableaux.)
La principale différence entre cette méthode et le chuff publié dans sa réponse est que vous n'avez pas besoin de définir de plages nommées pour les deux ensembles de données que vous fusionnez, car ce sont des tables et ont déjà leur propre plage nommée. Alors allez-y et nommez votre première table
Table1
et votre deuxième tableTable2
.Maintenant, créez un nouveau tableau dans le coin supérieur gauche d'une nouvelle feuille et donnez-lui les mêmes noms de colonne que les deux autres tableaux. Entrez ensuite la formule suivante dans la cellule A2 de la feuille que vous venez de créer:
Ensuite, copiez cette formule dans toutes les colonnes du tableau, puis descendez les lignes jusqu'à ce que les résultats des formules soient tous des tirets ("-"). Remarque: Le tri de ce nouveau tableau ne fera rien, car le contenu de chaque cellule est en fait identique (ils contiennent tous la même formule).
Si les colonnes du tableau fusionné affichent des 0 alors qu'elles devraient afficher une cellule vide, vous pouvez encapsuler la formule dans cette colonne avec la fonction de substitution, comme ceci:
Si vous souhaitez créer un tableau croisé dynamique qui utilise les données de ce nouveau tableau, vous devrez créer une plage nommée. Tout d'abord, nommez la table
Table3
. Maintenant, allez dans l'onglet formules et cliquez sur "Définir le nom". Donnez un nom à la référence, entrez l'équation suivante pour sa valeur ("Fait référence à"):Vous pouvez ensuite utiliser cette référence nommée comme plage pour votre tableau croisé dynamique.
la source
Si vous voulez juste un résultat sur une base unique, il existe un site Web qui fusionnera deux tables pour vous: https://office-tools.online/table/merge/
Vous collez les tableaux dans la page Web et sélectionnez les paramètres appropriés. Voici une capture d'écran de l'exemple intégré qui indique comment l'utiliser:
la source