问题
Below VBA code does the job, but I'm losing some 3 sec in the transpose part.
Is there a way I can get the same result or in the SQL query or in the getrows process without losing the 3 secs?
Sub LoadData()
Dim strCon, srtQry As String, tmpArray, tmpArray2, R As Variant, i, j As Long
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
strCon = "DRIVER={MySQL ODBC 5.2 ANSI Driver};" & _
"SERVER=localhost;" & _
"DATABASE=tbname;" & _
"USER=root;" & _
"PASSWORD=pass;" & _
"Port=3306;" & _
"Option=3"
cn.Open strCon
srtQry = "SELECT * FROM `tbname` WHERE `FileDay` = 20131220"
Set rs = cn.Execute(srtQry)
tmpArray = rs.GetRows
cn.Close
tmpArray2 = TransposeArray(tmpArray)
End Sub
TransposeArray:
Public Function TransposeArray(InputArr As Variant) As Variant
Dim RowNdx, ColNdx, LB1, LB2, UB1, UB2 As Long, tmpArray As Variant
LB1 = LBound(InputArr, 1)
LB2 = LBound(InputArr, 2)
UB1 = UBound(InputArr, 1)
UB2 = UBound(InputArr, 2)
ReDim tmpArray(LB2 To LB2 + UB2 - LB2, LB1 To LB1 + UB1 - LB1)
For RowNdx = LB2 To UB2
For ColNdx = LB1 To UB1
tmpArray(RowNdx, ColNdx) = InputArr(ColNdx, RowNdx)
Next ColNdx
Next RowNdx
TransposeArray = tmpArray
End Function
回答1:
There are a few optimisations you can apply
- Declarations: you need to specify the data type of each variable
- Remove redundant calculations in
Redim
- Use the more compact For loop structure
- Specify your variants as arrays
- And for most impact: Use a
Sub
rather thanFunction
These together will reduce run time of the Transpose by more than 50%
Public Sub TransposeArray(ByRef InputArr() As Variant, ByRef ReturnArray() As Variant)
Dim RowNdx As Long, ColNdx As Long
Dim LB1 As Long, LB2 As Long, UB1 As Long, UB2 As Long
LB1 = LBound(InputArr, 1)
LB2 = LBound(InputArr, 2)
UB1 = UBound(InputArr, 1)
UB2 = UBound(InputArr, 2)
ReDim ReturnArray(LB2 To UB2, LB1 To UB1)
For RowNdx = LB2 To UB2
For ColNdx = LB1 To UB1
ReturnArray(RowNdx, ColNdx) = InputArr(ColNdx, RowNdx)
Next ColNdx, RowNdx
End Sub
Call it like this
TransposeArray tmpArray, tmpArray2
来源:https://stackoverflow.com/questions/20959824/transpose-rows-column-in-getrows