Excel vba pour créer toutes les combinaisons possibles d'une gamme
J'ai un problème que je n'ai pas été en mesure de trouver n'importe où sur le web (il est peut-être là, mais je ne le trouve pas, heh).
J'ai une feuille de calcul avec 13 colonnes de données. Chaque colonne contient les variations d'un paramètre qui doit aller dans un ensemble de cas de test.
Tous d'entre eux diffèrent, comme
E:
101%
105%
110%
120%
J:
Supérieure S
Envers L
Inconvénient B
Prime V
J'ai vu plusieurs solutions à l'association en question, qui utilise des boucles imbriquées. Je voudrais rester à l'écart de 13 boucles imbriquées (mais c'est mon meilleur pari pour le moment). Je suis un peu à une perte sur la façon de générer chaque combinaison unique dans chaque colonne.
Je ne suis pas sûr si ça fait assez de bon sens pour vous les gars. J'espérais que quelqu'un pourrait au moins me diriger dans la bonne direction avec un algorithme récursif. Je souhaiterais qu'il soit suffisamment dynamique pour prendre un nombre variable de colonnes et de lignes.
Merci pour toute aide les gars, vous pouvez me donner.
source d'informationauteur Kelvin
Vous devez vous connecter pour publier un commentaire.
Depuis que je lui ai offert un ODBC approche que j'ai pensé que je devrais la faire évoluer, comme il n'est pas immédiatement évident pour ce faire. Et, dans l'honnêteté, j'avais besoin de réapprendre les processus et les documenter pour moi-même.
C'est une façon de générer un Produit cartésien de deux ou plus de la dimension des données des tableaux à l'aide d'Excel et Microsoft Query.
Ces instructions ont été écrites avec XL2007 mais devrait fonctionner avec mineur (le cas échéant) modifications dans n'importe quelle version.
Étape 1
Organiser des groupes de colonnes.
Important: Chaque colonne doit avoir deux "en-tête" des noms comme indiqué en gras ci-dessous. Le premier nom sera par la suite être interprété comme un "nom de table". Le deuxième nom est interprété comme un "nom de colonne". Cela deviendra évident quelques étapes plus loin.
Sélectionnez chaque plage de données à leur tour, y compris les en-têtes", et a frappé
Ctrl+Shift+F3
. Cochez uniquementTop row
dans le "Créer les Noms de" boîte de dialogue et cliquez surOK
.Une fois toutes les plages nommées sont établis, enregistrez le fichier.
Étape 2
Données | Données Externes | À Partir D'Autres Sources Et À Partir De Microsoft Query
Choisir
<New Data Source>
. Dans leChoose New Data Source
dialogue:Un nom convivial pour votre connexion
choisir le pilote Microsoft Excel
... puis
Connect
Étape 3
Select Workbook...
puis recherchez votre fichier.Étape 4
Ajouter les "colonnes" de votre "tables". Vous pouvez maintenant voir pourquoi le "deux en-tête de" mise à l'étape 1 c'est important-il des astuces au conducteur de les comprendre correctement les données.
Ensuite, cliquez sur
Cancel
(vraiment!). Vous pouvez être invité à ce stade, de "continuer à modifier dans Microsoft Query?" (réponseYes
), ou d'une plainte qui se joint ne peut pas être représenté dans l'éditeur graphique. Ignorer cela, et de forger...Étape 5
Microsoft Requête s'ouvre, et par défaut, les tables vous seront croisés. Cela va générer un produit Cartésien, qui est ce que nous voulons.
Maintenant fermer MSQuery tout à fait.
Étape 6
Vous revenez à la feuille de calcul. Presque terminé, je le promets! Tique
New worksheet
etOK
.Étape 7
La croix-joint les résultats sont renvoyés.
Ne savez pas pourquoi vous êtes opposés à une boucle. Voir cet exemple. Il a fallu moins d'une seconde.
INSTANTANÉ
NOTE: Le ci-dessus est un petit exemple. J'ai fait un test sur 4 colonnes avec 200 lignes chacune. Le total de la combinaison possible d'un tel scénario est
1600000000
et il a fallu 16 secondes.Dans un tel cas, il traverse le Excel les lignes de limite. Une autre option que je peux penser à est de l'écriture de la sortie vers un fichier texte dans un tel scénario. Si vos données est petit, alors vous pouvez vous en sortir sans l'aide de tableaux et directement écrit pour les cellules. 🙂 Mais dans le cas où de grandes quantités de données, je vous conseille d'utiliser des tableaux.
J'avais besoin de ce moi-même à plusieurs reprises et finalement construit.
Je crois que le code des échelles pour n'importe quel nombre total de colonnes et le nombre de valeurs distinctes dans les colonnes (par exemple, chaque colonne peut contenir un nombre quelconque de valeurs)
Il suppose que toutes les valeurs dans chaque colonne unique (si ce n'est pas vrai, vous obtiendrez des lignes en double)
Il suppose que vous voulez de la croix-rejoindre une sortie basée sur ce que les cellules que vous avez actuellement sélectionné (assurez-vous de sélectionner tous)
Il suppose que vous voulez que le résultat commence une colonne après la sélection en cours.
Comment il fonctionne (brièvement):
d'abord pour chaque colonne et pour chaque ligne: Il calcule le nombre total de lignes nécessaires à l'appui de tous les combos en N colonnes (les éléments de la colonne 1 * les éléments de la colonne 2 ... * les éléments de la colonne N)
seconde pour chaque colonne: sur la Base du total des combos, et le total des combos des colonnes précédentes il calcule deux boucles.
ValueCycles (combien de fois vous avez à faire défiler toutes les valeurs dans la colonne en cours)
ValueRepeats (combien de fois répéter chaque valeur de la colonne consécutivement)
Solution basée sur mon deuxième commentaire. Cet exemple suppose que vous avez trois colonnes de données, mais peut être adapté pour gérer plus.
Je commence avec votre échantillon de données. J'ai ajouté compte sur la rangée du haut pour plus de commodité. J'ai aussi ajouté le nombre total de combinaisons (produit des comtes). C'est
Sheet1
:Sur
Sheet2
:Formules:
A2:C2
(orange cellules) sont codés en dur=0
Remplir à partir de la ligne 3 vers le bas autant de lignes que de
Total
montre surSheet1
appel de la méthode et de mettre dans le niveau actuel, qui sera décrémenté dans la méthode (désolé pour l'anglais)
exemple: