返回列表 上一主題 發帖

[發問] 動態修正匯入圖表的最後資料列之列數所延伸的問題

[發問] 動態修正匯入圖表的最後資料列之列數所延伸的問題

我有一些疑惑想請各位大大指導,程式碼如下: (裡面分別處理了6個統計圖表)
  1. Sub getEndRows()  ' 以 Excel -> 插入 -> 折線圖、直條圖 方式一一插入於工作表單內的檢查方式。
  2.     Dim oShape As Shape
  3.     Dim numChart As Integer
  4.     Dim totalRows As Single
  5.    
  6.     numChart = 0
  7.    
  8.     Sheets("統計圖表").Select
  9.     totalRows = Range("B" & Rows.Count).End(xlUp).Row     ' 傳回 B 欄所使用儲存格之最後一格之列號 (實際匯入資料之總列數)
  10.             
  11.     For Each oShape In ActiveSheet.Shapes
  12.         If oShape.Type = 3 Then
  13.             numChart = numChart + 1
  14.             
  15.             Cells(lines, 36).Value = "第 " & lines - 1 & " 個圖表"           
  16.             Cells(lines, 37).Value = oShape.Name

  17.             ' Shapes(oShape.Name).Select     ' 必須先行宣告 oShape.Name 選擇,否則以下座標位置、高度、以及寬度之重新設定將予以忽略而無實質作用
  18.             ActiveSheet.ChartObjects(oShape.Name).Activate                     
  19.             Cells(lines, 38).Value = ActiveSheet.ChartObjects(oShape.Name).Name   ' 結果是等於 oShape.Name
  20.                
  21.             Select Case numChart
  22.                 Case 1
  23.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $I$1:$J$" & totalRows)  
  24.                 Case 2
  25.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AA$1:$AA$" & totalRows)
  26.                 Case 3
  27.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AC$1:$AC$" & totalRows)
  28.                 Case 4
  29.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AE$1:$AE$" & totalRows)
  30.                 Case 5
  31.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AG$1:$AG$" & totalRows)
  32.                 Case Else
  33.                     ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $V$1:$V$" & totalRows)   ' 圖示會分別顯示出 成交價

  34.                     ' 測試OK後,之後又增加了以下四行程式碼
  35.                     ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
  36.                     ActiveChart.Axes(xlCategory).MajorTickMark = xlNone
  37.                     ' 將時間軸從 0 刻度線下方(圖表預設值)移至到圖表之最下方位置 (原本預設於負值數值列處,遮蓋了負值曲線之檢視;故將之移位,將使得表格易於閱覽)
  38.                    ActiveChart.Axes(xlCategory).TickLabelPosition = xlLow     

  39.                    Cells(lines, 38).Value = ActiveChart.ChartTitle.Text  
  40.             End Select
  41.         End If
  42.     Next
  43. End Sub
複製代碼
1.     我原本是使用   Shapes(oShape.Name).Select  ,但在該統計圖表工作表單內執行時是OK,但將它搬到 ThisWorkbook 內就有錯誤訊息,於是便把它修改成
         ActiveSheet.ChartObjects(oShape.Name).Activate 便能順利執行,其原因為何? 正確應如何應用?
2.      測試OK後,之後我又增加了四行程式碼,結果顯示 Axes、TickLabels、ctiveChart.ChartTitle.Text 等語法上不正確,
                    ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
                    ActiveChart.Axes(xlCategory).MajorTickMark = xlNone
                   ActiveChart.Axes(xlCategory).TickLabelPosition = xlLow     
                   Cells(lines, 38).Value = ActiveChart.ChartTitle.Text  
        請教應該要如何修正才OK?
謝謝您!

回復 1# c_c_lai
  1. Option Explicit
  2. Sub Ex()
  3.     With ActiveSheet.ChartObjects(oShape.Name).Chart
  4.         .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
  5.         .Axes(xlCategory).MajorTickMark = xlNone
  6.         .Axes(xlCategory).TickLabelPosition = xlLow
  7.         Cells(Lines, 38).Value = ActiveChart.ChartTitle.Text
  8.     End With
  9. End Sub
