Board logo

標題: 請各位大大幫忙修改建立崁入圖表錯誤語法 [打印本頁]

作者: lamihsuen    時間: 2012-7-15 21:12     標題: 請各位大大幫忙修改建立崁入圖表錯誤語法

請各位大大幫忙   我想在Worksheets(wr)工作表中繪製圖表(建立崁入圖表)請問正確語法為何

如果下列變數定義如下數值
WR=4
z_sr =120
lRow= 150
chart_sr     =156
chart_end=166
'設定要崁入圖表的位置
Dim GR As Range
   Set GR = Worksheets(wr).Range("A" & chart_sr & " :I" & chart_end)'
    With Worksheets(wr).ChartObjects.Add(GR.Left, GR.Top, GR.Width, GR.Height)
'設定工作表名稱+"值"為圖表名稱
               Worksheets(wr).ChartObjects.name= Worksheets(wr).name&"值"
' 設定資料範圍為儲存格   Worksheets(wr).   RANRE ("A" & z_sr & " :C" & xlRow)
         Worksheets(wr).ChartObjects.SetSourceData.RANRE ("A" & z_sr & " :C" & xlRow)
請問設定圖表名稱.和設定圖表的資料範圍正確的語法為何?
作者: c_c_lai    時間: 2012-7-16 10:02

回復 1# lamihsuen
貼上 GBKEE 指導前輩曾經給我的範例,堤供妳參考,希望對妳會有實質的幫助。
又、妳打錯字了 .RANRE -> .RANGE。 (算粗心吧!:o )
  1. Private Sub 製圖()
  2.     Dim xR As Range, Xi As Integer, i As Integer, 圖色()

  3.     圖色 = Array(4, 6, 8, 10)

  4.     ActiveSheet.ChartObjects.Delete     '刪除全部圖表

  5.     Set xR = Range("F1")    '利用xR的位置 設下圖表的位置
  6.     '加入新圖表  須指定 1右邊位置, 2高度位置, 3圖表的Width, 4圖表的Height

  7.     With ChartObjects.Add(xR.Left, xR.Top, xR.Resize(, 10).Width, xR.Resize(10).Height).Chart
  8.     .ChartType = 51  ' xlLineMarkers    '折線圖         '圖表 式樣
  9.         With ActiveSheet.Range("A2").CurrentRegion
  10.             Set xR = Union(.Columns(1), .Columns(3), .Columns(5))
  11.             '資料 範圍的 1,3,5 欄為圖表資料  :第1欄 為x軸的數值
  12.         End With
  13.         .SetSourceData Source:=xR, PlotBy:=xlColumns
  14.         '圖表資料來源 : xR  資料式樣: 欄
  15.                      
  16.         .HasTitle = True              '顯示 圖表標題
  17.         .ChartTitle.Characters.Text = ActiveSheet.Name    'HasTitle = False 會有錯誤
  18.         .HasAxis(xlCategory, xlPrimary) = False           '不顯示 X軸座標
  19.                
  20.         'HasLegend 圖例
  21.         .HasLegend = False             ' 取消 顯示 圖例
  22.         '  .Legend.Position = xlTop           '顯示 圖例位置
  23.         ' .Axes(xlCategory).TickLabels.NumberFormatLocal = "m/d;@"    ' Axes(xlCategory) X座標軸
  24.         ' ** 上二式 須  顯示圖例 ->  .HasLegend = True
  25.                
  26.         '.SeriesCollection(1).AxisGroup = 2           '新增 Y座標軸 副座標軸
  27.         '  .SeriesCollection(3)).Delete     '刪除第3數列資料
  28.         With .Axes(xlValue)      'y軸格線
  29.             .HasMajorGridlines = 0   '取消 主格線
  30.             .HasMinorGridlines = 0   '取消 副格線
  31.         End With
  32.         '以下一些程式碼 你可用錄製得知
  33.         With .ChartArea             '圖表的圖表區
  34.             .Border.Weight = 1
  35.             .Border.LineStyle = -1
  36.             .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=3, Degree:=0.231372549019608
  37.             .Fill.Visible = True
  38.             .Fill.ForeColor.SchemeColor = 圖色(0)
  39.         End With
  40.         With .PlotArea              '圖表的 繪圖區
  41.             .Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=1, _
  42.             Degree:=0.231372549019608
  43.             .Fill.Visible = True
  44.             .Fill.ForeColor.SchemeColor = 圖色(0)
  45.             With .Border
  46.             .ColorIndex = 16
  47.             .Weight = xlThin
  48.             .LineStyle = xlContinuous
  49.             End With
  50.         End With
  51.         For i = 1 To .SeriesCollection.Count
  52.             With .SeriesCollection(i)   '數列
  53.                 '  .XValues = ""       '<-為x軸的數值   可在此取消
  54.                 With .Border
  55.                 .ColorIndex = 圖色(i)
  56.                 .Weight = xlMedium
  57.                 .LineStyle = xlContinuous
  58.                 End With
  59.                 '以下屬性 只適合 折線圖
  60.                 ' .MarkerBackgroundColorIndex = xlAutomatic
  61.                 '.MarkerForegroundColorIndex = xlAutomatic
  62.                 '.MarkerStyle = xlNone
  63.                 '.Smooth = False
  64.                 '.MarkerSize = 7
  65.                 '.Shadow = False
  66.             End With
  67.         Next
  68.     End With
  69. End Sub
複製代碼

作者: lamihsuen    時間: 2012-7-16 18:30

c_c_lai   大大謝謝幫忙 這程式對我來說還太難了.我只想用直線圖,在每一工作表最後儲存格Worksheets(wr).Range("A" & chart_sr & " :I" & chart_end)的範圍加入圖表,資料來源為同表格的
Worksheets(wr).   RANRE ("A" & z_sr & " :C" & xlRow),因為有10個工作表都要加入且每一個工作表最後空儲存格不一定所以列數用變數方式,工作表Worksheets(wr).   wr也是變數.因為我想用迴圈方式讓所有工作表一次完成,
ps  RANRE -> .RANGE 感謝提醒,確實粗心了
作者: lamihsuen    時間: 2012-7-17 23:14

c_c_lai   大大回讀你的帖了看了GBKEE前輩的回覆其中下列的程式
03.    With ActiveSheet.ChartObjects(oShape.Name).Chart
改以用下列
With WORKSHEETS(WR).ChartObjects(1).Chart
就可以執行程式原來是物件的語法錯誤
08.    End With
感謝 兩位大哥的協助
作者: c_c_lai    時間: 2012-7-18 07:28

回復 4# lamihsuen
沒錯,妳也可以應用下列 Set Sh = Sheets(xlSh) 以及  With Sh.ChartObjects.Add 的方式來處理:
  1. Private Sub 製圖程序(xlSh As String)                                '  重繪
  2.     Dim Sh As Worksheet, xi As Integer
  3.    
  4.     Set Sh = Sheets(xlSh)
  5.     Sh.ChartObjects.Delete

  6.     陣列設定 ShName:=Sh.Name
  7.     For xi = 1 To IIf(Sh.Name = "Omega", 5, 6)
  8.         With Sh.ChartObjects.Add(Sh.Cells(xRow(xi), yCol(xi)).Left, Sh.Cells(xRow(xi), yCol(xi)).Top, cWidth(xi), cHeight(xi)).Chart
  9.             .ChartType = IIf(xi >= 5, xlLine, xlColumnStacked)      ' xlLine-> 折線圖        ' xlColumnStacke-> 堆疊直條圖
  10.             .SetSourceData Source:=Chart_Source(xi)
  11.             .HasLegend = 0                                          ' 圖表的圖例:  不可見
  12.             .SeriesCollection(1).AxisGroup = IIf(xi >= 5, 2, 1)
  13.             
  14.             If (xi = 5) Then
  15.                 .SeriesCollection(4).ChartType = xlColumnClustered  ' 堆疊直條圖
  16.             ElseIf (xi = 6) Then
  17.                 .SeriesCollection(2).ChartType = xlColumnClustered  ' 堆疊直條圖
  18.             End If

  19.             With .Axes(xlCategory)                                  ' X座標軸
  20.                 .CategoryType = xlCategoryScale
  21.                 .TickLabels.NumberFormatLocal = "hh:mm"
  22.                 .MajorTickMark = xlNone
  23.                 .Border.Weight = xlHairline
  24.                 .Border.LineStyle = xlNone
  25.                 .TickLabelPosition = xlLow
  26.                 .TickLabels.Font.Size = 10
  27.             End With

  28.             '*******************************************************************
  29.             '  .
  30.             '  .
  31.             '  .

  32.         End With
  33.     Next xi
  34. End Sub
