返回列表 上一主題 發帖

[發問] 有關excelVBA圖表的問題

本帖最後由 c_c_lai 於 2013-6-12 06:25 編輯
找到了,我是用xlLine劃線,所以才會有每個間距出現,大家可以用 xlXYScatterLinesNoMarkers 試看看。
lin_6219 發表於 2013-6-12 01:13

請看了圖示後,再行觀察。xlXYScatterLinesNoMarkers 並非是主因,
關鍵點應該是 "日期時間軸" 之歸屬,且是位於 xlPrimary 主座標軸。
因為你的日期是用民國年,故在圖表複雜處理下日期顯示亦有不同。
語法內容之增減,結果亦造成會些許之異同。只能在Coding時盡力避開。
如以 圖1、圖2 為例,因 "移動平均線" 與  "日期時間軸" 均位於主座標軸;
圖3~6 則是以股票柱狀圖 (xlStockOHLC) 為主座標軸,是故 圖1~2 論定便不適用。
至於 圖3~4、圖5~6 的顯示日期為何几近雷同的模組會有不同結果那就要
仔細去觀察程式碼了。


TOP

本帖最後由 c_c_lai 於 2013-6-12 06:32 編輯

回復 21# lin_6219
想了想還是將程式模組貼上,你有空時再行觀察。
  1. Sub KChartWithVolume()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  11.         Set ChtObj = .ChartObjects.Add(1, 1, 450, 250)
  12.         
  13.         With ChtObj.Chart
  14.             .SetSourceData Worksheets("繪圖資料").Range("A1:E" & CStr(nRow))
  15.             .ChartType = xlStockOHLC
  16.             .HasTitle = True
  17.             .ChartTitle.Characters.Text = "K線與成交量圖"
  18.                
  19.             With .ChartGroups(1)
  20.                 .AxisGroup = xlPrimary
  21.                 .HasUpDownBars = True
  22.                 .UpBars.Interior.ColorIndex = 3
  23.                 .DownBars.Interior.ColorIndex = 1
  24.                 .GapWidth = 10
  25.             End With
  26.             
  27.             .SeriesCollection.Add Worksheets("繪圖資料").Range("G2:G" & CStr(nRow))
  28.                
  29.             With .SeriesCollection(5)
  30.                 ' .ChartType = xlXYScatterLinesNoMarkers
  31.                 .ChartType = xlLine
  32.                 .AxisGroup = xlPrimary
  33.                 .Border.ColorIndex = 7
  34.                 .Name = "=繪圖資料!$G$1"
  35.             End With
  36.             
  37.             With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  38.                 myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  39.                 myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  40.                 myMin = myMin - (myMax - myMin)
  41.             End With
  42.             
  43.             With .Axes(xlValue)
  44.                 .MaximumScale = Round(myMax, 2)
  45.                 .MinimumScale = Round(myMin, 2)
  46.             End With
  47.             
  48.             .SeriesCollection.NewSeries              '  新增成交量數列
  49.             With .SeriesCollection(6)
  50.                 .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  51.                 .ChartType = xlColumnClustered
  52.                 .Name = "成交量"
  53.                 .Interior.ColorIndex = 17
  54.                 .AxisGroup = xlSecondary             '  設為副座標軸
  55.             End With
  56.             
  57.             With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  58.                 myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  59.                 myMax = myMax * 2
  60.                 myMin = 0.01
  61.             End With
  62.             
  63.             With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  64.                 .MaximumScale = Round(myMax, 0)
  65.                 .MinimumScale = Round(myMin, 0)
  66.             End With
  67.             
  68.              With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  69.                  .CategoryType = xlCategoryScale
  70.                  .TickLabelSpacing = 4                            '  標示間距
  71.                  .TickLabels.NumberFormatLocal = "yyyy/m/d"
  72.                  .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  73.             End With
  74.             
  75.             With .Legend                                          '  刪除不必要的圖例
  76.                 .LegendEntries(2).Delete                          '  開盤價
  77.                 .LegendEntries(2).Delete                          '  最高價
  78.                 .LegendEntries(2).Delete                          '  最低價
  79.                 .LegendEntries(2).Delete                          '  收盤價
  80.                 .Top = .Parent.ChartTitle.Top - 5
  81.             End With
  82.                
  83.             '  With .ChartArea
  84.             '      .Border.Weight = 2
  85.             '      .Border.LineStyle = 0
  86.             '      '  圖表的繪圖區外之 X、Y 軸列示資料數據區塊部分予以填入圖表預設(系統)之底色、可增強視覺效果。
  87.             '      .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, Degree:=0.231372549019608
  88.             '      ' .Fill.Visible = True         '  加入圖表底色變數內給于之色系。
  89.             '      ' .Fill.ForeColor.SchemeColor = 圖表底色
  90.             '  End With
  91.             
  92.             With .PlotArea                                        '  調整繪圖區域大小與位置
  93.                 .Top = .Top - 10
  94.                 .Height = .Height + 10
  95.                 .Width = .Width + 95
  96.             End With
  97.             
  98.             .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  99.             .Axes(xlValue).MajorGridlines.Select
  100.             With Selection.Format.Line
  101.                 .Visible = msoTrue
  102.                 .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  103.                 .ForeColor.TintAndShade = 0
  104.                 .ForeColor.Brightness = 0.8000000119
  105.                 .Transparency = 0
  106.                 .Weight = 0.25
  107.                 .DashStyle = msoLineSysDash
  108.             End With
  109.         End With
  110.         .[A1].Select
  111.     End With
  112. End Sub
