|
Option Explicit
Sub sbParseCSV()
On Error GoTo Command32_Click_Error_Routine
Dim text As String
Dim iRow As Long
Dim iColumn As Long
Dim iChr1 As Long
Dim iChr2 As Long
Dim iCRPos As Long
Dim iCommaPos As Long
Dim iQuotePos As Long
Dim ii As Long
With CreateObject("ADODB.Stream")
.Open
.Charset = "UTF-8"
.LoadFromFile ActiveWorkbook.Path & "\\nw_Employees.csv"
text = .ReadText(-1)
.Close
End With
Cells.Select
Selection.Delete Shift:=xlUp
Range("O24").Select
iRow = 1
iColumn = 1
iChr1 = 1 ' there isn't a comma separator at the start of the file
iChr2 = InStr(2, text, Chr(44)) ' ie the first comma
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1, iChr2 - iChr1)
iColumn = iColumn + 1
For ii = 1 To Len(text) Step 1
Select Case Mid(text, ii, 1)
Case Chr(44) ' comma
iChr1 = ii
If Mid(text, ii + 1, 1) = Chr(34) Then
' process a string in double quotes
iChr2 = InStr(ii + 2, text, Chr(34)) ' ie the next double quote
If Mid(text, iChr2 + 1, 1) = Chr(34) Then
' process double double quote
iChr2 = InStr(iChr2 + 2, text, Chr(34)) ' the second double double quote
iChr2 = InStr(iChr2 + 2, text, Chr(34)) ' the final double quote ?
If Mid(text, iChr2 + 1, 1) = Chr(34) Then
' process another double double quote
' -> my test data was the employees table from Northwind
iChr2 = InStr(iChr2 + 2, text, Chr(34)) ' the second double double quote
iChr2 = InStr(iChr2 + 2, text, Chr(34)) ' surely the final double quote ?
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 2, iChr2 - iChr1 - 2)
Call fnWrapTextFalse(iRow, iColumn)
iColumn = iColumn + 1
ii = iChr2 ' move the pointer to the final double quote
GoTo Next_ii
End If
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 2, iChr2 - iChr1 - 2)
Call fnWrapTextFalse(iRow, iColumn)
iColumn = iColumn + 1
ii = iChr2 ' move the pointer to the final double quote
GoTo Next_ii
End If
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 2, iChr2 - iChr1 - 2)
Call fnWrapTextFalse(iRow, iColumn) ' in case there was a crlf in the text eg 2 lines of address
iColumn = iColumn + 1
ii = iChr2 ' move the pointer to the final double quote
GoTo Next_ii
End If
iCommaPos = InStr(ii + 1, text, Chr(44)) ' ie the next comma
iCRPos = InStr(ii + 1, text, Chr(13)) ' end of line has no comma at the end
If iCommaPos < iCRPos Then
iChr2 = iCommaPos
Else
iChr2 = iCRPos
End If
If iChr2 = 0 Then ' found CR but no more commas
iChr2 = Len(text) ' the end of the file
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 1, iChr2 - iChr1 - 1)
GoTo sbExit
End If
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 1, iChr2 - iChr1 - 1)
iColumn = iColumn + 1
GoTo Next_ii
Case Chr(13) ' carriage return
iColumn = 1
GoTo Next_ii
Case Chr(10) ' line feed - this is the end of a line
iRow = iRow + 1
iChr1 = ii
iChr2 = InStr(ii + 1, text, Chr(44)) ' ie the next comma
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Value = _
"Tx " & Mid(text, iChr1 + 1, iChr2 - iChr1 - 1)
iColumn = iColumn + 1
GoTo Next_ii
Case Else
End Select
Next_ii:
Next ii
sbExit:
Command32_Click_Exit_Routine:
Exit Sub
Command32_Click_Error_Routine:
Dim sFilename As String
sFilename = "C:\Users\david\Desktop\err" & Format(Now(), "yyyymmddHHMMSS") & ".txt"
Open sFilename For Output As #1
Print #1, "Industrial Computer Contracts (West Midlands) - Error Log - 29th March 2021"
Print #1, Now()
Print #1, Err.Number
Print #1, Err.Description
Print #1, "ii " & ii
Print #1, "**END**"
Close #1
Resume Command32_Click_Exit_Routine
End Sub
Public Function fnWrapTextFalse(iRow As Long, iColumn As Long)
' Range("A1").Select
ThisWorkbook.Sheets("Sheet1").Cells(iRow, iColumn).Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
End Function
Sub sbTest()
MsgBox toHx("aBC")
End Sub
Public Function toHx(strIn As String) As String
Dim strOut As String
strOut = Hex(Asc(Mid(strIn, 1, 1)))
If Len(strOut) = 1 Then strOut = "0" & strOut
strOut = "Hx " & strOut
toHx = strOut
End Function
|
|