複製代碼

TOP

太感激您了, 對於我這個剛觸摸 VBA 的人來說的確是大有幫助,
它和一般傳統語言確實有些不同 (C/C++,Java....),謝謝您呦!

TOP

各位大大請幫個忙:
我已把 GBKEE 前輩的 Code 引入,執行時卻出現了以下之錯誤訊息,將它們Marked又恢復正常,
起問應如何處理? 謝謝各位大大!

' 執行階段錯誤 '-2147467259 (80004005)':
' Automation 錯誤
' 無法指出的錯誤

TOP

回復 4# c_c_lai

望了案回覆鈕,所以又再發了一次,對不起!

各位大大請幫個忙:
我已把 GBKEE 前輩的 Code 引入,執行時卻出現了以下之錯誤訊息,將它們Marked又恢復正常,
起問應如何處理? 謝謝各位大大!

' 執行階段錯誤 '-2147467259 (80004005)':
' Automation 錯誤
' 無法指出的錯誤

TOP

本帖最後由 alexliou 於 2012-4-6 15:31 編輯

回復 1# c_c_lai
1.  原來第 18列的Code : Shapes(oShape.Name).Select
前面如果沒寫是在那裡的Shape時, 在這個工作表和ThisWorkbook都會發生錯誤
如果改成  ActiveSheet.Shapes(oShape.Name).Select   
我測試的結果是兩邊都可以執行
2. 那四行程式碼 我測試的結果是可以work
Alex

TOP

回復 5# c_c_lai
傳上檔案看看

TOP

回復 7# GBKEE
小弟將實際在執行的程式碼貼上,敬請各位前輩指導。
  1. Sub setRowColumn()  ' 以 Excel -> 插入 -> 折線圖、直條圖 方式一一插入於工作表單內的檢查方式。
  2.     Dim oShape As Shape
  3.     Dim numChart As Integer
  4.     Dim totalRows As Single
  5.    
  6.     numChart = 0
  7.    
  8.     Sheets("統計圖表").Select
  9.     totalRows = Range("B" & Rows.Count).End(xlUp).Row        ' 傳回 B 欄所使用儲存格之最後一格之列號
  10.             
  11.     For Each oShape In ActiveSheet.Shapes
  12.         If oShape.Type = 3 Then
  13.             numChart = numChart + 1
  14.             
  15.             Active.Shapes(oShape.Name).Select                     ' 如果 Shapes 前加上 Active. 執行時會出現  ---->  執行階段錯誤 '424':  此處需要物件
  16.             ' ActiveSheet.ChartObjects(oShape.Name).Activate
  17.            
  18.             ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $V$1:$V$" & totalRows)
  19.                      
  20.             With ActiveSheet.ChartObjects(oShape.Name).Chart
  21.                 .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss"
  22.                 .Axes(xlCategory).MajorTickMark = xlCategoryScale
  23.                 .Axes(xlCategory).TickLabelPosition = xlLow
  24.                         
  25.                 Cells(Lines, 38).Value = .ChartTitle.Text
  26.             End With
  27.                   
  28.             ActiveSheet.Shapes(oShape.Name).Left = Cells(31, 1).Left     ' 設定此圖表實際擺放的 X、Y 座標位置。
  29.             ActiveSheet.Shapes(oShape.Name).Top = Cells(31, 1).Top
  30.                     
  31.             ActiveChart.ChartArea.Height = 488                           ' 將原本設定之高度調至適度位置
  32.             ActiveChart.ChartArea.Width = 900
  33.             
  34.             ActiveChart.SeriesCollection(1).InvertIfNegative = True
  35.             ActiveChart.SeriesCollection(1).InvertColor = RGB(32, 178, 208)

  36.             With ActiveChart.SeriesCollection(1).Format.Fill
  37.                 .Visible = msoTrue
  38.                 .ForeColor.RGB = RGB(255, 69, 0)
  39.                 .Transparency = 0
  40.                 .Solid
  41.             End With
  42.         End If
  43.     Next
  44. End Sub
