Excel: Limieten bij het automatisch doorgeven van matrices naar Excel

Samenvatting

In dit artikel worden de limieten behandeld van het automatisch doorgeven van matrices naar Microsoft Excel-werkbladen en -macro's. Als deze limieten worden overschreden, kunnen er runtimefouten optreden in uw automatiseringscode.

Meer informatie

De door Microsoft gebruikte programmeervoorbeelden dienen uitsluitend ter illustratie. Microsoft verleent dan ook geen enkele impliciete of expliciete garantie met betrekking tot deze voorbeelden. Er gelden geen impliciete garanties met betrekking tot verkoopbaarheid en/of geschiktheid voor een bepaald doel, noch enigerlei andere garanties. In dit artikel wordt ervan uitgegaan dat u bekend bent met de programmeertalen VBScript en VBA, alsmede met de hulpprogramma's waarmee procedures worden gemaakt en waarmee fouten in procedures worden opgespoord. U kunt desgewenst contact opnemen met Microsoft Productondersteuning voor uitleg over de functie van een bepaalde procedure. Microsoft Productondersteuning is echter niet bereid de voorbeelden aan te passen om extra functies toe te voegen of om procedures te maken die aan uw specifieke wensen voldoen. Als u nog niet zoveel programmeerervaring hebt, kunt u desgewenst contact opnemen met een Microsoft Certified Partner. Als u meer informatie wilt over Microsoft Certified Partners, bezoekt u de volgende website van Microsoft:

Voor meer informatie over de beschikbare ondersteuningsopties en hoe u contact kunt opnemen met Microsoft, bezoekt u de volgende website:

Wanneer u matrices automatisch wilt doorgeven aan Microsoft Excel, zijn de volgende limieten van toepassing. De limieten zijn afhankelijk van de versie van Excel en van het feit of u de matrix doorgeeft aan een werkbladbereik of als argument aan een macro. Zie de voetnoten onder aan de tabel voor meer informatie.


Versie Matrix doorgegeven aan Matrix doorgegeven aan
Microsoft Excel Werkbladbereik Macro (procedure)
----------------------------------------------------------

5.0 A B,C

7.0 (Excel 95) D E,C,H

8.0 (Excel 97) F G,H

9.0 (Excel 2000) F G,H

Voetnoten

A:


Het maximum aantal elementen in de matrix bedraagt ongeveer 6550. Als u deze limiet overschrijdt, worden de volgende foutberichten weergegeven:

Onvoldoende geheugen
1005: Eigenschap Value van klasse Range kan niet worden ingesteld.
Het maximum aantal elementen in de matrix dat u kunt doorgeven aan Excel met de Excel-functie Transponeren bedraagt 4095. Als u deze limiet overschrijdt , wordt het volgende foutbericht weergegeven:

Runtimefout '1004':
Methode Transpose van klasse Application is mislukt
B:


Het maximum aantal elementen in de matrix bedraagt 4095. Als u deze limiet overschrijdt, wordt het volgende foutbericht weergegeven:

Runtimefout '1004':
Methode Run van klasse Application is mislukt
Opmerking Wanneer u een multidimensionale matrix doorgeeft, wordt er niet altijd een foutbericht weergegeven. De Excel-macro wordt echter niet uitgevoerd als het totale aantal elementen hoger is dan 4095.


C:


De matrixparameter moet in de Excel-macro worden gedefinieerd als Variant. Als dit niet het geval is, verschijnt het volgende foutbericht wanneer u de macro via automatisering wilt uitvoeren:

Runtimefout '1004':
Kan <macronaam> niet vinden
Stel bijvoorbeeld dat u de Excel-macro AcceptArray hebt genoemd. In dit voorbeeld ziet u hoe u de matrix moet definiëren in de Excel-macro:
   Public Sub AcceptArray(ByVal myarray As Variant)
' U kunt de parameter doorgeven via ByVal of ByRef.
' Als u het aantal elementen in de matrix wilt controleren, gebruikt u
' de functie UBound.
End Sub
D:


Het maximum aantal elementen in de matrix bedraagt 5461. Als u deze limiet overschrijdt, wordt een van de volgende foutberichten weergegeven:

Runtimefout '1004':
Methode Transpose van klasse Application is mislukt
-of-
Runtimefout '1005':
Eigenschap Value van klasse Range kan niet worden ingesteld.
E:


Het maximum aantal elementen in de matrix bedraagt 5461. Als u deze limiet overschrijdt, wordt het volgende foutbericht weergegeven:

Runtimefout '1004':
Methode Run van klasse Application is mislukt
F:


Het maximum aantal elementen in de matrix wordt beperkt door het beschikbare geheugen of door de maximale grootte van het Excel-werkblad (65.536 rijen bij 256 kolommen). Het maximum aantal elementen in de matrix dat u kunt doorgeven aan Excel met de Excel-functie Transponeren bedraagt echter 5461. Als u deze limiet overschrijdt , wordt het volgende foutbericht weergegeven:

Runtimefout '13':
Type komt niet overeen
G:


Het maximum aantal elementen in de matrix wordt alleen beperkt door het beschikbare geheugen. Bovendien hoeft u de parameter niet in de Excel-macro te definiëren als Variant. Als u de matrix ByVal echter wilt doorgeven, moet u de parameter definiëren als Variant, zoals in het voorbeeld bij voetnoot C eerder in dit artikel. Als u de variabele niet definieert als Variant, verschijnt runtimefout 13: 'Type komt niet overeen'.


H:


Wanneer u een ByRef-argument doorgeeft aan een out-of-process-automatiseringsserver, zoals Excel, worden de gegevens gebundeld tussen de automatiseringscontroller (of client) en de server, aangezien beide in aparte processen worden uitgevoerd. Wanneer een matrix nu wordt doorgegeven aan Excel via ByRef, wordt een kopie van de matrix verzonden naar de adresruimte van Excel. Als de Excel-procedure eenmaal is gestart, wordt een kopie van de matrix teruggegeven aan de client. Alhoewel argumenten op deze manier kunnen worden doorgegeven aan een out-of-proces-server via ByRef, is het proces niet efficiënt. Wanneer u echter een in-proces-automatiseringsserver (een DLL, oftewel Dynamic Link Library) gebruikt, kunt u een ByRef-argument zeer efficiënt doorgeven, aangezien er geen bundeling plaatsvindt. De server en de client gebruiken dezelfde matrix die in het geheugen is opgeslagen. Dit is mogelijk omdat de server in dezelfde adresruimte wordt uitgevoerd als de client.


Aangezien gegevens worden gebundeld bij out-of-proces-servers, zoals Excel, kunt u de matrix efficiënter doorgeven via ByVal dan via ByRef. Op deze manier wordt slechts één kopie doorgegeven aan Excel. De kopie hoeft niet meer te worden teruggezonden naar de client. Als u een matrix via ByVal wilt doorgeven aan een Excel-macro, moet u de parameter in de Excel-macro definiëren als Variant. Zie voetnoot C eerder in dit artikel voor een voorbeeld.

Voorbeeldprocedures van Visual Basic

In de volgende subprocedures van Microsoft Visual Basic for Applications kunt u zien hoe u matrices kunt doorgeven aan Excel. In de eerste twee procedures ziet u hoe u gegevens kunt invoeren in een celbereik op een werkblad door een matrix door te geven aan een werkbladbereik. De derde procedure laat zien hoe u een matrix kunt doorgeven aan een Excel-macro.


In de voorbeelden worden de volgende declaraties toegepast:
Option Explicit
Private xlApp As Object
Private xlBook As Object
Private xlSheet As Object
Een eendimensionale matrix doorgeven aan een werkbladbereik:
   Public Sub OneDimension()
Const size = 5461
Dim myarray(1 To size) As Integer
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets("Sheet1")
xlSheet.Cells(1, 1).Resize(size, 1).Value = _
xlApp.Application.Transpose(myarray)
End Sub
Een tweedimensionale matrix doorgeven aan een werkbladbereik:
   Public Sub TwoDimension()
Const size = 2730
Dim myarray(1 To size, 1 To 2) As Integer
' Aantal elementen = 2730 * 2 = 5460.
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets("Sheet1")
xlSheet.Cells(1, 1).Resize(size, 2).Value = myarray
End Sub
Een matrix als een argument doorgeven aan een Excel-macro:
   Public Sub RunExcelMacro()
Const size = 5461
Dim myarray(1 To size) As Integer
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Open("C:\MyBook.xls")
xlApp.Run "AcceptArray", myarray
End Sub
De procedure AcceptArray binnen een module in C:\MyBook.xls vertoont veel overeenkomsten met het volgende:
   Option Explicit

Public Sub AcceptArray(ByVal myarray As Variant)
MsgBox "Grootte van eerste dimensie: " & UBound(myarray, 1)
End Sub

Referenties

Raadpleeg de volgende Microsoft Knowledge Base-artikelen voor meer informatie over matrices en Excel:
75376 Excel: Maximale matrixgrootte in Microsoft Excel

166342 Excel 97: Maximale matrixgrootte in Microsoft Excel 97

153307 Procedure: Microsoft Excel-macro's aanroepen die parameters accepteren

153090 Een Visual Basic-matrix doorgeven aan een Excel-werkblad
Als u meer wilt weten over het opvragen van Help-informatie voor Visual Basic for Applications, raadpleegt u het volgende Microsoft Knowledge Base-artikel:
163435 VBA: Programmeerbronnen voor Visual Basic for Applications (VBA)
Eigenschappen

Artikel-id: 177991 - Laatst bijgewerkt: 18 sep. 2011 - Revisie: 1

Feedback