複製代碼

TOP

回復 21# lin_6219
  1. Sub KChartWithVolume2()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         '  Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         '  With ChtObj.Chart ~ End With
  14.         '  此範例 改以 Worksheets("主畫面").Shapes.AddChart.Select 的方式處理;
  15.         '              With ActiveChart
  16.         '                  . . . . . . . . . . . .
  17.         '                  With .ChartArea
  18.         '                      .Height = 250
  19.         '                      .Width = 450
  20.         '                  End With
  21.         '                  . . . . . . . . . . . .
  22.         '                  chartname = Trim(Replace(ActiveChart.Name, ActiveSheet.Name, ""))
  23.         '                  .Shapes(chartname).Left = Cells(1, 1).Left
  24.         '                  .Shapes(chartname).Top = Cells(1, 1).Top
  25.         '                  . . . . . . . . . . . .
  26.         '              End With
  27.         '  同理,亦可以使用 Worksheets("主畫面").ChartObjects.Add() 的方式處理
  28.         '  差別只在於 With ActiveChart ~ End With 間,要另行宣告圖表高、寬度,以及座標位置。
  29.         '  換言之, Worksheets("主畫面").ChartObjects.Add() 是一次便宣告完成,宣告物件不同。
  30.         .Shapes.AddChart.Select
  31.         
  32.         '  With ChtObj.Chart
  33.         With ActiveChart
  34.             '  .SetSourceData Worksheets("繪圖資料").Range("A2:E" & CStr(nRow))
  35.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$E$" & CStr(nRow))
  36.             .ChartType = xlStockOHLC
  37.             .HasTitle = True
  38.             .ChartTitle.Characters.Text = "K線與成交量圖"
  39.             
  40.             With .ChartGroups(1)
  41.                 .AxisGroup = xlPrimary
  42.                 .HasUpDownBars = True
  43.                 .UpBars.Interior.ColorIndex = 3
  44.                 .DownBars.Interior.ColorIndex = 1
  45.                 .GapWidth = 10
  46.             End With
  47.             
  48.             '  .SeriesCollection.Add Worksheets("繪圖資料").Range("G1:G" & CStr(nRow))
  49.             .SeriesCollection.Add Source:=Range("繪圖資料!$G$2:繪圖資料!$G$" & CStr(nRow))
  50.                
  51.             With .SeriesCollection(5)
  52.                 .ChartType = xlXYScatterLinesNoMarkers
  53.                 '  .ChartType = xlLine
  54.                 .AxisGroup = xlPrimary
  55.                 ' 如果 主座標值為 xlStockOHLC,此處宣告會被忽視,視同 xlSecondary。
  56.                 .Border.ColorIndex = 7
  57.                 .Name = "=繪圖資料!$G$1"
  58.             End With
  59.                            
  60.             With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  61.                 myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  62.                 myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  63.                 myMin = myMin - (myMax - myMin)
  64.             End With
  65.             
  66.             With .Axes(xlValue)
  67.                 .MaximumScale = Round(myMax, 2)
  68.                 .MinimumScale = Round(myMin, 2)
  69.             End With
  70.             
  71.             '  .SeriesCollection.NewSeries      '  新增成交量數列 (與下述宣告結果一致)
  72.             .SeriesCollection.Add Source:=Range("繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  73.             
  74.             With .SeriesCollection(6)
  75.                 '  此處 .Values 存放值範圍必須是指向 "有實體數據資料" 範圍區域。
  76.                 '  如果使用 .SeriesCollection.NewSeries 宣告,則必須指明 .Values。
  77.                 ' .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  78.                 .ChartType = xlColumnClustered
  79.                 .Name = "成交量"                     '  "=繪圖資料!$F$1" (成交金額)
  80.                 .Interior.ColorIndex = 17
  81.                 .AxisGroup = xlSecondary             '  設為副座標軸
  82.             End With
  83.             
  84.             With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  85.                 myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  86.                 myMax = myMax * 2
  87.                 myMin = 0.01
  88.             End With
  89.             
  90.             With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  91.                 .MaximumScale = Round(myMax, 0)
  92.                 .MinimumScale = Round(myMin, 0)
  93.             End With
  94.             
  95.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  96.                 .CategoryType = xlCategoryScale
  97.                 .TickLabelSpacing = 4                            '  標示間距
  98.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  99.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  100.             End With
  101.             
  102.             With .Legend                                          '  刪除不必要的圖例
  103.                 .LegendEntries(2).Delete                          '  開盤價
  104.                 .LegendEntries(2).Delete                          '  最高價
  105.                 .LegendEntries(2).Delete                          '  最低價
  106.                 .LegendEntries(2).Delete                          '  收盤價
  107.                 .Top = .Parent.ChartTitle.Top - 5
  108.             End With
  109.             
  110.             With .ChartArea
  111.                 .Height = 250                               '  將原本設定之高度調至適度位置
  112.                 .Width = 450
  113.                         
  114.                 .Border.Weight = 2
  115.                 .Border.LineStyle = 0
  116.                 '  圖表的繪圖區外之 X、Y 軸列示資料數據區塊部分予以填入圖表預設(系統)之底色、可增強視覺效果。
  117.                 .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, Degree:=0.231372549019608
  118.                 ' .Fill.Visible = True         '  加入圖表底色變數內給于之色系。
  119.                 ' .Fill.ForeColor.SchemeColor = 圖表底色
  120.             End With
  121.             
  122.             With .PlotArea                                        '  調整繪圖區域大小與位置
  123.                 .Top = .Top - 10
  124.                 .Height = .Height + 15
  125.                 .Width = .Width + 95
  126.             End With
  127.             
  128.             .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  129.             .Axes(xlValue).MajorGridlines.Select
  130.             With Selection.Format.Line
  131.                 .Visible = msoTrue
  132.                 .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  133.                 .ForeColor.TintAndShade = 0
  134.                 .ForeColor.Brightness = 0.8000000119
  135.                 .Transparency = 0
  136.                 .Weight = 0.25
  137.                 .DashStyle = msoLineSysDash
  138.             End With
  139.         End With
  140.             
  141.         chartname = Trim(Replace(ActiveChart.Name, ActiveSheet.Name, ""))
  142.         .Shapes(chartname).Left = Cells(1, 1).Left     '  設定此圖表實際擺放的 X、Y 座標位置。
  143.         .Shapes(chartname).Top = Cells(1, 1).Top

  144.         .[A1].Select
  145.     End With
  146. End Sub
複製代碼

TOP

回復 21# lin_6219
  1. Sub KChartWithVolume3()                         '  K線圖與成交量圖放在同一圖表
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     Worksheets("主畫面").ChartObjects.Delete
  9.     nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  10.     Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  11.    
  12.     With ChtObj.Chart
  13.         .SetSourceData Worksheets("繪圖資料").Range("B2:E" & CStr(nRow))
  14.         .ChartType = xlStockOHLC
  15.         .HasTitle = True
  16.         .ChartTitle.Characters.Text = "K線與成交量圖"
  17.    
  18.         With .ChartGroups(1)
  19.             .AxisGroup = xlPrimary
  20.             .HasUpDownBars = True
  21.             .UpBars.Interior.ColorIndex = 3
  22.             .DownBars.Interior.ColorIndex = 1
  23.             .GapWidth = 10
  24.         End With
  25.         
  26.         .SeriesCollection.Add Worksheets("繪圖資料").Range("G2:G" & CStr(nRow))
  27.         
  28.         With .SeriesCollection(5)
  29.             .ChartType = xlXYScatterLinesNoMarkers
  30.             '  .ChartType = xlLine
  31.             .AxisGroup = xlPrimary
  32.             .Border.ColorIndex = 7
  33.             .Name = "=繪圖資料!$G$1"
  34.         End With
  35.         
  36.         With Worksheets("繪圖資料")              '  設定主座標軸最大及最小值
  37.             myMax = Application.Max(.Range("C2:C" & CStr(nRow)))
  38.             myMin = Application.Min(.Range("D2:D" & CStr(nRow)))
  39.             myMin = myMin - (myMax - myMin)
  40.         End With
  41.         
  42.         With .Axes(xlValue)
  43.             .MaximumScale = Round(myMax, 2)
  44.             .MinimumScale = Round(myMin, 2)
  45.         End With
  46.         
  47.         .SeriesCollection.NewSeries              '  新增成交量數列
  48.         With .SeriesCollection(6)
  49.             .Values = Worksheets("繪圖資料").Range("F2:F" & CStr(nRow))
  50.             .ChartType = xlColumnClustered
  51.             .Name = "成交量"
  52.             .Interior.ColorIndex = 17
  53.             .AxisGroup = xlSecondary             '  設為副座標軸
  54.         End With
  55.         
  56.         With Worksheets("繪圖資料")              '  計算副座標軸最大及最小值
  57.             myMax = Application.Max(.Range("F2:F" & CStr(nRow)))
  58.             myMax = myMax * 2
  59.             myMin = 0.01
  60.         End With
  61.         
  62.         With .Axes(xlValue, xlSecondary)         '  設定副座標軸最大及最小值
  63.             .MaximumScale = Round(myMax, 0)
  64.             .MinimumScale = Round(myMin, 0)
  65.         End With
  66.         
  67.         With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  68.             .CategoryType = xlCategoryScale
  69.             .TickLabelSpacing = 4                            '  標示間距
  70.             .TickLabels.NumberFormatLocal = "yyyy/m/d"
  71.             .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  72.         End With
  73.         
  74.         With .Legend                                          '  刪除不必要的圖例
  75.             .LegendEntries(2).Delete                          '  開盤價
  76.             .LegendEntries(2).Delete                          '  最高價
  77.             .LegendEntries(2).Delete                          '  最低價
  78.             .LegendEntries(2).Delete                          '  收盤價
  79.             .Top = .Parent.ChartTitle.Top - 5
  80.         End With
  81.         
  82.         With .PlotArea                                        '  調整繪圖區域大小與位置
  83.             .Top = .Top - 10
  84.             .Height = .Height + 10
  85.             .Width = .Width + 95
  86.         End With
  87.         
  88.         .PlotArea.Select    '  將圖表的繪圖區格線灰黑顏色修改成淡青色、以及表格實線改以虛線表示
  89.         .Axes(xlValue).MajorGridlines.Select
  90.         With Selection.Format.Line
  91.             .Visible = msoTrue
  92.             .ForeColor.ObjectThemeColor = msoThemeColorAccent1
  93.             .ForeColor.TintAndShade = 0
  94.             .ForeColor.Brightness = 0.8000000119
  95.             .Transparency = 0
  96.             .Weight = 0.25
  97.             .DashStyle = msoLineSysDash
  98.         End With
  99.     End With
  100.     Worksheets("主畫面").[A1].Select
  101. End Sub
複製代碼

TOP

回復 21# lin_6219
  1. Sub Test()
  2.     Dim nRow As Integer, ChtObj As ChartObject
  3.     Dim i As Integer, j As Integer, chartname As String
  4.     Dim myMax, myMin, GapNr As Integer
  5.    
  6.     On Error Resume Next
  7.   
  8.     With Worksheets("主畫面")
  9.         .ChartObjects.Delete
  10.         .Select
  11.         nRow = Worksheets("繪圖資料").Range("A65536").End(xlUp).Row
  12.         Set ChtObj = Worksheets("主畫面").ChartObjects.Add(1, 1, 450, 250)
  13.         
  14.         With ChtObj.Chart
  15.             '  .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$20, 繪圖資料!$F$2:繪圖資料!$F$20")
  16.             .SetSourceData Source:=Range("繪圖資料!$A$2:繪圖資料!$A$" & CStr(nRow) & ", 繪圖資料!$F$2:繪圖資料!$F$" & CStr(nRow))
  17.             .ChartType = xlXYScatterLinesNoMarkers
  18.             ' .ChartType = xlLine
  19.             .HasTitle = True
  20.             .ChartTitle.Characters.Text = "K線與成交量圖"
  21.             
  22.             With .SeriesCollection(1)
  23.                 .Border.ColorIndex = 7
  24.                 .Name = "=繪圖資料!$F$1"
  25.             End With
  26.             
  27.             With .Axes(xlCategory)                               '  X座標軸 (時間軸)
  28.                 .CategoryType = xlCategoryScale
  29.                 .TickLabelSpacing = 4                            '  標示間距
  30.                 .TickLabels.NumberFormatLocal = "yyyy/m/d"
  31.                 .TickLabels.Font.ColorIndex = 5                  '  Blue Color
  32.                 ' .TickLabels.Orientation = xlTickLabelOrientationUpward
  33.             End With
  34.         End With
  35.     End With
  36. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2013-6-13 06:42 編輯

回復 28# lin_6219
基本上,圖表在運作時,它並不會理會是西元、或民國年,
只是在顯示時發生轉換上的問題。
原則上,如果我選用民國年作為檔案的日期欄,在此情況下
.TickLabels.NumberFormatLocal = "m/d" 應該會是我的選擇。
至於在 xlColumnClustered  下,我是沒試過點位的問題。

TOP

回復 28# lin_6219
經測試 xlColumnClustered、xlColumnStacked、xl3DColumnStacked、
xl3DColumnClustered 等,結果都是一般正常的點位。如圖:

這方面可能要直接請教 Microsoft 或自行上網搜尋相關資料了。

TOP

        靜思自在 : 發脾氣是短暫的發瘋。
返回列表 上一主題