複製代碼
我再附上我實務應用上的真實圖表提供妳參考。無論是何種表單圖形,其設計理念幾乎是雷同的。
[attach]11707[/attach]
[attach]11708[/attach]
作者: lamihsuen    時間: 2012-7-18 22:19

c_c_lai 大哥請問水平軸類別目前是在繪圖區內顯示我想跟你一樣顯示在繪圖區外下方如同你上方圖表的時間顯示一樣,因我的圖表資料數列有+值也有-值 因此我的目前是顯示在中間0的下方請問語法要如何表達.才能跟一樣顯示在繪圖區外下方謝謝指導
作者: c_c_lai    時間: 2012-7-19 07:16

回復 6# lamihsuen
請附上你實際的檔案,我來看看你是如何設定。
P.S.  妳沒按 "回復" 鈕回復,如果我沒有留意到的話,是不知道有回復件的。
作者: lamihsuen    時間: 2012-7-19 19:07

回復 7# c_c_lai
c-c-lai 大哥我上傳了檔案,但我不會把檔名貼到帖子內,不知你是否可從附件叫出,

[attach]11763[/attach]
作者: c_c_lai    時間: 2012-7-20 16:43

回復 8# lamihsuen
請將原本 Module3 內的程式碼全部更換成以下之程式碼
  1. ' *********************************************************************
  2. '  Module3   (請將原本 Module3 內的程式碼全部更換成以下之程式碼)
  3. ' *********************************************************************
  4. Option Explicit

  5. Dim sPos(1 To 4)
  6. Dim xText As String
  7. Dim Chart_Source As Variant
  8. Dim StartKBarRow, EndKBarRow As Long

  9.    
  10. Public Sub 再分析結果()
  11.     Dim wr As Integer, an As Integer ' 設定COPY工作表數目計數器
  12.     Dim xlRow As Long
  13.             
  14.     ' wr = 4  目前預設從 c 到 sn, 總共有 12 個工作表單
  15.     For wr = 4 To Worksheets.Count
  16.         '  下次起始 列 起點
  17.         Dim angin_sr As Integer
  18.         Dim sr As Integer ' 定義第一次起始列數
  19.         sr = 6
  20.         an = 1
  21.         ' 計算"NG"的家數
  22.         Dim NGVALUE As Integer
  23.         NGVALUE = 0
  24.         ' 工作表從4 迴圈開始執行再分析結果到工作表的最後
  25.         Do Until Worksheets(wr).Cells((sr - 3), 12).Value = 0
  26.             ' outline 分析次數+1.並顯示在標題列(B4)儲存格
  27.             an = an + 1
  28.                   
  29.             ' angin_sr=再次分析起始列為:第一次起始列數+第一次家數+6格空格
  30.             angin_sr = sr + (Worksheets(wr).Cells((sr - 3), 1).Value + 6)
  31.                
  32.             ' 判別 上次分析有"NG"的去除,"OK"的COPY到本次表格
  33.             Dim again_oi, again_oj   As Integer ' 上次表格列,行數計數器
  34.             Dim again_ai, again_aj   As Integer ' 本次表格列,行數計數器
  35.                      
  36.             again_oi = sr
  37.             again_ai = angin_sr
  38.             ' 迴圈判別"ok"與"ng"從前次起始位置開始(sr)至前次表格最後(sr+前次表格"a"3的值
  39.             For again_oi = again_oi To sr + Worksheets(wr).Cells((sr - 3), 1).Value
  40.                 ' 如果值為"ok"該列copy 到本次表格.如果值為"ng"則不處理
  41.                 If Worksheets(wr).Cells(again_oi, 5).Value = "OK" Then
  42.                     With Worksheets(wr)
  43.                         .Cells(again_ai, 1).Value = .Cells(again_oi, 1).Value
  44.                         .Cells(again_ai, 2).Value = .Cells(again_oi, 2).Value
  45.                     End With
  46.                     again_ai = again_ai + 1
  47.                 End If
  48.             Next again_oi
  49.                   
  50.             ' 將前次第三列標題列標題copy 至本次表格第三列標題列標題
  51.             again_aj = 1
  52.             For again_oj = 1 To 12
  53.                 Worksheets(wr).Cells(angin_sr - 4, again_aj).Value = Worksheets(wr).Cells(sr - 4, again_oj).Value
  54.                 again_aj = again_aj + 1
  55.             Next again_oj
  56.                        
  57.             ' 利用變數求出本次表格最後列數目的用於求出第三列公式的最後範圍
  58.             xlRow = Worksheets(wr).Range("B" & angin_sr).End(xlDown).Row
  59.             With Worksheets(wr)
  60.                 ' 計算本次"A3"儲存格 NO.OF.RESULT值(分析值家數)從本次起始列至(angin_sr)至本次最後列數的數量
  61.                 .Cells(angin_sr - 3, 1).Formula = "=COUNT(B" & angin_sr & ":B" & xlRow & ")"
  62.                 ' 本次"B3"儲存格分析值中間值(MEDIAN)
  63.                 .Cells(angin_sr - 3, 2).Formula = "=MEDIAN(B" & angin_sr & ":B" & xlRow & ")"
  64.                 ' 本次C3儲存格IRQ植
  65.                 .Cells(angin_sr - 3, 3).Formula = "=(QUARTILE(B" & angin_sr & ":B" & xlRow & ",3) -QUARTILE(B" & angin_sr & ":B" & xlRow & ",1))*0.7413"
  66.                         
  67.                 ' 本次"E3"儲存格ROBUS CV值
  68.                 .Cells(angin_sr - 3, 5).Formula = "=  C3 / B3 *100"
  69.                 ' 本次"F3"儲存格分析值中最少值
  70.                 .Cells(angin_sr - 3, 6).Formula = "=MIN(B" & angin_sr & ":B" & xlRow & ")"
  71.                 ' 本次"G3"儲存格分析值中最大值
  72.                 .Cells(angin_sr - 3, 7).Formula = "=MAX(B" & angin_sr & ":B" & xlRow & ")"
  73.                 ' 本次"H3"儲存格RANGE值
  74.                 .Cells(angin_sr - 3, 8).Formula = "=G3-F3"
  75.                 ' 本次定義"I3"儲存格為E178值
  76.                 .Cells(angin_sr - 3, 9).Value = E178(.Cells(angin_sr - 3, 1).Value)
  77.                 ' 本次定義"j3"儲存格為分析值平均值
  78.                 .Cells(angin_sr - 3, 10).Formula = "=AVERAGE(B" & angin_sr & ":B" & xlRow & ")"
  79.                 ' 本次定義"k3"儲存格為stdv
  80.                 .Cells(angin_sr - 3, 11).Formula = "=STDEV(B" & angin_sr & ":B" & xlRow & ")"
  81.                 ' 本次"NG"家數 值
  82.                 .Cells(angin_sr - 3, 12).Value = NGVALUE
  83.                 ' 本次標題列"執行第"字串直接從前次儲存格位置copy
  84.                 .Cells(angin_sr - 2, 1).Value = .Cells(sr - 2, 1).Value
  85.                 ' 本次標題列顯示第an次分析
  86.                 .Cells(angin_sr - 2, 2).Value = an
  87.                 ' 本次標題列"ouline"字串直接從前次儲存格位置copy
  88.                 .Cells(angin_sr - 2, 3).Value = .Cells(sr - 2, 3).Value
  89.                 ' 本次定義實驗室編號標題列直接從前次儲存格位置copy
  90.                 .Cells(angin_sr - 1, 1).Value = .Cells(sr - 1, 1).Value
  91.                 ' 本次定義實驗室分析值標題列直接從前次儲存格位置copy
  92.                 .Cells(angin_sr - 1, 2).Value = .Cells(sr - 1, 2).Value
  93.                 ' 本次定義z-score值標題列直接從前次儲存格位置copy
  94.                 .Cells(angin_sr - 1, 3).Value = .Cells(sr - 1, 3).Value
  95.                 ' 本次定義outline標題列直接從前次儲存格位置copy
  96.                 .Cells(angin_sr - 1, 4).Value = .Cells(sr - 1, 4).Value
  97.                 ' 定義判定結果值標題列直接從前次儲存格位置copy
  98.                 .Cells(angin_sr - 1, 5).Value = .Cells(sr - 1, 5).Value
  99.                 ' 本次"C"欄 Z-SCORE 值計算
  100.                 .Range("C" & angin_sr & " :C" & xlRow).Formula = "=(b" & angin_sr & "-$B$" & angin_sr - 3 & ") /$C$" & angin_sr - 3
  101.                 ' 本次 "D"欄OUTLINE值計算
  102.                 .Range("d" & angin_sr & " :d" & xlRow).Formula = "= (B" & angin_sr & " -$J$" & angin_sr - 3 & ")/$K$" & angin_sr - 3
  103.                                       
  104.             End With
  105.                        
  106.             ' 本次"E' 欄判別OUTLINE,  true="ok"  FALSE="NG"
  107.             ' "NG"家數起始值 ,目的"將有"ng"家數記錄在"L3"欄位用於是否繼續判別OUTLINE
  108.                        
  109.             Worksheets(wr).Range("L" & angin_sr - 3).Value = 0
  110.                        
  111.             ' 開始判別從本次起始列開始
  112.             again_ai = angin_sr
  113.                           
  114.             For again_ai = again_ai To ((angin_sr) + Worksheets(wr).Range("A" & angin_sr - 3).Value - 1)
  115.                 ' 比對D6是否<   E178值(I3)欄
  116.                 If Worksheets(wr).Range("D" & again_ai).Value < Worksheets(wr).Range("I" & angin_sr - 3).Value Then
  117.                     ' 值=TRUE時E欄記錄""OK"
  118.                     Worksheets(wr).Range("E" & again_ai).Value = "OK"
  119.                 Else
  120.                     ' 值= FLACE時E欄記錄"NG"
  121.                     Worksheets(wr).Range("E" & again_ai).Value = "NG"
  122.                     ' 設"NG"FONT.COLOR為紅色
  123.                     Worksheets(wr).Range("E" & again_ai).Font.Color = vbRed
  124.                     ' "NG"家數+1
  125.                     Worksheets(wr).Range("L" & angin_sr - 3).Value = Worksheets(wr).Range("L" & angin_sr - 3).Value + 1
  126.                 End If
  127.             Next again_ai
  128.                                  
  129.             ' 如果還有"NG"值繼續執行OUTLINE
  130.             ' 將本次表格列數值設定給上次表格列數目的將本次表格列數作為下次表格計算基礎
  131.             sr = angin_sr
  132.         Loop
  133.                
  134.         ' ********此處為Worksheets(wr).Cells((sr - 3), 12).Value =0."NG" 家數=0 全部""可執行Z-SCORE
  135.         ' 定義z_sr為z_score起始表格列
  136.         Dim z_sr As Integer
  137.         angin_sr = sr ' 將sr值回愎給angin_sr目的為把最後一次outline "sr=angin_sr"回愎回來
  138.         sr = 6 ' 將sr回愎到第一次表格起始位置
  139.               
  140.         ' z_sr=執行z-score起始列為:最後一次起始列數+最後分析家數+6格空格
  141.         z_sr = angin_sr + (Worksheets(wr).Cells((angin_sr - 3), 1).Value + 6)
  142.               
  143.         ' 設定元素z_score標題列標題(z_score的第三列)
  144.         Worksheets(wr).Cells((z_sr - 2), 1).Value = "執行"
  145.         Worksheets(wr).Cells((z_sr - 2), 2).Value = Worksheets(wr).Name
  146.         Worksheets(wr).Cells((z_sr - 2), 3).Value = "z_score"
  147.                   
  148.         ' 將第一次表格"實驗室編號"(第一行號)與"分析值"(第二行)copy至z_score表格因為要全部"實驗室編號"與"分析值"
  149.                     
  150.         Dim z_oi, z_oj   As Integer    ' 第一次表格列,行數計數器
  151.         Dim z_ai, z_aj   As Integer    ' z-score表格列,行數計數器
  152.         z_oi = sr                      ' z_oi定義為第一次起始格表格開始計數
  153.         z_ai = z_sr                    ' z_ai定義為z_score起始表格開始計數
  154.                  
  155.         For z_oi = z_oi To sr + Worksheets(wr).Cells((sr - 3), 1).Value
  156.             With Worksheets(wr)
  157.                 .Cells(z_ai, 1).Value = .Cells(z_oi, 1).Value
  158.                 .Cells(z_ai, 2).Value = .Cells(z_oi, 2).Value
  159.             End With
  160.             z_ai = z_ai + 1
  161.         Next z_oi      
