Chargement des données d'Oracle vers Excel via ADODB – problème de performance

Nous avons une grande application Excel qui utilise VBA, gammes nommées, ADODB. Sa principale fonction est de se connecter à Oracle, de charger un set de données dans Excel, de permettre à l'user de le modifier et de le sauvegarder dans Oracle. L'application est dans Excel 2003, mais nous voulons passer à Excel 2007 pendant un certain time. Nous sums maintenant confrontés à une erreur de "trop ​​de formats" lors du collage dans l'application Excel 2003, et c'est une bonne raison pour la mise à niveau.

Après avoir sauvegardé Excel 2003 en tant qu'exemple 2007 et en cours d'exécution de la database chargée d'Oracle, datatables nécessitent environ deux fois plus longtime. Nous pouvons effectivement voir les loggings en cours de chargement alors que dans la version Excel 2003, les loggings dans la feuille ont simplement reculé sur la page.

Donc, mon premier objective est d'améliorer cette performance. Il y a deux façons de faire ceci:

  1. Découvrez pourquoi Excel 2007 est plus lent que Excel 2003 et corrigez-le
  2. Améliorer la routine de chargement des données

Sur l'élément 1, je suis intéressé par quelqu'un d'autre qui peut éclairer pourquoi il faudrait plus de time pour faire cela en 2007 vs 2003

Sur l'élément 2, je considère la conversion du jeu d'loggings sur une string en utilisant GetSsortingng et le collage sur la feuille (plutôt que de l'append une cellule à la fois). Je suis également intéressé par tous ceux qui l'ont déjà fait.

Un code désinfecté du transfert de ADODB vers le code de feuille Excel est ci-dessous:

While Not RECSET.EOF ' loop thru columns returned in sql row sExtractRec = "" For i = 1 To Column_Names.Count vColumnName = Column_Names(i) vItem = RECSET(vColumnName) vItem = formatIfDate(vItem, vColumnName) ' format if a date or datetime currCell.Value = vItem Set currCell = currCell.Offset(0, 1) If Not isNull(vItem) Then vItem = IIf(vItem = "", "", Replace(vItem, ";", " ")) End If sExtractRec = sExtractRec & vItem & ";" Next i Set currCell = currCell.Offset(1, 0 - Column_Names.Count) ' goto first cell next row iRowCnt = iRowCnt + 1 RECSET.MoveNext If bWriteExtractFile Then Print #iExtractFile, sExtractRec End If Wend 

Essayez tout d'éteindre la mise à jour de l'écran et le calcul du calcul au manuel tout en remplissant la feuille.

Je suppose que vous ne faites pas cela maintenant, puisque vous avez mentionné que les loggings étaient fréquentés en ligne par ligne.

La méthode CopyFromRecordset tendance à être beaucoup plus rapide que le CopyFromRecordset manuel des cellules. Exemple d'utilisation:

Worksheets("Sheet1").Cells(2, 1).CopyFromRecordSet RECSET

Les problèmes de mise en forme date / datetime pourraient vraisemblablement être corrigés une fois que datatables ont été copiées dans la feuille de calcul.

Plus de détails sur cette méthode sont ici