Попытка импортировать файл CSV в лист с именем IMPORT - PullRequest
0 голосов
/ 05 ноября 2019

Вот как выглядит мой текстовый файл ... он экспортируется с помощью старого, но полезного инструмента:

Вот код, который я нашел в Интернете:

Option explicit

Sub ReadInCommaDelimFile()

Dim rFirstCell As Range 'Points to the First Cell in the row currently being updated
Dim rCurrentCell As Range 'Points the the current cell in the row being updated
Dim sCSV As String 'File Name to Import
Dim iFileNo As Integer 'File Number for Text File operations
Dim sLine As String 'Variable to read a line of file into
Dim sValue As String 'Individual comma delimited value

'Prompt User for File to Import
sCSV = Application.GetOpenFilename("CSV Files, *.TXT", , "Select File to Import")
If sCSV = "False" Then Exit Sub

'Clear Existing Data
ThisWorkbook.Worksheets("IMPORT").Cells.Delete
'wsData.Cells.Delete 'Use this method if you set the vb-name of the sheet

'Set initial values for Range Pointers
Set rFirstCell = Range("A2")
Set rCurrentCell = rFirstCell

'Get an available file number
iFileNo = FreeFile

'Open your CSV file as a text file
Open sCSV For Input As #iFileNo

'Loop until reaching the end of the text file
Do Until EOF(iFileNo)

    'Read in a line of text from the CSV file
    Line Input #iFileNo, sLine

    Do
        sValue = ParseData(sLine, "','")


        If sValue <> "" Then
            rCurrentCell = sValue 'put value into cell
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
        End If

    Loop Until sValue = ""

    Set rFirstCell = rFirstCell.Offset(1, 0) 'move pointer down one row
    Set rCurrentCell = rFirstCell 'set output pointer to next line
Loop

'Close the Text File
Close #iFileNo

 End Sub

 Private Function ParseData(sData As String, sDelim As String) As String
 Dim iBreak As Integer

iBreak = InStr(1, sData, sDelim, vbTextCompare)

If iBreak = 0 Then
    If sData = "" Then
        ParseData = ""
    Else
        ParseData = sData
        sData = ""
    End If
Else
    ParseData = Left(sData, iBreak - 1)
    sData = Mid(sData, iBreak + 1)
End If

End Function

Вот мой результат:

enter image description here

Независимо от того, что я пытаюсь, я всегда застреваю с кавычкой и запятыми.

Вот рабочий код:

 Option Explicit

 Sub ReadInCommaDelimFile()
 Dim rFirstCell As Range 'Points to the First Cell in the row currently being updated
 Dim rCurrentCell As Range 'Points the the current cell in the row being updated
 Dim sCSV As String 'File Name to Import
 Dim iFileNo As Integer 'File Number for Text File operations
 Dim sLine As String 'Variable to read a line of file into
 Dim sValue As String 'Individual comma delimited value
 Dim sValue2 As String 'Individual comma delimited value



'Prompt User for File to Import
sCSV = Application.GetOpenFilename("CSV Files, *.TXT", , "Select File to Import")
If sCSV = "False" Then Exit Sub

'Clear Existing Data
ThisWorkbook.Worksheets("IMPORT").Cells.Delete
'wsData.Cells.Delete 'Use this method if you set the vb-name of the sheet

'Set initial values for Range Pointers
Set rFirstCell = Range("A2")
Set rCurrentCell = rFirstCell

'Get an available file number
iFileNo = FreeFile

'Open your CSV file as a text file
Open sCSV For Input As #iFileNo

'Loop until reaching the end of the text file
Do Until EOF(iFileNo)

    'Read in a line of text from the CSV file
    Line Input #iFileNo, sLine

    Do
        sValue = ParseData(sLine, ",")


        If sValue <> "" Then
            sValue2 = Left(sValue, Len(sValue) - 1)
            sValue2 = Right(sValue2, Len(sValue2) - 1)
            rCurrentCell = sValue2 'put value into cell
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
        End If

    Loop Until sValue = ""

    Set rFirstCell = rFirstCell.Offset(1, 0) 'move pointer down one row
    Set rCurrentCell = rFirstCell 'set output pointer to next line
Loop

'Close the Text File
Close #iFileNo

End Sub

Private Function ParseData(sData As String, sDelim As String) As String
 Dim iBreak As Integer

iBreak = InStr(1, sData, sDelim, vbTextCompare)

If iBreak = 0 Then
    If sData = "" Then
        ParseData = ""
    Else
        ParseData = sData
        sData = ""
    End If
Else
    ParseData = Left(sData, iBreak - 1)
    sData = Mid(sData, iBreak + 1)
End If

End Function

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Ваша последняя итерация кода указывает, что ваш файл CSV сохранен как файл *.txt.

Если это действительно так, вы можете открыть его, используя метод Workbooks.OpenText, который позволит вамдля правильного анализа данных, в том числе обработки символа-спецификатора текста в одной кавычке.

Это не создаст таблицу, как это делает метод QueryTables.

Затем скопируйте данные из этой недавно открытой рабочей книги в вашу IMPORT лист в вашей текущей книге.

Например:

Option Explicit
Sub ReadInCommaDelimFile()
    Dim sCSV
    Dim WB As Workbook, dataWS As Worksheet
sCSV = Application.GetOpenFilename("CSV Files (*.txt),*.txt", , "Select File to Import")
    If sCSV = False Then Exit Sub

ThisWorkbook.Worksheets("IMPORT").Cells.Clear

Application.ScreenUpdating = False
Workbooks.OpenText Filename:=sCSV, _
        textqualifier:=xlTextQualifierSingleQuote, _
        consecutivedelimiter:=True, _
        Tab:=False, _
        semicolon:=False, _
        comma:=True, _
        Space:=False, _
        other:=False

Set WB = ActiveWorkbook

Set dataWS = WB.Worksheets(1)

dataWS.UsedRange.Copy ThisWorkbook.Worksheets("IMPORT").Range("A2")

WB.Close savechanges:=False

End Sub
0 голосов
/ 05 ноября 2019

Попробуйте добавить это выше "sValue = ParseData (sLine," ',' ")", чтобы удалить одинарные кавычки

sLine = Replace(sLine, "'", "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...