複製代碼
[attach]11772[/attach]
作者: c_c_lai    時間: 2012-7-20 16:44

本帖最後由 c_c_lai 於 2012-7-20 16:46 編輯

回復 8# lamihsuen
因程式碼大於規定大小,故將下半段再次貼上。
  1.         ' 將最後一次第一列(公式)標題列標題與第二列公式值copy 至ZSCORE表格第一列與第二列
  2.         z_oi = angin_sr
  3.         z_ai = z_sr
  4.         z_aj = 1
  5.         For z_oj = 1 To 12
  6.             Worksheets(wr).Cells(z_ai - 4, z_aj).Value = Worksheets(wr).Cells(z_oi - 4, z_oj).Value
  7.             Worksheets(wr).Cells(z_ai - 3, z_aj).Value = Worksheets(wr).Cells(z_oi - 3, z_oj).Value
  8.             z_aj = z_aj + 1
  9.         Next z_oj
  10.         ' 定義第四列表格標題列
  11.         xlRow = Worksheets(wr).Range("B" & z_sr).End(xlDown).Row
  12.         With Worksheets(wr)
  13.             .Cells((z_sr - 1), 1).Value = .Cells((sr - 1), 1).Value
  14.             .Cells((z_sr - 1), 2).Value = .Cells((sr - 1), 2).Value
  15.             .Cells((z_sr - 1), 3).Value = .Cells((sr - 1), 3).Value
  16.             .Cells((z_sr - 1), 4).Value = "判別結果"
  17.             .Cells((z_sr - 1), 5).Value = "分析方法"
  18.             .Cells((z_sr - 1), 6).Value = "使用儀器"
  19.                                                          
  20.             ' 本次"C"欄 Z-SCORE 值計算
  21.             .Range("C" & z_sr & " :C" & xlRow).Formula = "=(b" & z_sr & "-$B$" & z_sr - 3 & ") /$C$" & z_sr - 3
  22.             .Range("D" & z_sr & " :D" & xlRow).Formula = "=IF(C" & z_sr & ">=3,""異常"",IF( C" & z_sr & "<=2,""ok"",""有質疑""))"
  23.         End With
  24.         '  定義z值判別結果並顯示(D)欄,"(Z)值<=2為"OK"顯示綠色","2<(Z)值<3為"有質疑"顯示黃色,(Z)值>3為"異常"顯示紅色
  25.                                        
  26.         '  繪製統計分析圖表
  27.         Call DrawStatistics(wr)
  28.     Next wr
  29. End Sub

  30. Sub DrawStatistics(ct As Integer)
  31.     Dim tbl As String

  32.     StartKBarRow = 6
  33.     With Worksheets(ct)
  34.         tbl = .Name
  35.         EndKBarRow = .Range("A1").CurrentRegion.Rows.Count
  36.         Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
  37.         sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3))
  38.         sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))
  39.         sPos(3) = CInt(Mid("720*720*720*720*720*720*720*720*720*720*720*720", (ct - 4) * 4 + 1, 3))
  40.         sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))
  41.         xText = UCase(tbl) & " : Z - Score"
  42.         製圖程序 xlSh:=tbl
  43.     End With
  44. End Sub

  45. Private Sub 製圖程序(xlSh As String)                                ' 全部重繪
  46.     Dim Sh As Worksheet, xi As Integer
  47.    
  48.     Set Sh = Sheets(xlSh)
  49.     Sh.ChartObjects.Delete

  50.     With Sh.ChartObjects.Add(Sh.Cells(sPos(1), sPos(2)).Left, Sh.Cells(sPos(1), sPos(2)).Top, sPos(3), sPos(4)).Chart
  51.         .ChartType = xlColumnClustered    ' xlColumnStacked                            ' xlColumnStacke-> 堆疊直條圖
  52.         .SetSourceData Source:=Chart_Source
  53.         .HasLegend = 0                                          ' 圖表的圖例:  不可見
  54.         .SeriesCollection(1).AxisGroup = 1
  55.             
  56.         With .Axes(xlCategory)                                  ' X座標軸
  57.             .CategoryType = xlCategoryScale
  58.             ' .TickLabels.NumberFormatLocal = "hh:mm"
  59.             .MajorTickMark = xlNone
  60.             .Border.Weight = xlHairline
  61.             .Border.LineStyle = xlNone
  62.             .TickLabelPosition = xlLow
  63.             .TickLabels.Font.Size = 10
  64.         End With
  65.                   
  66.             '*******************************************************************
  67.                   
  68.         With .SeriesCollection(1)
  69.             .Shadow = False                                ' 圖表中的數列(1)
  70.             .InvertIfNegative = True
  71.             ' .InvertColor = RGB(255, 124, 128)                      ' 當表列數值為負值時,將其顯示之顏色更變成淺天藍色
  72.             .InvertColor = RGB(32, 178, 208)                         ' 當表列數值為負值時,將其顯示之顏色更變成青藍色
  73.         
  74.             With .Format.Fill
  75.                 .Visible = msoTrue
  76.                 ' .ForeColor.RGB = RGB(149, 179, 215)                ' 當表列數值為正值時,顯示之顏色為橘紅色
  77.                 .ForeColor.RGB = RGB(255, 69, 0)                     ' 當表列數值為正值時,顯示之顏色為粉紅色
  78.                 .Transparency = 0
  79.                 .Solid
  80.             End With
  81.         
  82.             With .Border
  83.                 .Weight = xlHairline
  84.                 .LineStyle = xlNone
  85.             End With
  86.         
  87.             ' With .Interior
  88.             '     .ColorIndex = 5
  89.             '     .PatternColorIndex = 42
  90.             '     .Pattern = xlSolid
  91.             ' End With
  92.         End With
  93.                   
  94.         ' *******************************************************************
  95.                      
  96.         With .Axes(xlValue).TickLabels.Font                    ' Y座標軸上刻度的刻度標籤的字體
  97.             .FontStyle = "標準"
  98.             .Size = 10
  99.         End With
  100.                      
  101.         With .Axes(xlValue)
  102.             .MajorUnit = 2                                     ' 圖表左側數列之間距值設定
  103.             ' .MaximumScale = 30
  104.             ' .MinimumScale = -40
  105.         End With
  106.         
  107.         .HasTitle = True                                       ' 圖表的標題   可見
  108.               
  109.         With .ChartTitle                                       ' 圖表的標題
  110.             .Top = 1
  111.             .Text = xText
  112.             .Font.Size = 16
  113.         End With

  114.         With .PlotArea                                         ' 圖表的繪圖區
  115.             .Top = 16
  116.             .Left = 1
  117.             .Width = sPos(3)
  118.             .Height = sPos(4)
  119.             .Interior.ColorIndex = xlNone
  120.         End With
  121.     End With
  122. End Sub