複製代碼
1.  如果 Shapes 前加上 Active. 執行時會出現  ---->  執行階段錯誤 '424':  此處需要物件

    Active.Shapes(oShape.Name).Select                     ' 如果 Shapes 前加上 Active. 執行時會出現  ---->  執行階段錯誤 '424':  此處需要物件
    ' ActiveSheet.ChartObjects(oShape.Name).Activate

2A.  如果 Shapes 前拿掉增加之 Active. 執行時

    Shapes(oShape.Name).Select                     
    ' ActiveSheet.ChartObjects(oShape.Name).Activate

    或者是以

    ' Shapes(oShape.Name).Select                     
    ActiveSheet.ChartObjects(oShape.Name).Activate

    方式執行時會出現  ---->  執行階段錯誤 '5':  程序呼叫或引述不正確

2B. 以 2A 模式處理,之後追蹤結果發現問題出在

    With ActiveSheet.ChartObjects(oShape.Name).Chart
        .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss"
        .Axes(xlCategory).MajorTickMark = xlCategoryScale
        .Axes(xlCategory).TickLabelPosition = xlLow
                        
        Cells(Lines, 38).Value = .ChartTitle.Text
    End With

  2BA:  如果將其中 Cells(Lines, 38).Value = .ChartTitle.Text Marked起來執行

    With ActiveSheet.ChartObjects(oShape.Name).Chart
        .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss"
        .Axes(xlCategory).MajorTickMark = xlCategoryScale
        .Axes(xlCategory).TickLabelPosition = xlLow
                        
        ' Cells(Lines, 38).Value = .ChartTitle.Text
    End With

    執行時會出現  ---->   執行階段錯誤 '-2147467259 (80004005)':
                          Automation 錯誤
                          無法指出的錯誤

  2BB:  如果只將其中第一項 Marked 起來執行

    With ActiveSheet.ChartObjects(oShape.Name).Chart
        ' .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss"
        .Axes(xlCategory).MajorTickMark = xlCategoryScale
        .Axes(xlCategory).TickLabelPosition = xlLow
                        
        Cells(Lines, 38).Value = .ChartTitle.Text
    End With

    執行時會出現  ---->  執行階段錯誤 '5':  程序呼叫或引述不正確

  2BC:  如果只將其中質疑的兩項 Marked 起來執行

    With ActiveSheet.ChartObjects(oShape.Name).Chart
        ' .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss"
        .Axes(xlCategory).MajorTickMark = xlCategoryScale
        .Axes(xlCategory).TickLabelPosition = xlLow
                        
        ' Cells(Lines, 38).Value = .ChartTitle.Text
    End With

    執行起來毫無異樣,似乎是一切正常的樣子。

這或許是我用功仍然不足,尚請指證!

TOP

本帖最後由 GBKEE 於 2012-4-6 09:35 編輯

回復 8# c_c_lai
語法錯誤    Active.Shapes(oShape.Name).Select                     
正確           ActiveSheet.Shapes(oShape.Name).Select

變數Lines 沒看到你指定值 還是會有錯誤的
Cells(Lines, 38).Value = .ChartTitle.Text

*********
2A.  如果 Shapes 前拿掉增加之 Active. 執行時
    Shapes(oShape.Name).Select                     
    ' ActiveSheet.ChartObjects(oShape.Name).Activate
    或者是以
    ' Shapes(oShape.Name).Select                     
    ActiveSheet.ChartObjects(oShape.Name).Activate
    方式執行時會出現  ---->  執行階段錯誤 '5':  程序呼叫或引述不正確
***************
2003版 皆無錯誤  請附上檔檔案方便詳看

TOP

附上檔案,謝謝您!
成交價與成交量.rar (39.68 KB)

TOP

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