【问题标题】:Import CSV without formatting导入不带格式的 CSV
【发布时间】:2017-12-30 05:18:28
【问题描述】:

我正在尝试将 CSV 文件导入我当前的工作簿;但是,它会自动格式化我的一些数据。有没有办法防止这种情况发生?


示例:

01JAN-1

自动转换为:

01 年 1 月 1 日


我查找了添加Local:= true,但我不确定如何实现它。我试过wb = Workbooks.Open(fileImportName, Local:=True)


代码:

Sub file_Import()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim fileImportPath As String, fileImportName As String, total As Integer, currentWorkbook As String

    fileImportPath = "C:\Users\UserName\Desktop\Test Data.csv"
    fileImportName = "Test Data.csv"
    currentWorkbook = "Testing Import.xlsm"
    total = Workbooks(currentWorkbook).Worksheets.Count

    Workbooks.Open (fileImportName)

    Workbooks(fileImportName).Worksheets(Sheets(1).Name).Copy _
    After:=Workbooks(currentWorkbook).Worksheets(total)

    Workbooks(fileImportName).Close

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

【问题讨论】:

  • 如果在导入后手动将列改回Text,是否显示正确?如果是这样,这可能会回答您的问题:stackoverflow.com/questions/8265350/…
  • 它没有,当我尝试将其转换为文本时,它会将其转换为 36892。我想要它的原始形式,因为这不是日期,而是项目名称。
  • 您必须在粘贴之前将单元格格式化为 Text NumberFormat = "@"
  • 是否发生了您真正需要/想要的自动转换?您可以将 CSV 内容读入内存,分配给二维数组,然后写入工作表。但是使用这种方法,您将完全失去任何想要/有用的自动转换。
  • 抱歉没时间了,您需要在目标文件中添加一个新工作表,在新工作表中,您必须将列(您的“项目名称”将被粘贴的位置)格式化为文本,然后打开您的 .cvs 文件并复制使用的范围并粘贴到新工作表中的范围“A1”。

标签: vba excel csv


【解决方案1】:

下面的代码尝试覆盖第一个工作表的内容。为了安全起见,在运行之前保存工作簿的副本。您需要提供 CSV 的完整路径。我假设您在 CSV 的每一行上都有相同数量的列:

Option explicit

Sub CSVtoSheet()

Const FILEPATH as string = "C:\New Folder\test.csv" 'Replace with your own path; or consider changing to variable and assign dynamically.'

Const DELIMITER as string = ","

' Read into memory; assumes file will fit and is not too big.'
Dim FileContents as string
Open FILEPATH for binary access read as #1
Filecontents = space$(lof(1))
Get #1, 1, filecontents
Close #1

' Assign lines in file to 1-dimensional, 0-based array of strings'
Dim AllLines() as string
AllLines = split(filecontents,vbNewLine)

Dim NumberOfRows as long
Dim NumberOfColumns as long

NumberOfRows = ubound(alllines)+1'Watch out if last line of CSV is blank, as is sometimes the case. Rows which do not contain column delimiter can produce error/unwanted behaviour.'

' Assume number or columns is fixed throughout CSV and can be reliably deduced from first line alone'
NumberOfColumns = ubound(split(alllines(lbound(alllines)),delimiter))+1

Dim ArrayToWriteToSheet() as string 'Change to as variant if you need numeric values as numbers'
Redim ArrayToWriteToSheet(1 to NumberOfRows, 1 to NumberOfColumns)

' Iterate through each element in array'
Dim RowIndex as long, ColumnIndex as long
Dim TemporaryArray() as string

For RowIndex = lbound(arraytowritetosheet,1) to ubound(arraytowritetosheet,1)

If Len(alllines(rowindex-1)) > 0 then ' Skip any blank lines; sometimes final line in CSV is empty which can result in errors/unwanted behaviour.'

TemporaryArray = split(alllines(rowindex-1),delimiter)

For ColumnIndex = lbound(arraytowritetosheet,2) to ubound(arraytowritetosheet,2)

Arraytowritetosheet(RowIndex,ColumnIndex) = temporaryarray(columnindex-1)

Next columnindex

End if

Next rowindex

'Write to first sheet in workbook. Hopefully, Excel will not do any unwanted auto-conversion.'
Thisworkbook.worksheets(1).range("A1"). Resize(ubound(arraytowritetosheet,1),ubound(arraytowritetosheet,2)).value2 = arraytowritetosheet

End sub

它做你想做的事吗?从理论上讲,一旦您在内存中获得了值,您就可以在写回工作表之前随意格式化/呈现。

未经测试,在移动设备上编写。

【讨论】:

  • 我会使用这个,因为简单的复制和粘贴不起作用。一旦我得到一些工作,就会让你知道并投票。谢谢!
  • 这种方式行得通,我只需要理解代码并修改它,以便它抓取所有列。谢谢!
  • 如果您想更详细地注释代码的任何特定部分,请告诉我。
  • @chillin 非常感谢您的解决方案。令人惊奇的是,您可以在没有语法检查的情况下如此准确地输入它。两个问题:1)除了保存 csv 中的 TEXT 值之外,别无选择? 2) 是否有一种简单的方法可以删除或防止" 出现在值为实际字符串的 ArrayToWriteToSheet() 中?现在我正在循环遍历需要用"" 替换()它们的列。谢谢
  • @rockhammer,抱歉回复晚了,我不是每天都使用 StackOverflow。 #1 一种方法可能是获取范围(正在写入的值)并在写入之前应用文本数字格式。所以像someRange.NumberFormat = "@" 这样的东西,然后是someRange.Value2 = ArrayToWriteToSheet——这应该保持一切原样。 (或者,您可以将文本编号格式仅应用于需要保留为文本的列。)如果您需要示例,请告诉我。
猜你喜欢
  • 2020-12-26
  • 2015-03-05
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2015-04-14
  • 2014-12-28
相关资源
最近更新 更多