複製代碼
應該滿足妳的要求了吧!
作者: lamihsuen    時間: 2012-7-20 20:21

回復 10# c_c_lai

c_c_lai大哥:你太強了謝謝你,這兩天一定要好好研究你的程式,如有不懂的地方還請大哥多多指導,首先. 要請教大哥如何設定程式前面序號
作者: c_c_lai    時間: 2012-7-20 20:36

回復 11# lamihsuen
妳指的"如何設定程式前面序號"我還不甚瞭解何意,舉個例子?
事後,我又加了 DataLabels 進去,內容如下:
  1. (1)
  2. Sub DrawStatistics(ct As Integer)
  3.     Dim tbl As String

  4.     StartKBarRow = 6
  5.     With Worksheets(ct)
  6.         tbl = .Name
  7.         EndKBarRow = .Range("A1").CurrentRegion.Rows.Count
  8.         Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
  9.         sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3))    ' 圖標座標(列)
  10.         sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))    ' 圖標座標(欄)
  11.         ' sPos(3) = CInt(Mid("720*720*720*720*720*720*720*720*720*720*720*720", (ct - 4) * 4 + 1, 3))  ' 圖表寬度
  12.         ' 將 12 個統計圖表寬度 720 均改成 900,如此,於加上 DataLabels 後彼此間的距離會變為寬鬆,字距比較不會重疊再一起。
  13.         sPos(3) = CInt(Mid("900*900*900*900*900*900*900*900*900*900*900*900", (ct - 4) * 4 + 1, 3))   
  14.         sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))    ' 圖表高度
  15.         xText = UCase(tbl) & " : Z - Score"
  16.         製圖程序 xlSh:=tbl
  17.     End With
  18. End Sub

  19. (2)
  20.         With .SeriesCollection(1)
  21.             ' .
  22.             ' .
  23.             ' .
  24.             With .Border
  25.                 .Weight = xlHairline
  26.                 .LineStyle = xlNone
  27.             End With
  28.         
  29.             ' 加上 DataLabels 比較有看頭 (以下三行),數據表達也較親和性。
  30.             .HasDataLabels = True
  31.             .DataLabels.NumberFormat = "##.####"    ' 取小數四位
  32.             .DataLabels.Position = xlLabelPositionOutsideEnd
複製代碼
[attach]11784[/attach]
作者: c_c_lai    時間: 2012-7-20 21:13

回復 11# lamihsuen
妳是指
Dim sPos(1 To 4)      
'  宣告一個公用一維陣列整數值變數,它在DrawStatistics()以及 製圖程序() 都會使用到。
Dim xText As String
'  宣告一個公用字串變數,它在DrawStatistics()以及 製圖程序() 都會使用到。
Dim Chart_Source As Variant
' 宣告一個公用 Variant 資料型態變數,用於紀錄圖表選取資料,它在DrawStatistics()以及 製圖程序() 都會使用到。
Dim StartKBarRow, EndKBarRow As Long   
' 用於紀錄選取資料的起始、截止列數 (動態紀錄資料錄之用)。它只有在DrawStatistics()內部使用,是應該放置於
' DrawStatistics() 內宣告的。當初開始撰寫時,原本考慮會跨涵式而將它置放於外部,程式改了改卻忘掉了。
嗎?
作者: c_c_lai    時間: 2012-7-21 06:29

本帖最後由 c_c_lai 於 2012-7-21 06:42 編輯

回復 11# lamihsuen
圖標座標(列)改以動態處理
  1. Sub DrawStatistics(ct As Integer)
  2.     Dim tbl As String
  3.     Dim totalRow As Long

  4.     StartKBarRow = 6
  5.     With Worksheets(ct)
  6.         tbl = .Name
  7.         EndKBarRow = .Range("A1").CurrentRegion.Rows.Count
  8.         Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
  9.         
  10.         ' sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3)) ' 圖標座標(列)
  11.         ' 為考量在實務運用上,每張表單內含資料內容之多寡不一,可能實際使用列數時有增減,故改以動態處理。
  12.         sPos(1) = .UsedRange.Rows.Count
  13.         While IsEmpty(.Cells(sPos(1), 3).Value) And sPos(1) > 6       ' 尚須再次過濾部分空白與非真實匯入資料的問題列
  14.             sPos(1) = sPos(1) - 1
  15.         Wend
  16.         sPos(1) = sPos(1) + 5
  17.         
  18.         sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))   ' 圖標座標(欄)
  19.         sPos(3) = CInt(Mid("900*900*900*900*900*900*900*900*900*900*900*900", (ct - 4) * 4 + 1, 3))   ' 圖表寬度
  20.         sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))   ' 圖表高度
  21.         xText = UCase(tbl) & " : Z - Score"
  22.         製圖程序 xlSh:=tbl
  23.     End With
  24. End Sub
複製代碼
祝周末愉快!
作者: c_c_lai    時間: 2012-7-21 06:51

本帖最後由 c_c_lai 於 2012-7-21 07:31 編輯

回復 11# lamihsuen
貼不上圖,我就用寫的:
請注意以下兩個不同語法之使用,其結果值(以 c 工作表單為例 ) 一個是 50,另一個是 200 (再加上5)。
(1)
        EndKBarRow = .Range("A1").CurrentRegion.Rows.Count
(2)
        ' sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3)) ' 圖標座標(列)
        ' 為考量在實務運用上,每張表單內含資料內容之多寡不一,可能實際使用列數時有增減,故改以動態處理。
        sPos(1) = .UsedRange.Rows.Count
        While IsEmpty(.Cells(sPos(1), 3).Value) And sPos(1) > 6       ' 尚須再次過濾部分空白與非真實匯入資料的問題列
            sPos(1) = sPos(1) - 1
        Wend
        sPos(1) = sPos(1) + 5                                                                    ' 圖標座標(列)
CurrentRegion 與 UsedRange 的運用差異性。
作者: lamihsuen    時間: 2012-7-21 09:42

回復 10# c_c_lai
c_c_lai大哥你實在太強了我發了好長的時間都劃不好,你竟然一下子能把它劃出來,這兩天不要出去瘋子一定要好好留在家,研究你的程式,因為有好多都看不懂,到時還請你多多指導
另外要請問你序列號留在程式中就不能執行,必須一行一行刪除才能執行,你的是不是也一樣,如果是這樣就不要序列號是不是比較好?
作者: lamihsuen    時間: 2012-7-21 12:26

