ARRAY function
Purpose: ARRAY will fill a range
of rows and columns in a COM object with values from a comma
separated string.
Syntax: COMobj.Range(A1:B1).Value = ARRAY("LiteralString", Number) Parameters:
Return Value:
|
Example:
BCX_SHOW_COM_ERRORS(TRUE)$INCLUDE"Excel_Constants.INC"DIMsSaveAsFile$DIMoExcelASOBJECTDIMoBookASOBJECTDIMoSheetASOBJECTDIMoRangeASOBJECTDIMxlChartsASOBJECTDIMmyChartASOBJECTDIMchartPageASOBJECT sSaveAsFile$=APPEXEPATH$&"chart_demo.xls"'Start a new workbook in ExcelSEToExcel=CREATEOBJECT("Excel.Application")SEToBook=oExcel.Workbooks.AddSEToSheet=oBook.Worksheets(1)oSheet.Range("A1:D1").Value=ARRAY("","Student1","Student2","Student3")oSheet.Range("A2:D2").Value=ARRAY("Term1",80,65,45)oSheet.Range("A3:D3").Value=ARRAY("Term2",78,72,60)oSheet.Range("A4:D4").Value=ARRAY("Term3",82,80,65)oSheet.Range("A5:D5").Value=ARRAY("Term4",75,82,68)SETxlCharts=oSheet.ChartObjects()SETmyChart=xlCharts.Add(10,80,300,250)SETchartPage=myChart.ChartSEToRange=oSheet.Range("A1:D5")chartPage.SetSourceData(oRange, xlColumns)chartPage.ChartType=xlColumnClusteredMSGBOX"File will be saved at "&sSaveAsFile$,"BCX Excel Chart Demo",64oBook.SaveAs sSaveAsFile$ oExcel.QuitSETchartPage=NOTHINGSETmyChart=NOTHINGSETxlCharts=NOTHINGSEToRange=NOTHINGSEToSheet=NOTHINGSEToBook=NOTHINGSEToExcel=NOTHING
SAFEARRAY functions
INITSAFEARRAY function
Purpose: Creates a SAFEARRAY structure, allocates and initializes the data for the array and passes, by reference, a pointer to the new SAFEARRAY structure.
In the Syntax description below, two dimensions are used as an
example. However, up to ten dimensions can be specified when using
the INITSAFEARRAY function.
Syntax: HRslt Parameters:
Return Value:
|
ARRAYPUTELEMENT function
Purpose: ARRAYPUTELEMENT assigns a
single element to the array.
In the Syntax description below, two dimensions are used as an
example. However, up to ten dimensions can be specified when using
the ARRAYPUTELEMENT function.
Syntax:
Parameters:
|
ARRAYGETELEMENT function
Purpose: ARRAYGETELEMENT retrieves
a single element from the array.
In the Syntax description below, two dimensions are used as an
example. However, up to ten dimensions can be specified when using
the ARRAYGETELEMENT function.
Syntax:
Parameters:
|
DESTROYSAFEARRAY function
Purpose: destroys a SAFEARRAY structure and all the data in the array.
Syntax: HRslt Parameters:
Return Value:
|
Example: This example contains two parts. The first part creates a Microsoft Access database in which data will be created for retrieval by the second part of the example. The second part of the example will retrieve the data and place it in a Microsoft Excel spreadsheet.
Part One: Translate, compile and run the following code.
BCX_SHOW_COM_ERRORS(TRUE)DIMszDatabase$DIMoConnASOBJECTDIMrsASOBJECTDIMProvider$DIMSql$'Create DatabaseszDatabase$=APPEXEPATH$&"MYDB.MDB"IFEXIST(szDatabase$)THENKILLszDatabase$ CreateAccessDatabase(szDatabase$)'Connect to DatabaseProvider$="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&szDatabase$SEToConn=CREATEOBJECT("ADODB.Connection")oConn.OPEN Provider$' Create Student tableSql$="CREATE TABLE tblStudents (Student_Number COUNTER PRIMARY KEY, FirstName TEXT(24), LastName TEXT(24), Address TEXT(30), City TEXT(28), State TEXT(2), ZipCode TEXT(5))"oConn.Execute Sql$' Create Grades tableSql$="CREATE TABLE tblGrades (Student_Number INT, Semester INT, Score INT)"oConn.Execute Sql$' Add studentsSql$="INSERT INTO tblStudents (FirstName, LastName, Address, City, State, ZipCode ) VALUES ('Larry', 'Stooge', 'Address', 'City', 'St', 'Zip')"oConn.Execute Sql$ Sql$="INSERT INTO tblStudents (FirstName, LastName, Address, City, State, ZipCode ) VALUES ('Moe', 'Stooge', 'Address', 'City', 'St', 'Zip')"oConn.Execute Sql$ Sql$="INSERT INTO tblStudents (FirstName, LastName, Address, City, State, ZipCode ) VALUES ('Curly', 'Stooge', 'Address', 'City', 'St', 'Zip')"oConn.Execute Sql$' Add some gradesSETrs=CREATEOBJECT("ADODB.recordset")rs.OPEN"SELECT FirstName, LastName, Student_Number FROM tblStudents", oConn,3,3DIMA$DIMB$DIMC$DIMD$DIMrcDIMiDIMjDOrc=rs.EOFIFrc <>0THENEXITLOOPC$=rs.fields("Student_Number")C$=ENC$(C$,ASC("'"))FORi=1TO4j=70+30*RNDA$=ENC$(STR$(i),ASC("'"))B$=ENC$(STR$(j),ASC("'"))Sql$="INSERT INTO tblGrades (Student_Number, Semester, Score) VALUES ("&C$&","&A$&","&B$&")"oConn.Execute Sql$NEXTrs.movenextLOOPrs=NOTHING'show the data that was put into the databaseDIMsSelectSQL$ sSelectSQL$="SELECT tblStudents.FirstName, tblStudents.LastName, tblGrades.Semester, tblGrades.Score "sSelectSQL$=sSelectSQL$&"FROM tblGrades INNER JOIN tblStudents ON tblGrades.Student_Number = tblStudents.Student_Number "sSelectSQL$=sSelectSQL$&"ORDER BY tblStudents.FirstName, tblStudents.LastName, tblGrades.Semester"SETrs=CREATEOBJECT("ADODB.recordset")rs.OPEN sSelectSQL$, oConn,3,3DOrc=rs.EOFIFrc <>0THENEXITLOOPA$=rs.fields("FirstName")B$=rs.fields("LastName")C$=rs.fields("Semester")D$=rs.fields("Score")" ";B$;" Semester ";C$;" Score ";D$ rs.movenextLOOP' Clean uprs=NOTHINGoConn=NOTHINGPAUSESUBCreateAccessDatabase(DBname$)RAWProvider$RAWoDBASOBJECTSEToDB=CREATEOBJECT("ADOX.Catalog")Provider$="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&DBname$ oDB.Create Provider$SEToDB=NothingENDSUB' End CreateAccessDatabase
Part Two: Translate, compile and run the following code in the same folder as Part One.
BCX_SHOW_COM_ERRORS(TRUE)$INCLUDE"Excel_Constants.INC"DIMsDest$DIMszDatabase$DIMoConnasOBJECTDIMoRecSetasOBJECTDIMsProvider$DIMiColsDIMiRows'Connect to DatabaseszDatabase$=APPEXEPATH$&"MYDB.MDB"sProvider$="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&szDatabase$SEToConn=CREATEOBJECT("ADODB.Connection")IFBCX_GET_COM_STATUS(&oConn)=FALSETHENMSGBOX"Failed to create oConn object"CALLSetObjects2Nothing()END=1ENDIFoConn.Open sProvider$SEToRecSet=CREATEOBJECT("ADODB.recordset")IFBCX_GET_COM_STATUS(&oRecSet)=FALSETHENMSGBOX"Failed to create oRecSet object"CALLSetObjects2Nothing()END=1ENDIFoRecSet.Open"SELECT * FROM tblStudents", oConn,3,3iCols=oRecSet.recordcount iCols++oRecSet=NOTHINGSEToRecSet=CREATEOBJECT("ADODB.recordset")IFBCX_GET_COM_STATUS(&oRecSet)=FALSETHENMSGBOX"Failed to create oRecSet object"CALLSetObjects2Nothing()END=1ENDIFoRecSet.Open"SELECT Max(tblGrades.Semester) AS MaxOfSemester FROM tblGrades;", oConn,3,3iRows=oRecSet.fields("MaxOfSemester")iRows++oRecSet=NOTHINGDIMpsAASSAFEARRAYPTRDIMhRETASHRESULTDIMvArrayASVARIANTDIMpVariantASVARIANTPTRDIMlComVariantASVARIANTDIMsBuf$ hRET=INITSAFEARRAY(psA, VT_VARIANT,2,0, iRows,0, iCols)IFhRETTHENCALLError(hRET)CALLSetObjects2Nothing()END=1ENDIF' Set the safe arraydescriptor in VARIANTvArray.vt=VT_ARRAY | VT_VARIANT vArray.parray=psA' SafeArrayAccessDatahRET=SafeArrayAccessData(psA,(VOIDPTRPTR)&pVariant)IFhRETTHENCALLError(hRET)DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIF' Get data values for the safe arrayDIMsSelectSQL$ sSelectSQL$="SELECT tblStudents.Student_Number, tblStudents.FirstName, tblStudents.LastName, tblGrades.Semester, tblGrades.Score "sSelectSQL$=sSelectSQL$&"FROM tblGrades INNER JOIN tblStudents ON tblGrades.Student_Number = tblStudents.Student_Number "sSelectSQL$=sSelectSQL$&"ORDER BY tblStudents.FirstName, tblStudents.LastName, tblGrades.Semester"SEToRecSet=CREATEOBJECT("ADODB.recordset")IFBCX_GET_COM_STATUS(&oRecSet)=FALSETHENMSGBOX"Failed to create oRecSet object"DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIFoRecSet.Open sSelectSQL$, oConn,3,3DIMiColDIMiRowDIMiRecSetFlagDIMiSNDIMiLastSNDIMsFioRecSettName$DIMsLastName$DIMiScore iCol=0iLastSN=0DOiRecSetFlag=oRecSet.EOFIfiRecSetFlag <>0ThenExitLoop' VARIANT_BOOL returns -1 for FALSEiSN=oRecSet.fields("Student_Number")IFiSN <> iLastSNTHENiLastSN=iSN iCol++sFioRecSettName$=oRecSet.fields("FirstName")sLastName$=oRecSet.fields("LastName")sBuf$=sFioRecSettName$&" "&sLastName$ str2variant(sBuf,lComVariant)ARRAYPUTELEMENT(psA,lComVariant,2,0, iCol)ENDIFiRow=oRecSet.fields("Semester")iScore=oRecSet.fields("Score")lComVariant.vt=VT_I4 lComVariant.intVal=iScoreARRAYPUTELEMENT(psA,lComVariant,2, iRow, iCol)ARRAYGETELEMENT(psA,lComVariant,2, iRow,0)IFlComVariant.vt <> VT_BSTRTHENsBuf$="Semester"&STR$(iRow)str2variant(sBuf,lComVariant)ARRAYPUTELEMENT(psA,lComVariant,2, iRow,0)ENDIFoRecSet.movenextLOOPoConn.Close oRecSet=NOTHINGoConn=NOTHINGhRET=SafeArrayUnaccessData(psA)IFhRETTHENCALLError(hRET)DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIFDIMoExcelASObjectDIMoBookASObjectDIMoSheetASObjectDIMoRangeASOBJECTDIMxlChartsASOBJECTDIMmyChartASOBJECTDIMchartPageASOBJECTDIMsSaveAs$'Start a new workbook in ExcelSEToExcel=CREATEOBJECT("Excel.Application")IFBCX_GET_COM_STATUS(&oExcel)=FALSETHENMSGBOX"Failed to create oExcel object"DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIFSEToBook=oExcel.Workbooks.AddIFBCX_GET_COM_STATUS(&oBook)=FALSETHENMSGBOX"Failed to create oBook object"DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIFSEToSheet=oBook.Worksheets(1)IFBCX_GET_COM_STATUS(&oSheet)=FALSETHENMSGBOX"Failed to create oSheet object"DESTROYSAFEARRAY(psA)CALLSetObjects2Nothing()END=1ENDIFDIMiC1, iC2 iC1=IMOD((iCols-1),26)iC2=(iCols-1)/26IFiC2=0THENsDest$="A1:"&CHR$(iC1+65)&TRIM$(STR$(iRows))ELSEsDest$="A1:"&CHR$(iC2+65)&CHR$(iC1+65)&TRIM$(STR$(iRows))ENDIFoSheet.Range(sDest$).Value=vArray'psA 'oSheet.Range(sDest$).ColumnWidth=11SETxlCharts=oSheet.ChartObjects()IFBCX_GET_COM_STATUS(&xlCharts)=FALSETHENMSGBOX"Failed to create xlCharts object"CALLSetObjects2Nothing()END=1ENDIFSETmyChart=xlCharts.Add(10,80,300,250)IFBCX_GET_COM_STATUS(&myChart)=FALSETHENMSGBOX"Failed to create myChart object"CALLSetObjects2Nothing()END=1ENDIFSETchartPage=myChart.ChartIFBCX_GET_COM_STATUS(&chartPage)=FALSETHENMSGBOX"Failed to create chartPage object"CALLSetObjects2Nothing()END=1ENDIF'SET chartPage = NOTHINGSEToRange=oSheet.Range(sDest$)IFBCX_GET_COM_STATUS(&oRange)=FALSETHENMSGBOX"Failed to create oRange object"CALLSetObjects2Nothing()END=1ENDIF'SET oRange = NOTHINGchartPage.SetSourceData(oRange, xlColumns)chartPage.ChartType=xlColumnClustered'Save the Workbook and Quit ExcelsSaveAs$=APPEXEPATH$&"CHART_FROM_ACCESS.XLS"oBook.SaveAs sSaveAs$CALLSetObjects2Nothing()' Free SafeArrayhRET=DESTROYSAFEARRAY(psA)IFhRETTHENCALLError(hRET)CALLSetObjects2Nothing()END=1ENDIFEND=0SUBSetObjects2Nothing()IFBCX_GET_COM_STATUS(&oRecSet)THENoConn.CloseSEToRecSet=NOTHINGENDIFIFBCX_GET_COM_STATUS(&oConn)THENoConn.CloseSEToConn=NOTHINGENDIFIFBCX_GET_COM_STATUS(&oRange)THENSEToRange=NOTHINGIFBCX_GET_COM_STATUS(&chartPage)THENSETchartPage=NOTHINGIFBCX_GET_COM_STATUS(&myChart)THENSETmyChart=NOTHINGIFBCX_GET_COM_STATUS(&xlCharts)THENSETxlCharts=NOTHINGIFBCX_GET_COM_STATUS(&oSheet)THENSEToSheet=NOTHINGIFBCX_GET_COM_STATUS(&oBook)THENSEToBook=NOTHINGIFBCX_GET_COM_STATUS(&oExcel)THENoExcel.QuitSEToExcel=NOTHINGENDIFENDSUBSUBDEBUGLOGGER(sDEBUG$)OPEN"ERROR.LOG.TXT"FORAPPENDASFPAPPFPRINTFPAPP, sDEBUG$CLOSEENDSUBSUBError(hErrorASHRESULT)SELECTCASEhErrorCASES_OK'"Success."CASEDISP_E_BADINDEX DEBUGLOGGER("The specified index was invalid.")CASEE_INVALIDARG DEBUGLOGGER("One of the arguments is invalid.")CASEE_OUTOFMEMORY DEBUGLOGGER("Memory could not be allocated for the element.")CASEDISP_E_ARRAYISLOCKED DEBUGLOGGER("The array is currently locked.")CASEELSERAWsBUF$ sprintf(sBUF,"Error %i (0x%X)",hError,hError)DEBUGLOGGER(sBUF)ENDSELECTENDSUB