2009-08-13 5 views
3

J'ai besoin de combiner des lignes de deux feuilles de calcul Excel en une longue rangée, basée sur une colonne ID dans chacune des feuilles de calcul. Effectivement, je veux effectuer l'équivilent d'un SQL JOIN sur deux feuilles de calcul pour produire une feuille de calcul combinée.Fonction "Join" d'Excel

Je peux obtenir un objet Range pour une ligne dans la première feuille de calcul, puis utiliser la colonne ID pour obtenir un objet Range pour la ligne correspondante dans la deuxième feuille de calcul. Maintenant j'ai besoin de les combiner.

Je connais les méthodes de fusion et d'union VBA, mais je ne pense pas qu'elles font ce dont j'ai besoin.

Comment combiner ces deux objets de plage?

par exemple: feuille 1 rangée: a, b, c feuille 2 rangs: d, e, f

ligne combinée: a, b, c, d, e, f

+0

Avez-vous envisagé de déménager à Access? Excel n'est pas une base de données ... –

Répondre

3

Pouvez-vous mettez une formule dans la colonne d de la feuille de calcul 1 pour faire un vlookup sur la feuille de calcul 2 pour trouver l'ID correspondant et retourner la valeur. Puis répétez ceci pour les autres colonnes e et f?

0

Si vos 2 feuilles de travail sont dans le même classeur fermé, je pense que vous pourriez éventuellement utiliser une requête SQL contre eux en utilisant adodb.

dim cnn As ADODB.Connection 
dim rst As ADODB.Recordset 
strProv = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ 
        SourceFile & ";Extended Properties=Excel 8.0;" 
cnn.Open strProv 
Set rst = New ADODB.Recordset 
strSql = "select * from [Sheet1$]" 
rst.Open strSql, cnn 
rngDestRange.CopyFromRecordset rst 

J'ai utilisé cette technique, mais pour une table à la fois. Je ne suis donc pas sûr à 100% que la jointure est supportée, mais vous pouvez essayer.

1

Une alternative à la solution de Robin Day consiste à utiliser Match() pour obtenir la position de ligne, puis Index() pour récupérer les données. Cela devrait être plus rapide si vous avez beaucoup de données. Ceci suppose une relation 1: 1. Les fonctions sont de la forme:

=MATCH(RowID, OtherTable, 0)

=INDEX(OtherTable, MATCH(), ColumnPosition)

0

Il suffit de regarder la fonction VLOOKUP, avec FALSE comme dernier argument. Il fait exactement ce que vous voulez.