Skip to content

Commit f272601

Browse files
committed
Fix export error
Fixed an error raised when array to be exported were a one dimensional one.
1 parent 85b817e commit f272601

File tree

1 file changed

+131
-54
lines changed

1 file changed

+131
-54
lines changed

src/CSVinterface.cls

Lines changed: 131 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ Private P_ESCAPE_CHAR As EscapeType '------------Holds the char used for escape
9393
Private P_FIELDS_DELIMITER As String '-----------Holds the current delimiter for CSV fields
9494
Private P_FILEENCODING As String '---------------Holds the encoding for the opened CSV file
9595
Private P_FILENAME As String '-------------------Holds the actual file name
96+
Private P_NEED_SHRINK As Boolean '---------------When TRUE the P_CSV_DATA array need to be shrinked
97+
Private P_OUTPUT_UB1 As Long '-------------------Holds the max 1stD used index in the P_CSV_DATA array
98+
Private P_OUTPUT_UB2 As Long '-------------------Holds the max 2ndD used index in the P_CSV_DATA array
9699
Private P_QUOTING_MODE As QuotationMode '--------Hols the mode used for fields quotation.
97100
Private P_RECORDS_DELIMITER As String '----------Holds the records delimiter (CR, LF or CRLF)
98101
Private P_STARTING_RECORD As Long '--------------Pointer to the first record to be imported
@@ -258,6 +261,7 @@ End Function
258261
Private Sub CloseConnection()
259262
Attribute CloseConnection.VB_Description = "Closes a connection that point to the memory opened CSV file."
260263
On Error GoTo ErrHandler_CloseConnection
264+
'@------------------------------------------------------
261265
'Close the last opened file
262266
Close #FileHandled
263267
P_ERROR_DESC = vbNullString
@@ -298,8 +302,22 @@ End Function
298302
Public Sub DumpToArray(OutPutArray() As String)
299303
Attribute DumpToArray.VB_Description = "Dumps the CSV data from the current instance to a 2D array."
300304
Attribute DumpToArray.VB_UserMemId = 0
301-
OutPutArray() = P_CSV_DATA
302-
Erase P_CSV_DATA
305+
If P_SUCCESSFUL_IMPORT Then
306+
If Not P_NEED_SHRINK Then
307+
OutPutArray() = P_CSV_DATA
308+
Else
309+
Dim Counter1 As Long, Counter2 As Long
310+
ReDim OutPutArray(0 To P_OUTPUT_UB1, 0 To P_OUTPUT_UB2)
311+
For Counter1 = 0 To P_OUTPUT_UB1
312+
For Counter2 = 0 To P_OUTPUT_UB2
313+
OutPutArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
314+
P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
315+
Next Counter2
316+
Next Counter1
317+
End If
318+
P_SUCCESSFUL_IMPORT = False
319+
Erase P_CSV_DATA
320+
End If
303321
End Sub
304322
Public Sub DumpToSheet(Optional WBookName As String, _
305323
Optional SheetName As String, _
@@ -329,17 +347,41 @@ Attribute DumpToSheet.VB_Description = "Dumps the CSV data from the current inst
329347
Set OutputSheet = WBook.Sheets.Add
330348
End If
331349
'@------------------------------------------------------
332-
'Set the target Range
333-
Set OutputRange = OutputSheet.Range(rngName) _
350+
'Dump the data
351+
If Not P_NEED_SHRINK Then
352+
'@------------------------------------------------------
353+
'Set the target Range
354+
Set OutputRange = OutputSheet.Range(rngName) _
334355
.Resize _
335356
( _
336357
UBound(P_CSV_DATA, 1) - LBound(P_CSV_DATA, 1) + 1, _
337358
UBound(P_CSV_DATA, 2) - LBound(P_CSV_DATA, 2) + 1 _
338359
)
339-
'@------------------------------------------------------
340-
'Dump the data
341-
OutputRange.Value2 = P_CSV_DATA
360+
OutputRange.Value2 = P_CSV_DATA
361+
Else
362+
'@------------------------------------------------------
363+
'Set the target Range
364+
Set OutputRange = OutputSheet.Range(rngName) _
365+
.Resize _
366+
( _
367+
P_OUTPUT_UB1 + 1, _
368+
P_OUTPUT_UB2 + 1 _
369+
)
370+
Dim Counter1 As Long, Counter2 As Long
371+
Dim tmpOutputArray() As String
372+
ReDim tmpOutputArray(0 To P_OUTPUT_UB1, 0 To P_OUTPUT_UB2)
373+
For Counter1 = 0 To P_OUTPUT_UB1
374+
For Counter2 = 0 To P_OUTPUT_UB2
375+
tmpOutputArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
376+
P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
377+
Next Counter2
378+
Next Counter1
379+
OutputRange.Value2 = tmpOutputArray
380+
Erase tmpOutputArray
381+
End If
342382
EnableOptimization False
383+
P_SUCCESSFUL_IMPORT = False
384+
Erase P_CSV_DATA
343385
End If
344386
End Sub
345387
Private Sub EnableOptimization(Optional Optimize As Boolean = True)
@@ -708,12 +750,20 @@ Attribute JoinRecordsFields.VB_Description = "Joins all fields for each record i
708750
Dim JoinBuffer(0 To 2) As String
709751
Dim LB1 As Long, UB1 As Long
710752
Dim LB2 As Long, UB2 As Long
753+
Dim TwoDimensional As Boolean
711754

712755
On Error GoTo JoinRecordsFields_Error
713-
LB1 = LBound(RecordsArray, 1)
714-
LB2 = LBound(RecordsArray, 2)
715-
UB1 = UBound(RecordsArray, 1)
716-
UB2 = UBound(RecordsArray, 2)
756+
If MultiDimensional(RecordsArray) Then
757+
TwoDimensional = True
758+
LB1 = LBound(RecordsArray, 1)
759+
LB2 = LBound(RecordsArray, 2)
760+
UB1 = UBound(RecordsArray, 1)
761+
UB2 = UBound(RecordsArray, 2)
762+
Else
763+
TwoDimensional = False
764+
LB1 = LBound(RecordsArray, 1)
765+
UB1 = UBound(RecordsArray, 1)
766+
End If
717767
'@----------------------------------------------------------------------------
718768
Select Case P_QUOTING_MODE
719769
Case QuotationMode.Critical
@@ -732,39 +782,71 @@ Attribute JoinRecordsFields.VB_Description = "Joins all fields for each record i
732782
JoinBuffer(0) = CoerceChr
733783
JoinBuffer(1) = vbNullString
734784
JoinBuffer(2) = CoerceChr
735-
'@----------------------------------------------------------------------------
736-
'Set array sizes
737-
ReDim ConcatenatedArray(LB1 To UB1)
738-
ReDim buffer(LB2 To UB2)
739-
'@----------------------------------------------------------------------------
740-
'Concatenate fields
741-
For iLCounter = LB1 To UB1
742-
For jLCounter = LB2 To UB2
743-
If InStrB(1, RecordsArray(iLCounter, jLCounter), P_FIELDS_DELIMITER) Then
744-
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
745-
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
746-
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), CoerceChr) Then
747-
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
748-
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
749-
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), P_RECORDS_DELIMITER) Then
750-
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
751-
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
785+
If TwoDimensional Then
786+
'@----------------------------------------------------------------------------
787+
'Set array sizes
788+
ReDim ConcatenatedArray(LB1 To UB1)
789+
ReDim buffer(LB2 To UB2)
790+
'@----------------------------------------------------------------------------
791+
'Concatenate fields
792+
For iLCounter = LB1 To UB1
793+
For jLCounter = LB2 To UB2
794+
If InStrB(1, RecordsArray(iLCounter, jLCounter), P_FIELDS_DELIMITER) Then
795+
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
796+
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
797+
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), CoerceChr) Then
798+
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
799+
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
800+
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), P_RECORDS_DELIMITER) Then
801+
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
802+
buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
803+
Else
804+
buffer(jLCounter) = RecordsArray(iLCounter, jLCounter)
805+
End If
806+
JoinBuffer(1) = vbNullString
807+
Next jLCounter
808+
ConcatenatedArray(iLCounter) = Join$(buffer, P_FIELDS_DELIMITER)
809+
Next iLCounter
810+
'@----------------------------------------------------------------------------
811+
'Concatenate records
812+
JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
813+
'@----------------------------------------------------------------------------
814+
'Free the memory
815+
Erase ConcatenatedArray
816+
Erase buffer
817+
Else
818+
'@----------------------------------------------------------------------------
819+
'Set array sizes
820+
ReDim ConcatenatedArray(LB1 To UB1)
821+
ReDim buffer(0)
822+
'@----------------------------------------------------------------------------
823+
'Concatenate fields
824+
For iLCounter = LB1 To UB1
825+
If InStrB(1, RecordsArray(iLCounter), P_FIELDS_DELIMITER) Then
826+
JoinBuffer(1) = RecordsArray(iLCounter)
827+
buffer(0) = Join$(JoinBuffer, vbNullString)
828+
ElseIf InStrB(1, RecordsArray(iLCounter), CoerceChr) Then
829+
JoinBuffer(1) = RecordsArray(iLCounter)
830+
buffer(0) = Join$(JoinBuffer, vbNullString)
831+
ElseIf InStrB(1, RecordsArray(iLCounter), P_RECORDS_DELIMITER) Then
832+
JoinBuffer(1) = RecordsArray(iLCounter)
833+
buffer(0) = Join$(JoinBuffer, vbNullString)
752834
Else
753-
buffer(jLCounter) = RecordsArray(iLCounter, jLCounter)
835+
buffer(0) = RecordsArray(iLCounter)
754836
End If
755837
JoinBuffer(1) = vbNullString
756-
Next jLCounter
757-
ConcatenatedArray(iLCounter) = Join$(buffer, P_FIELDS_DELIMITER)
758-
Next iLCounter
759-
'@----------------------------------------------------------------------------
760-
'Concatenate records
761-
JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
762-
'@----------------------------------------------------------------------------
763-
'Free the memory
764-
Erase ConcatenatedArray
765-
Erase buffer
838+
ConcatenatedArray(iLCounter) = buffer(0)
839+
Next iLCounter
840+
'@----------------------------------------------------------------------------
841+
'Concatenate records
842+
JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
843+
'@----------------------------------------------------------------------------
844+
'Free the memory
845+
Erase ConcatenatedArray
846+
Erase buffer
847+
End If
766848
Case Else
767-
If MultiDimensional(RecordsArray) Then
849+
If TwoDimensional Then
768850
'@----------------------------------------------------------------------------
769851
'Set delimiters
770852
Select Case P_ESCAPE_CHAR
@@ -858,7 +940,7 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
858940
Optional HeadersOmission As Boolean = False)
859941
Dim ASCIIcharw As Long
860942
Dim buffer() As String
861-
Dim Counter1 As Long, Counter2 As Long
943+
Dim Counter1 As Long
862944
Dim CurrentBufferIndex As Long
863945
Dim CurrentRecordSize As Long
864946
Dim CurrenttmpTokenIndex As Long
@@ -885,7 +967,6 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
885967
Dim SplittedToken As Boolean
886968
Dim StartRecord As Long
887969
Dim tmpCSV() As String
888-
Dim tmpOutputArray() As String
889970
Dim tmpToken() As String
890971
Dim TokenBeginningPos As Long
891972
Dim TokenEndingPos As Long
@@ -1336,22 +1417,18 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
13361417
SkipUnwantedLines index, MaxIndex, tmpCSV
13371418
If index <= MaxIndex Then LenCurrentIndex = LenB(tmpCSV(index))
13381419
Loop
1339-
If ImportDepth <> RecordsCount Then 'There are empty index in the array
1340-
ReDim tmpOutputArray(0 To RecordsCount - 1, 0 To FieldsAmount - 1)
1341-
For Counter1 = 0 To RecordsCount - 1
1342-
For Counter2 = 0 To FieldsAmount - 1
1343-
tmpOutputArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
1344-
P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
1345-
Next Counter2
1346-
Next Counter1
1347-
Erase P_CSV_DATA
1348-
P_CSV_DATA() = tmpOutputArray()
1349-
Erase tmpOutputArray
1420+
'@----------------------------------------------------------------------------
1421+
'Check if the array need to be shrinked at the output stage
1422+
If ImportDepth <> RecordsCount Then
1423+
P_NEED_SHRINK = True
1424+
P_OUTPUT_UB1 = RecordsCount - 1
1425+
P_OUTPUT_UB2 = FieldsAmount - 1
1426+
Else
1427+
P_NEED_SHRINK = False
13501428
End If
13511429
Erase tmpCSV
13521430
Exit Sub
13531431
ParseCriticalCSV_Error_Handler:
1354-
Erase tmpOutputArray
13551432
Erase P_CSV_DATA
13561433
Erase tmpCSV
13571434
P_ERROR_NUMBER = Err.number

0 commit comments

Comments
 (0)