在添加为系列设置 x 轴范围的行之前,可以选择并绘制任何文件组合。使用该行(' * * * * 在末尾)如果在下一组要绘制的文件中选择了一个已经在绘图上的文件,而不是新组中的第一个文件,则会发生错误。如果该行被注释,问题就会消失。如果每个系列都有自己的 x 轴值,则某些数据无法正确绘制(也有一个示例 csv 文件)。正在绘制的文件是 170kB 的 csv 文件。可以提供工作表和文件。
Sub GetDataAndDisplayChart()
Dim vFile, vFiles
Dim iFirst As Integer
Dim lRow As Long
Dim rXValues As Range
Dim rYValues As Range
Dim iSer As Integer
Dim WkShName As String
Dim StartWkShCnt As Integer
StartWkShCnt = Worksheets.Count
' get a set of CSV files to chart
vFiles = Application.GetOpenFilename("csv files (*.csv), *.csv", , "Select files to chart", , True)
If TypeName(vFiles) = "Boolean" Then Exit Sub
Application.ScreenUpdating = False
iFirst = ThisWorkbook.Sheets.Count + 1
' import each selected CSV file to a new sheet in this workbook
For Each vFile In vFiles
Workbooks.OpenText vFile, xlWindows, DataType:=xlDelimited, comma:=True
' move the sheet into this workbook
ActiveSheet.Move after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next
Worksheets(iFirst).Select
Application.ScreenUpdating = True
' confirm the range to plot
Set rXValues = Range("$A$3:$A$10002")
Set rYValues = Range("$B$3:$B$10002")
Worksheets("Chart").Select
With Worksheets("Chart").ChartObjects(1).Chart
' add the first set of data to the existing chart (can have problems if you delete the old data first)
.SeriesCollection.Add Union(rXValues, rYValues), serieslabels:=True, categorylabels:=True, Replace:=True
.SeriesCollection(.SeriesCollection.Count).Name = Worksheets(iFirst).Range("A1")
' delete the old curves that were already on the chart
For iSer = .SeriesCollection.Count - 1 To 1 Step -1
.SeriesCollection(iSer).Delete
Next
' add the new data from the addtional files
For iSer = iFirst + 1 To Worksheets.Count
.SeriesCollection.Add Worksheets(iSer).Range(rYValues.Address)
WkShName = Worksheets(iSer).Name
.SeriesCollection(iSer - StartWkShCnt).XValues = "= " & WkShName & "!" & rXValues.Address '****
.SeriesCollection(.SeriesCollection.Count).Name = Worksheets(iSer).Range("A1")
Next
End With
' delete the older worksheets that were already here
Application.DisplayAlerts = False
For iSer = iFirst - 1 To 1 Step -1
If Worksheets(iSer).Name <> "Chart" Then Worksheets(iSer).Delete
Next
End Sub