首页 > 解决方案 > 如何绘制从 csv 导入的数据?

问题描述

我正在尝试将模拟中的 CSV 输出数据导入 Excel 工作表,以在常规 XY 散点图中绘制数据。

除了最终结果,我管理了一切。数据从 csv 导入 Excel,点被逗号替换为小数分隔符。

它在 0 y 坐标处绘制一条水平直线。
结果图表

我注意到 Excel 中的值存储为文本,尽管我将 csv 的数字内容的格式指定为如下数字:

DataSheet.Cells(Row, col).NumberFormat = "0.E+00"

当我测试Isnumeric(cell.value)时,结果是正面的。

我的完整代码:

CsvFile = Application.GetOpenFilename()
Set DataSheet = Worksheets("CSV_Plot")
nrow = 10 'data starts at 10th row
Open CsvFile For Input As #1

Do Until EOF(1)
Line Input #1, CsvLine
CsvItem = Split(CsvLine, ",")
If Not CsvItem(0) <> "" Then GoTo 10 'ignores first line
ncol = UBound(CsvItem) 'ncol = number of data columns
    If IsNumeric(CsvItem(0)) Then
    
    For i = 0 To ncol
    CsvItem(i) = Replace(CsvItem(i), ".", ",") 'replace point with comma in 'numerical values
    Next i
     
    End If
Add1 = DataSheet.Cells(nrow, LBound(CsvItem) + 1).Address
Add2 = DataSheet.Cells(nrow, ncol + 1).Address

DataSheet.Range(Add1 & ":" & Add2) = CsvItem


nrow = nrow + 1
10:
    Loop
nrowlast = nrow

Close #1



For Row = 11 To nrowlast
    For col = 1 To ncol
    DataSheet.Cells(Row, col).Select
    DataSheet.Cells(Row, col).NumberFormat = "0.E+00"   
      
    Next col

Next Row

Set ChtObj = DataSheet.ChartObjects.Add(50, 50, 500, 300)
  Set Cht = ChtObj.Chart
  
  With Cht
    .ChartType = xlXYScatterLines
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = DataSheet.Range("A11:A35")
    .SeriesCollection(1).Values = DataSheet.Range("N11:N35")
    
      
  End With

标签: excelvba

解决方案


经过一番努力,我找到了问题的根源:我已经定义CsvItem()为字符串,这就是为什么当我执行语句时DataSheet.Range(Add1 & ":" & Add2) = CsvItem,excel中的值始终是文本,而与格式无关。

解决方案是定义一个变量来保存 CsvItem 的数值并将该值分配给 excel 单元格:

Dim CsvVal() As Double
CsvVal(i) = CDbl(CsvItem(i))
DataSheet.Range(Add1 & ":" & Add2).Value = CsvVal

这最终产生了我想要的结果。


推荐阅读