【问题标题】:Trying to import a CSV file into a sheet named IMPORT尝试将 CSV 文件导入名为 IMPORT 的工作表
【发布时间】:2020-03-02 02:33:00
【问题描述】:

这是我的 Txt 文件的样子...这是通过一个旧但有用的工具导出的:

这是我在网上找到的代码:

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

这是我的结果:

无论我尝试什么,我总是被引号和逗号卡住。

这是工作代码:

 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

【问题讨论】:

  • 一种解决方案是添加另一个条件循环以删除引号和逗号
  • 起始数据是全部在一个单元格中,还是像“AAAA”这样的值都在自己的单元格中?如果全部在一个单元格中,则使用 TextToColumns。如果在单独的单元格中,则执行 Replace() 以删除不需要的字符。
  • 您的 ParseData 函数正在重新发明现有的 Excel 功能。
  • 嗨 BigBen,问题是我不能使用 QueryTable,因为一旦我完成了导入,我需要将数据转换为表格,因为 QueryTable 函数创建了一个表格,我可以'不发布或修改......但它确实以正确的方式复制数据!

标签: excel vba csv import


【解决方案1】:

尝试在 "sValue = ParseData(sLine, "','")" 上方添加这个以删除单引号

sLine = Replace(sLine, "'", "")

【讨论】:

  • 它似乎来自 ParseData 函数......这是我现在得到的......'5555' 所以之前和之后......如果我在 ParseData 之前观看值,它们不是在那里。
【解决方案2】:

您的最后一次代码迭代表明您的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多