返回列表 上一主題 發帖

請各位大大幫忙修改建立崁入圖表錯誤語法

回復 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
複製代碼
晚安!

TOP

回復 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

TOP

論壇網頁資料是否有異狀?

TOP

本帖最後由 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.##"

TOP

回復 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 再完成報告書
    11C1.rar (47.98 KB)

TOP

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

   . SeriesCollection(1).XValues = Range(Sh.Name & "!$A$" & CStr(StartKBarRow) & ":" & Sh.Name & "!$A$" & CStr(EndKBarRow))
會出現"執行階段錯誤'1004'range方法('global'物件失敗)

TOP

回復 30# c_c_lai
c_c_lai 大哥, 原諒我的迷糊.我把Dim StartKBarRow, EndKBarRow As Long從製圖程式移除後程式就能正確執行

TOP

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

回復 8# lamihsuen
網頁好像有問題,有的內容根本看不到訊息,

TOP

c_c_lai  大哥, 請問列表第三頁以後都不見了,要如何叫出

TOP

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

TOP

        靜思自在 : 得理要饒人,理直要氣和。
返回列表 上一主題