本帖最後由 lamihsuen 於 2012-7-21 12:28 編輯

[attach]11799[/attach]回復 18# c_c_lai

c_c_lai大哥   我已經了解你的意思了.圖表區範圍會隨資料數列數而改變大小,我把程式作了一些改變再請大哥幫我看看,以下的問題
1,請大哥幫我注意水平軸類別是以"a"欄列數的值為依據,但現在是以數字為排列,例如"c"工作表的"a"欄列數的值(實驗室編號)是没有 3  的但圖表水平軸資料是有3
2 如果圖表的資料來源要改為執行最後一次outline的表格範圍時,以"c"工作表為例是"a"108到"a"152 跟"c"108 到"c"152 程式要如何改變,執行最後一次outline的表格列數我是以angin_sr作為起始值變數
    以"c"工作表為例angin_sr=109
   感謝大哥詳細解釋讓我受益良多,有你我不用怕會有白頭髮了
[attach]11799[/attach]
作者: c_c_lai    時間: 2012-7-21 16:11

本帖最後由 c_c_lai 於 2012-7-21 17:50 編輯

回復 20# lamihsuen
以 "c" 工作表為例,共有四個區間,6-51,58-102,109-152,159-204,或
以 "ni" 工作表為例,共有三個區間,6-42,49-84,91-127,或
以 "mo" 工作表為例,共有四個區間,6-42,49-84,91-125,132-168。
在實務上妳是如何判定哪個工作表單之區間是屬哪一個區間?
(也就是12 個各自工作表單究竟應選擇哪一個區間作為圖表的 "選取資料"?)

我把妳的 Module3 稍稍整理了一下,請留意是那些變化了?
  1. Option Explicit

  2. Dim sPos(1 To 4)
  3. Dim xText As String
  4. Dim Chart_Source As Variant
  5.    
  6. Public Sub 再分析結果()
  7.     Dim wr As Integer, an As Integer     ' 設定COPY工作表數目計數器
  8.     Dim xlRow As Long
  9.     Dim angin_sr As Integer              ' 下次起始 列 起點
  10.     Dim sr As Integer                    ' 定義第一次起始列數
  11.     Dim NGValue As Integer               ' 計算 "NG" 的家數
  12.     Dim again_oi, again_oj As Integer    ' 上次表格列,行數計數器
  13.     Dim again_ai, again_aj As Integer    ' 本次表格列,行數計數器
  14.     Dim chart_end As Integer
  15.     Dim z_sr As Integer
  16.     Dim z_oi, z_oj As Integer            ' 第一次表格列,行數計數器
  17.     Dim z_ai, z_aj As Integer            ' z-score表格列,行數計數器
  18.     Dim mue_sr, mue_oi As Integer
  19.             
  20.     ' wr = 4  目前預設從 c 到 sn, 總共有 12 個工作表單
  21.     For wr = 4 To Worksheets.Count
  22.         sr = 6
  23.         an = 1
  24.         
  25.         NGValue = 0
  26.         
  27.         With Worksheets(wr)
  28.             ' 工作表從 4 迴圈開始執行再分析結果到工作表的最後
  29.             Do Until .Cells((sr - 3), 12).Value = 0
  30.                 ' outline 分析次數 + 1.並顯示在標題列 (B4) 儲存格
  31.                 an = an + 1
  32.                        
  33.                 ' angin_sr=再次分析起始列為:第一次起始列數+第一次家數+6格空格
  34.                 angin_sr = sr + (.Cells((sr - 3), 1).Value + 6)
  35.                
  36.                 ' 判別 上次分析有"NG"的去除,"OK"的COPY到本次表格
  37.                 again_oi = sr
  38.                 again_ai = angin_sr
  39.                 ' 迴圈判別 "ok" 與 "ng" 從前次起始位置開始(sr)至前次表格最後(sr+前次表格"a"3)的值
  40.                 For again_oi = again_oi To (sr + .Cells((sr - 3), 1).Value - 1)
  41.                     ' 如果值為"ok"該列copy 到本次表格.如果值為"ng"則不處理
  42.                     If .Cells(again_oi, 5).Value = "OK" Then
  43.                         .Cells(again_ai, 1).Value = .Cells(again_oi, 1).Value
  44.                         .Cells(again_ai, 2).Value = .Cells(again_oi, 2).Value
  45.                         again_ai = again_ai + 1
  46.                     End If
  47.                 Next again_oi
  48.                      
  49.                 ' 將前次第三列標題列標題 copy 至本次表格第三列標題列標題
  50.                 again_aj = 1
  51.                 For again_oj = 1 To 12
  52.                     .Cells(angin_sr - 4, again_aj).Value = .Cells(sr - 4, again_oj).Value
  53.                     again_aj = again_aj + 1
  54.                 Next again_oj
  55.                           
  56.                 ' 利用變數求出本次表格最後列數目的用於求出第三列公式的最後範圍
  57.                 xlRow = .Range("B" & angin_sr).End(xlDown).Row
  58.                     
  59.                 chart_end = xlRow
  60.                 ' 計算本次 "A3" 儲存格 NO.OF.RESULT值(分析值家數)從本次起始列至(angin_sr)至本次最後列數的數量
  61.                 .Cells(angin_sr - 3, 1).Formula = "=COUNT(B" & angin_sr & ":B" & xlRow & ")"
  62.                 ' 本次 "B3" 儲存格分析值中間值 (MEDIAN)
  63.                 .Cells(angin_sr - 3, 2).Formula = "=MEDIAN(B" & angin_sr & ":B" & xlRow & ")"
  64.                 ' 本次 C3 儲存格 IRQ 植
  65.                 .Cells(angin_sr - 3, 3).Formula = "=(QUARTILE(B" & angin_sr & ":B" & xlRow & ",3) -QUARTILE(B" & angin_sr & ":B" & xlRow & ",1))*0.7413"
  66.                         
  67.                 ' 本次 "E3" 儲存格ROBUS CV值
  68.                 .Cells(angin_sr - 3, 5).Formula = "=  C3 / B3 *100"
  69.                 ' 本次 "F3" 儲存格分析值中最少值
  70.                 .Cells(angin_sr - 3, 6).Formula = "=MIN(B" & angin_sr & ":B" & xlRow & ")"
  71.                 ' 本次 "G3" 儲存格分析值中最大值
  72.                 .Cells(angin_sr - 3, 7).Formula = "=MAX(B" & angin_sr & ":B" & xlRow & ")"
  73.                 ' 本次 "H3" 儲存格RANGE值
  74.                 .Cells(angin_sr - 3, 8).Formula = "=G3-F3"
  75.                 ' 本次定義 "I3" 儲存格為 E178 值
  76.                 .Cells(angin_sr - 3, 9).Value = E178(.Cells(angin_sr - 3, 1).Value)
  77.                 ' 本次定義 "j3" 儲存格為分析值平均值
  78.                 .Cells(angin_sr - 3, 10).Formula = "=AVERAGE(B" & angin_sr & ":B" & xlRow & ")"
  79.                 ' 本次定義 "k3" 儲存格為stdv
  80.                 .Cells(angin_sr - 3, 11).Formula = "=STDEV(B" & angin_sr & ":B" & xlRow & ")"
  81.                 ' 本次 "NG" 家數 值
  82.                 .Cells(angin_sr - 3, 12).Value = NGValue
  83.                 ' 本次標題列 "執行第" 字串直接從前次儲存格位置 copy
  84.                 .Cells(angin_sr - 2, 1).Value = .Cells(sr - 2, 1).Value
  85.                 ' 本次標題列顯示第 an 次分析
  86.                 .Cells(angin_sr - 2, 2).Value = an
  87.                 ' 本次標題列 "ouline" 字串直接從前次儲存格位置 copy
  88.                 .Cells(angin_sr - 2, 3).Value = .Cells(sr - 2, 3).Value
  89.                 ' 本次定義實驗室編號標題列直接從前次儲存格位置 copy
  90.                 .Cells(angin_sr - 1, 1).Value = .Cells(sr - 1, 1).Value
  91.                 ' 本次定義實驗室分析值標題列直接從前次儲存格位置 copy
  92.                 .Cells(angin_sr - 1, 2).Value = .Cells(sr - 1, 2).Value
  93.                 ' 本次定義z-score值標題列直接從前次儲存格位置 copy
  94.                 .Cells(angin_sr - 1, 3).Value = .Cells(sr - 1, 3).Value
  95.                 ' 本次定義outline標題列直接從前次儲存格位置 copy
  96.                 .Cells(angin_sr - 1, 4).Value = .Cells(sr - 1, 4).Value
  97.                 ' 定義判定結果值標題列直接從前次儲存格位置 copy
  98.                 .Cells(angin_sr - 1, 5).Value = .Cells(sr - 1, 5).Value
  99.                 ' 本次 "C" 欄 Z-SCORE 值計算
  100.                 .Range("C" & angin_sr & " :C" & xlRow).Formula = "=(b" & angin_sr & "-$B$" & angin_sr - 3 & ") /$C$" & angin_sr - 3
  101.                 ' 本次 "D" 欄 OUTLINE 值計算
  102.                 .Range("d" & angin_sr & " :d" & xlRow).Formula = "= (B" & angin_sr & " -$J$" & angin_sr - 3 & ")/$K$" & angin_sr - 3
  103.                        
  104.                 ' 本次 "E' 欄判別 OUTLINE,  true="ok"  FALSE="NG"
  105.                 ' "NG"家數起始值 ,目的"將有"ng"家數記錄在"L3"欄位用於是否繼續判別 OUTLINE
  106.                        
  107.                 .Range("L" & angin_sr - 3).Value = 0
  108.                           
  109.                 ' 開始判別從本次起始列開始
  110.                 ' again_ai = angin_sr
  111.                              
  112.                 ' For again_ai = again_ai To ((angin_sr) + .Range("A" & angin_sr - 3).Value - 1)
  113.                 For again_ai = angin_sr To ((angin_sr) + .Range("A" & angin_sr - 3).Value - 1)
  114.                     ' 比對 D6 是否 < E178 值 (I3) 欄
  115.                     If .Range("D" & again_ai).Value < .Range("I" & angin_sr - 3).Value Then
  116.                         ' 值 = TRUE 時 E 欄記錄 "OK"
  117.                         .Range("E" & again_ai).Value = "OK"
  118.                     Else
  119.                         ' 值 = FLACE時E欄記錄 "NG"
  120.                         .Range("E" & again_ai).Value = "NG"
  121.                         ' 設 "NG" FONT.COLOR 為紅色
  122.                         .Range("E" & again_ai).Font.Color = vbRed
  123.                         ' "NG" 家數 + 1
  124.                         .Range("L" & angin_sr - 3).Value = .Range("L" & angin_sr - 3).Value + 1
  125.                     End If
  126.                 Next again_ai
  127.                                  
  128.                 ' 如果還有 "NG" 值繼續執行 OUTLINE
  129.                 ' 將本次表格列數值設定給上次表格列數目的將本次表格列數作為下次表格計算基礎
  130.                 sr = angin_sr
  131.             Loop
  132.                
  133.             ' ********此處為.Cells((sr - 3), 12).Value =0."NG" 家數=0 全部""可執 行Z-SCORE
  134.             ' 定義z_sr為z_score起始表格列
  135.             angin_sr = sr ' 將 sr 值回愎給 angin_sr 目的為把最後一次 outline "sr=angin_sr" 回愎回來
  136.             sr = 6        ' 將sr回愎到第一次表格起始位置
  137.                   
  138.             ' z_sr = 執行 z-score 起始列為: 最後一次起始列數 + 最後分析家數 + 6 格空格
  139.             z_sr = angin_sr + (.Cells((angin_sr - 3), 1).Value + 6)
  140.                   
  141.             ' 設定元素 z_score 標題列標題 (z_score 的第三列)
  142.             .Cells((z_sr - 2), 1).Value = "執行"
  143.             .Cells((z_sr - 2), 2).Value = .Name
  144.             .Cells((z_sr - 2), 3).Value = "z_score"
  145.                   
  146.             ' 將第一次表格 "實驗室編號" (第一行號)與 "分析值" (第二行) copy 至 z_score 表格因為要全部 "實驗室編號" 與 "分析值"
  147.                        
  148.             z_oi = sr                      ' z_oi 定義為 第一次 起始格表格開始計數
  149.             z_ai = z_sr                    ' z_ai 定義為 z_score 起始表格開始計數
  150.                  
  151.             For z_oi = z_oi To sr + .Cells((sr - 3), 1).Value
  152.                 .Cells(z_ai, 1).Value = .Cells(z_oi, 1).Value
  153.                 .Cells(z_ai, 2).Value = .Cells(z_oi, 2).Value
  154.                 z_ai = z_ai + 1
  155.             Next z_oi
