Mas @Lexs194 ...
Yang tidak saya pahami, jika ingin melihat field separator-nya, mengapa yang dibuka di Notepad adalah file Excel-nya, bukan file CSV-nya... :)
Pada penjelasan awal, saya ingin mas @Lexs194 paham bahwa jika proses membaca data dari file CSV dilakukan secara berulang dengan melakukan proses parsing data per baris teks yang dibaca menggunakan fungsi SPLIT, maka ketentuan utamanya adalah setiap kolom data yang dibaca harus benar-benar terpisah sesuai tanda pemisahnya. Jadi jika dalam prosesnya kita menggunakan tanda koma sebagai pemisah antar kolom data atau data field-nya, maka proses akan mengalami kesalahan saat bertemu dengan teks seperti berikut:
123, "Solar Cell dan Battery, on going pengadaan genset fix by DMT", 96.62
Pada contoh teks tersebut, jika menurut ketentuan harusnya teks terpisah menjadi 3 kolom, kenyataannya teks akan terpisah menjadi 4 kolom seperti berikut:
123 | "Solar Cell dan Battery | on going pengadaan genset fix by DMT" | 96.62
Jadi bagaimana solusinya? Logika saya hanya melihat ada 2 kemungkinan modifikasi dari script VBA yang sudah pernah kita bahas sebelumnya:
[1]. Menguji apakah dimensi baris data sama dengan dimensi baris header, misalkan algoritmanya:
xHeader = SPLIT(TEXT_HEADER_A, ",")
xArray = SPLIT(sBuffer, ",")
If UBound(xHeader) <> UBound(xArray) Then
'+--- Script untuk menguji elemen array xArray.
End If
[2]. Menguji setiap karakter pada baris data yang kita apakah ada karakter yang masuk kualifikasi teks, yakni jika ada 2 tanda petik ganda dalam teks tersebut. Sebagai contoh:
Sub TesSaja()
Dim sBuffer As String, sTempA As String, sTempB As String, sTempC As String
Dim lPos1 As Long, lPos2 As Long
Dim lIdx As Long
Dim xArray
sBuffer = "123, ""Solar Cell dan Battery, on going pengadaan genset fix by DMT"", 96.62"
lPos1 = InStr(1, sBuffer, Chr$(34))
If lPos1 > 0 Then
lPos2 = InStr(lPos1 + 1, sBuffer, Chr$(34))
If lPos2 > 0 Then
sTempA = Mid$(sBuffer, 1, lPos1 - 1)
sTempB = Mid$(sBuffer, lPos2 + 1, 1000)
sTempC = Mid$(sBuffer, 1, lPos2)
Debug.Print "[1] "; sBuffer
sBuffer = Replace(sTempC, Chr$(44), Chr$(250), lPos1)
sBuffer = Replace(sBuffer, Chr$(34), vbNullString, 1)
Debug.Print "[2] "; sBuffer
sBuffer = sTempA & sBuffer & sTempB
Debug.Print "[3] "; sBuffer
End If
End If
Debug.Print
xArray = Split(sBuffer, Chr$(44))
If UBound(xArray) > -1 Then
For lIdx = 0 To UBound(xArray)
sTempA = Trim$(xArray(lIdx))
If InStr(1, sTempA, Chr$(250)) > 0 Then
xArray(lIdx) = Replace(sTempA, Chr$(250), Chr$(44))
End If
If lIdx < UBound(xArray) Then
Debug.Print Trim$(xArray(lIdx)) & " | ";
Else
Debug.Print Trim$(xArray(lIdx))
End If
Next
End If
End Sub
Perintah Debug.Print
pada script di atas akan menghasilkan (lihat pada jendela Immediate):
[1] 123, "Solar Cell dan Battery, on going pengadaan genset fix by DMT", 96.62
[2] Solar Cell dan Batteryú on going pengadaan genset fix by DMT
[3] 123, Solar Cell dan Batteryú on going pengadaan genset fix by DMT, 96.62
123 | Solar Cell dan Battery, on going pengadaan genset fix by DMT | 96.62
Script pada solusi kedua ini tentunya jika akan digunakan masih membutuhkan banyak penyesuaian dan penambahan script, karena:
— a). belum dapat digunakan untuk memeriksa apakah baris data memiliki lebih dari 1 kualifikasi teks. Contoh pada teks:
123, "Solar Cell dan Battery, on going pengadaan genset fix by DMT", 96.62, "TEXTA, TEXTB", 1000
yang jika script dieksekusi maka akan menghasilkan:
123 | Solar Cell dan Battery, on going pengadaan genset fix by DMT | 96.62 | "TEXTA | TEXTB" | 1000
— b). pada saat baris data tidak memenuhi kualifikasi teks (yakni jika tidak ada 2 tanda petik ganda), maka akan terjadi kesalahan kembali. Contoh untuk teks seperti berikut:
123, "Solar Cell dan Battery, on going pengadaan genset fix by DMT, 96.62
jika script dieksekusi maka akan menghasilkan:
123 | "Solar Cell dan Battery | on going pengadaan genset fix by DMT | 96.62
Kembali hasilnya tidak sesuai. Dengan contoh teks tersebut, kesalahan juga terjadi saat kita mengimpor data menggunakan fitur impor (DATA » FROM TEXT) pada Excel oleh karena kualifikasi sebuah teks tidak terpenuhi.
Jika tidak ingin melakukan perubahan besar pada script yang sudah digunakan, tentunya yang harus mas @Lex194 lakukan adalah memeriksa terlebih dahulu file CSV-nya, dan mengubah baris data yang memiliki kualifikasi sebuah teks agar dapat diloading oleh script yang sudah ada. Contohnya mengubah teks:
"Solar Cell dan Battery, on going pengadaan genset fix by DMT"
menjadi:
"Solar Cell dan Battery: on going pengadaan genset fix by DMT"
namun pastinya akan melelahkan jika ada banyak baris data yang akan diproses. Jadi silahkan ditentukan solusi mana yang akan mas gunakan.
Untuk mengolah data yang kita impor dari CSV ke Worksheet Excel sebagaimana yang sudah saya contohkan di atas, ada banyak cara yang dapat dilakukan, diantaranya:
[1]. Mengisi variabel array dengan range data per baris, contoh:
xArray = SheetTemp.Range("A2:BF2").Value
Catatan: dengan teknik ini, indeks elemen terbawah adalah 1, bukan 0. Dan xArray
akan menjadi array 2 dimensi. Sehingga untuk mengaksesnya menggunakan xArray(RowIdx, ColIdx)
dimana untuk contoh di atas, karena hanya dibaca per baris maka RowIdx = 1 sedangkan ColIdx merujuk ke indeks kolom.
[2]. Membaca isi per sel:
Redim xArray(lCols - 1)
For lRow = 2 To lRows
For lCol = 0 To lCols - 1
xArray(lCol) = SheetTemp.Cells(lRow, lCol +1)
Next
Next
Catatan: lRows adalah indeks baris data terakhir dari SheetTemp, misalkan baris data terakhir ada pada range A3:BF3, maka lRow = 3. Sedangkan lCols adalah indeks kolom terakhir, misalkan kolom BF yang sama dengan kolom ke-58.
Demikian saja yang bisa saya jelaskan.