複製代碼

作者: c_c_lai    時間: 2012-7-21 17:51

回復 17# lamihsuen
  1.             ' 將最後一次第一列(公式)標題列標題與第二列公式值 copy 至 ZSCORE 表格第一列與第二列
  2.             z_oi = angin_sr
  3.             z_ai = z_sr
  4.             z_aj = 1
  5.             For z_oj = 1 To 12
  6.                 .Cells(z_ai - 4, z_aj).Value = .Cells(z_oi - 4, z_oj).Value
  7.                 .Cells(z_ai - 3, z_aj).Value = .Cells(z_oi - 3, z_oj).Value
  8.                 z_aj = z_aj + 1
  9.             Next z_oj
  10.             ' 定義第四列表格標題列
  11.             xlRow = .Range("B" & z_sr).End(xlDown).Row
  12.             .Cells((z_sr - 1), 1).Value = .Cells((sr - 1), 1).Value
  13.             .Cells((z_sr - 1), 2).Value = .Cells((sr - 1), 2).Value
  14.             .Cells((z_sr - 1), 3).Value = .Cells((sr - 1), 3).Value
  15.             .Cells((z_sr - 1), 4).Value = "判別結果"
  16.             .Cells((z_sr - 1), 5).Value = "分析方法"
  17.             .Cells((z_sr - 1), 6).Value = "使用儀器"
  18.                                                          
  19.             ' 本次 "C" 欄 Z-SCORE 值計算
  20.             ' .Range("C" & z_sr & " :C" & xlRow).Formula = "=(b" & z_sr & "-$B$" & z_sr - 3 & ") /$C$" & z_sr - 3
  21.             ' .Range("D" & z_sr & " :D" & xlRow).Formula = "=IF(C" & z_sr & ">=3,""異常"",IF( C" & z_sr & "<=2,""ok"",""有質疑""))"
  22.          
  23.             ' 2012/7/20 新增列
  24.             ' 判別本次 "C" 欄 Z-SCORE 值如果是 outline 則 z 值顯示 "*"
  25.             ' 設定 mue_sr, mue_oi 為 z 值欄位計數器
  26.             mue_sr = z_sr
  27.             mue_oi = angin_sr
  28.             For mue_sr = mue_sr To xlRow
  29.                 If .Cells(mue_sr, 1) = .Cells(mue_oi, 1) Then
  30.                     .Cells(mue_sr, 3).Formula = "=(b" & mue_sr & "-$B$" & z_sr - 3 & ") /$C$" & z_sr - 3
  31.                     If .Cells(mue_sr, 3).Value > 3 Or .Cells(mue_sr, 3).Value <= -3 Then
  32.                         .Cells(mue_sr, 3).Font.Color = RGB(255, 0, 255)
  33.                     End If
  34.                     mue_oi = mue_oi + 1
  35.                 Else
  36.                     .Cells(mue_sr, 3).Value = "*"
  37.                     .Cells(mue_sr, 3).Interior.Color = RGB(255, 0, 0)
  38.                     .Cells(mue_sr, 3).HorizontalAlignment = xlHAlignCenter
  39.                 End If
  40.             Next mue_sr
  41.             '  定義 z 值判別結果並顯示 (D) 欄,"(Z) 值 <= 2 為 "OK" 顯示綠色","2<(Z) 值 <3 為 "有質疑" 顯示黃色,(Z)值 >3 為 "異常" 顯示紅色
  42.         End With
  43.             
  44.         '  繪製統計分析圖表
  45.         Call DrawStatistics(wr)
  46.     Next wr
  47. End Sub

  48. Sub DrawStatistics(ct As Integer)
  49.     Dim tbl As String
  50.     Dim totalRow As Long
  51.     Dim StartKBarRow, EndKBarRow As Long

  52.     StartKBarRow = 6
  53.     With Worksheets(ct)
  54.         tbl = .Name
  55.         EndKBarRow = .Range("A1").CurrentRegion.Rows.Count
  56.         Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
  57.         
  58.         ' sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3)) ' 圖標座標(列)
  59.         ' 為考量在實務運用上,每張表單內含資料內容之多寡不一,可能實際使用列數時有增減,故改以動態處理。
  60.         sPos(1) = .UsedRange.Rows.Count
  61.         While IsEmpty(.Cells(sPos(1), 3).Value) And sPos(1) > 6       ' 尚須再次過濾部分空白與非真實匯入資料的問題列
  62.             sPos(1) = sPos(1) - 1
  63.         Wend
  64.         sPos(1) = sPos(1) + 5
  65.         
  66.         sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))   ' 圖標座標(欄)
  67.         sPos(3) = CInt(Mid("900*900*900*900*900*900*900*900*900*900*900*900", (ct - 4) * 4 + 1, 3))   ' 圖表寬度
  68.         sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))   ' 圖表高度
  69.         xText = UCase(tbl) & " : Z - Score"
  70.         製圖程序 xlSh:=tbl
  71.     End With
  72. End Sub

  73. Private Sub 製圖程序(xlSh As String)                                ' 全部重繪
  74.     Dim Sh As Worksheet, xi As Integer
  75.    
  76.     Set Sh = Sheets(xlSh)
  77.     Sh.ChartObjects.Delete

  78.     With Sh.ChartObjects.Add(Sh.Cells(sPos(1), sPos(2)).Left, Sh.Cells(sPos(1), sPos(2)).Top, sPos(3), sPos(4)).Chart
  79.         .ChartType = xlColumnClustered                          ' xlColumnStacked -> 堆疊直條圖
  80.         .SetSourceData Source:=Chart_Source
  81.         .HasLegend = 0                                          ' 圖表的圖例:  不可見
  82.         .SeriesCollection(1).AxisGroup = 1
  83.             
  84.         With .Axes(xlCategory)                                  ' X座標軸
  85.             .CategoryType = xlCategoryScale
  86.             ' .TickLabels.NumberFormatLocal = "hh:mm"
  87.             .MajorTickMark = xlNone
  88.             .Border.Weight = xlHairline
  89.             .Border.LineStyle = xlNone
  90.             .TickLabelPosition = xlLow
  91.             .TickLabels.Font.Size = 10
  92.         End With
  93.                   
  94.             '*******************************************************************
  95.                   
  96.         With .SeriesCollection(1)
  97.             .Shadow = False                                ' 圖表中的數列(1)
  98.             .InvertIfNegative = True
  99.             ' .InvertColor = RGB(255, 124, 128)                      ' 當表列數值為負值時,將其顯示之顏色更變成淺天藍色
  100.             .InvertColor = RGB(32, 178, 208)                         ' 當表列數值為負值時,將其顯示之顏色更變成青藍色
  101.         
  102.             With .Format.Fill
  103.                 .Visible = msoTrue
  104.                 ' .ForeColor.RGB = RGB(149, 179, 215)                ' 當表列數值為正值時,顯示之顏色為橘紅色
  105.                 .ForeColor.RGB = RGB(255, 69, 0)                     ' 當表列數值為正值時,顯示之顏色為粉紅色
  106.                 .Transparency = 0
  107.                 .Solid
  108.             End With
  109.         
  110.             With .Border
  111.                 .Weight = xlHairline
  112.                 .LineStyle = xlNone
  113.             End With
  114.         
  115.             .HasDataLabels = True
  116.             .DataLabels.NumberFormat = "##.##"
  117.             .DataLabels.Position = xlLabelPositionOutsideEnd
  118.             ' With .Interior
  119.             '     .ColorIndex = 5
  120.             '     .PatternColorIndex = 42
  121.             '     .Pattern = xlSolid
  122.             ' End With
  123.         End With
  124.                   
  125.         ' *******************************************************************
  126.                      
  127.         With .Axes(xlValue).TickLabels.Font                    ' Y座標軸上刻度的刻度標籤的字體
  128.             .FontStyle = "標準"
  129.             .Size = 10
  130.         End With
  131.                      
  132.         With .Axes(xlValue)
  133.             .MajorUnit = 2                                     ' 圖表左側數列之間距值設定
  134.             ' .MaximumScale = 30
  135.             ' .MinimumScale = -40
  136.         End With
  137.         
  138.         .HasTitle = True                                       ' 圖表的標題   可見
  139.               
  140.         With .ChartTitle                                       ' 圖表的標題
  141.             .Top = 1
  142.             .Text = xText
  143.             .Font.Size = 16
  144.         End With

  145.         With .PlotArea                                         ' 圖表的繪圖區
  146.             .Top = 16
  147.             .Left = 1
  148.             .Width = sPos(3)
  149.             .Height = sPos(4)
  150.             .Interior.ColorIndex = xlNone
  151.         End With
  152.     End With
  153. End Sub
複製代碼

作者: lamihsuen    時間: 2012-7-21 17:52

本帖最後由 lamihsuen 於 2012-7-21 20:24 編輯

回復 18# c_c_lai


c_c_lai 大哥, 我要使用倒數第二個區間,
以"c"來說是109-152, 以"ni"是49-84, 而"mo"是91-125
另外7/20日新增的列是要取代下列程式因此下列程式我已經刪除了
19.            ' 本次 "C" 欄 Z-SCORE 值計算

20.            ' .Range("C" & z_sr & " :C" & xlRow).Formula = "=(b" & z_sr & "-$B$" & z_sr - 3 & ") /$C$" & z_sr - 3

21.            ' .Range("D" & z_sr & " :D" & xlRow).Formula = "=IF(C" & z_sr & ">=3,""異常"",IF( C" & z_sr & "<=2,""ok"",""有質疑""))"


另外我想加入水平軸標題與垂直軸標題 加入下列語法(水平軸標題"實驗室編號")垂直軸標題"z_score"


        With .Axes(xlCategory)                                  ' X座標軸

             .CategoryType = xlCategoryScale

             ' .TickLabels.NumberFormatLocal = "hh:mm"

            .MajorTickMark = xlNone

            .Border.Weight = xlHairline

             .Border.LineStyle = xlNone

             .TickLabelPosition = xlLow

             .TickLabels.Font.Size = 10
              .HasTitle = True                       **********  '這是我加入的  *********
              AxisTitle.Text = "實驗室編號"
            
         End With
這樣可以嗎?
作者: c_c_lai    時間: 2012-7-21 23:33

回復 20# lamihsuen
請將 drawStatistics() 整個抽換掉:
  1. Sub DrawStatistics(ct As Integer)
  2.     Dim tbl As String
  3.     Dim totalRow As Long
  4.     Dim StartKBarRow, EndKBarRow As Long

  5.     ' StartKBarRow = 6
  6.     With Worksheets(ct)
  7.         tbl = .Name
  8.         ' sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3)) ' 圖標座標(列)
  9.         ' 為考量在實務運用上,每張表單內含資料內容之多寡不一,可能實際使用列數時有增減,故改以動態處理。
  10.         sPos(1) = .UsedRange.Rows.Count                               ' 以 c 為例,總共使用(輸入)了 204 Rows 資料錄。
  11.         While IsEmpty(.Cells(sPos(1), 3).Value) And sPos(1) > 6       ' 尚須再次過濾部分空白與非真實匯入資料的問題列
  12.             sPos(1) = sPos(1) - 1
  13.         Wend
  14.         
  15.         ' EndKBarRow = .Range("A1").CurrentRegion.Rows.Count   ' 以 c 為例,判斷A1:A51區間實際使用了(共有)多少列(Rows)
  16.         ' 以 c 為例,A155:A204 間總共使用了多少列(50)。接著再求出上一個區間的最後一行的所在行數 (204-50-2(空白列)=152)。
  17.         EndKBarRow = sPos(1) - .Range("A" & sPos(1)).CurrentRegion.Rows.Count - 2
  18.         ' 以 c 為例, A105:A152 間總共使用了多少列(48)。接著再求出本區間的第一行的所在行數 (152-48+5(標題列)=109)。
  19.         StartKBarRow = EndKBarRow - .Range("A" & EndKBarRow).CurrentRegion.Rows.Count + 5
  20.         If (StartKBarRow < 6) Then StartKBarRow = 6          ' < 6 則加 1, 因起始列最少為 6。
  21.         
  22.         Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
  23.         
  24.         sPos(1) = sPos(1) + 5                                                                         ' 圖標座標(列)
  25.         sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))   ' 圖標座標(欄)
  26.         sPos(3) = CInt(Mid("900*900*900*900*900*900*900*900*900*900*900*900", (ct - 4) * 4 + 1, 3))   ' 圖表寬度
  27.         sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))   ' 圖表高度
  28.         xText = UCase(tbl) & " : Z - Score"
  29.         製圖程序 xlSh:=tbl
  30.     End With
  31. End Sub
複製代碼
晚安!
作者: c_c_lai    時間: 2012-7-21 23:39

回復 20# lamihsuen
Sub DrawStatistics(ct As Integer)
    Dim tbl As String
    Dim totalRow As Long
    Dim StartKBarRow, EndKBarRow As Long

    ' StartKBarRow = 6
    With Worksheets(ct)
        tbl = .Name
        ' sPos(1) = CInt(Mid("205*090*090*100*132*096*132*090*173*090*314*090", (ct - 4) * 4 + 1, 3)) ' 圖標座標(列)
        ' 為考量在實務運用上,每張表單內含資料內容之多寡不一,可能實際使用列數時有增減,故改以動態處理。
        sPos(1) = .UsedRange.Rows.Count                               ' 以 c 為例,總共使用(輸入)了 204 Rows 資料錄。
        While IsEmpty(.Cells(sPos(1), 3).Value) And sPos(1) > 6       ' 尚須再次過濾部分空白與非真實匯入資料的問題列
            sPos(1) = sPos(1) - 1
        Wend
        
        ' EndKBarRow = .Range("A1").CurrentRegion.Rows.Count   ' 以 c 為例,判斷A1:A51區間實際使用了(共有)多少列(Rows)
        ' 以 c 為例,A155:A204 間總共使用了多少列(50)。接著再求出上一個區間的最後一行的所在行數 (204-50-2(空白列)=152)。
        EndKBarRow = sPos(1) - .Range("A" & sPos(1)).CurrentRegion.Rows.Count - 2
        ' 以 c 為例, A105:A152 間總共使用了多少列(48)。接著再求出本區間的第一行的所在行數 (152-48+5(標題列)=109)。
        StartKBarRow = EndKBarRow - .Range("A" & EndKBarRow).CurrentRegion.Rows.Count + 5
        If (StartKBarRow < 6) Then StartKBarRow = 6          ' < 6 則加 1, 因起始列最少為 6。
        
        Set Chart_Source = Range(tbl & "!$C$" & CStr(StartKBarRow) & ":" & tbl & "!$C$" & CStr(EndKBarRow))
        
        sPos(1) = sPos(1) + 5                                                                         ' 圖標座標(列)
        sPos(2) = CInt(Mid("001*001*001*001*001*001*001*001*001*001*001*001", (ct - 4) * 4 + 1, 3))   ' 圖標座標(欄)
        sPos(3) = CInt(Mid("900*900*900*900*900*900*900*900*900*900*900*900", (ct - 4) * 4 + 1, 3))   ' 圖表寬度
        sPos(4) = CInt(Mid("320*320*320*320*320*320*320*320*320*320*320*320", (ct - 4) * 4 + 1, 3))   ' 圖表高度
        xText = UCase(tbl) & " : Z - Score"
        製圖程序 xlSh:=tbl
    End With
End Sub
作者: c_c_lai    時間: 2012-7-22 06:38

論壇網頁資料是否有異狀?
作者: c_c_lai    時間: 2012-7-22 07:54

本帖最後由 c_c_lai 於 2012-7-22 08:01 編輯

2012/7/22 加入 XValues 設定圖表數列中 X 值的陣列。 請將 "製圖程序()" 中 .AxisGroup = 1 的下一列增加一行:
.SeriesCollection(1).XValues = Range(Sh.Name & "!$A$" & CStr(StartKBarRow) & ":" & Sh.Name & "!$A$" & CStr(EndKBarRow))
如下所示:


Private Sub 製圖程序(xlSh As String)                                ' 全部重繪
    Dim Sh As Worksheet, xi As Integer
   
    Set Sh = Sheets(xlSh)
    Sh.ChartObjects.Delete

    With Sh.ChartObjects.Add(Sh.Cells(sPos(1), sPos(2)).Left, Sh.Cells(sPos(1), sPos(2)).Top, sPos(3), sPos(4)).Chart
        .ChartType = xlColumnClustered                            ' xlColumnStacked -> 堆疊直條圖
        .SetSourceData Source:=Chart_Source
        .HasLegend = 0                                                           ' 圖表的圖例:  不可見
        .SeriesCollection(1).AxisGroup = 1
        ' 2012/7/22 加入 XValues 設定圖表數列中 X 值的陣列。 原本未設定是以數列序號處理,故予以修正以符事實。
        .SeriesCollection(1).XValues = Range(Sh.Name & "!$A$" & CStr(StartKBarRow) & ":" & Sh.Name & "!$A$" & CStr(EndKBarRow))


同時將 StartKBarRow 與 EndKBarRow 的變數宣告從 DrawStatistics() 中移置公用變數宣告區塊。


Option Explicit

Dim sPos(1 To 4)
Dim xText As String
Dim Chart_Source As Variant
' 因於 DrawStatistics() 以及 製圖程序() 函式內均需使用,故將此兩變數改為公用變數
Dim StartKBarRow, EndKBarRow As Long   

到此我想應該業已大功告成了吧,祝妳學業猛進!

P.S. 最後再贈送一個小禮物 ("##.##" 改成如下,閱覽會更明確):
.DataLabels.NumberFormat = "#0.##"
作者: lamihsuen    時間: 2012-7-22 16:02

回復 30# c_c_lai
c_c_lai 大哥  對不起還没完成最終目標,可以看看再現在傳給你檔案是我要用vba語法完成的最終目標整個過程如下敍述
  1 先初始分析結果表  
   2  再執行outline判別  , 如果合格就記錄"ok"不合格就記錄"ng"  
   3  如果有"ng"值去除"ng"該列,  把"ok"列copy 到下一次表格區間再執行outline判別,(因為列數(家數)減少,判別值會改變)
  4  一直到全部都"ok"時這個表格區間是我圖表資料的來源5 最後再增加一表格區間(稱為執行z_score)把全部列數(家數)copy 到最後表格區間 (執行z_score)作z_score判別
5 再完成報告書
    [attach]11816[/attach]
作者: lamihsuen    時間: 2012-7-22 16:57

回復 30# c_c_lai
c_c_lai大哥加入下列時

   . SeriesCollection(1).XValues = Range(Sh.Name & "!$A$" & CStr(StartKBarRow) & ":" & Sh.Name & "!$A$" & CStr(EndKBarRow))
會出現"執行階段錯誤'1004'range方法('global'物件失敗)
作者: lamihsuen    時間: 2012-7-22 17:46

回復 30# c_c_lai
c_c_lai 大哥, 原諒我的迷糊.我把Dim StartKBarRow, EndKBarRow As Long從製圖程式移除後程式就能正確執行
作者: c_c_lai    時間: 2012-7-22 20:11

本帖最後由 c_c_lai 於 2012-7-24 21:06 編輯

回復 8# lamihsuen
網頁好像有問題,有的內容根本看不到訊息,
作者: lamihsuen    時間: 2012-7-23 10:14

c_c_lai  大哥, 請問列表第三頁以後都不見了,要如何叫出
作者: lamihsuen    時間: 2012-7-24 18:14

回復 28# c_c_lai
c_c_lai 大哥   請問如何設定讓圖表區與繪圖區底部空間大一點,我加入水平軸標題時都會與類別標籤重疉
作者: c_c_lai    時間: 2012-7-25 07:44

回復 30# lamihsuen
原本為
  1.         With .PlotArea                                         ' 圖表的繪圖區
  2.             .Top = 16
  3.             .Left = 1
  4.             .Width = sPos(3)
  5.             .Height = sPos(4)
  6.             .Interior.ColorIndex = xlNone
  7.         End With
複製代碼
修正為
  1.         With .PlotArea                                         ' 圖表的繪圖區
  2.             .Top = 16
  3.             .Left = 1
  4.             .Width = sPos(3)
  5.             .Height = sPos(4)
  6.             .Interior.ColorIndex = xlNone
  7.             
  8.             ' 可依個人之考量予以增減內部圖表的高、低、以及寬度
  9.             .InsideLeft = 40
  10.             .InsideTop = Sheets(xlSh).Rows(3).RowHeight * 2
  11.             .InsideWidth = sPos(3) - 50
  12.             .InsideHeight = sPos(4) - 5 * Sheets(xlSh).Rows(3).RowHeight
  13.         End With
複製代碼
試試看!
作者: c_c_lai    時間: 2012-7-25 07:46

回復 30# lamihsuen
剛傳的怎麼又不見了??????
作者: c_c_lai    時間: 2012-7-27 15:17

本題目因網頁有些怪異(第三頁有些回應都自動消失無影),且問題業已另行解決。
應予以結案。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)