none
同一個程式第二次執行(新增EXCEL圖形)所產生的問題 RRS feed

  • 問題

  • 當我輸入完資料
    開始要畫圖的時候
    有時候在第二行的 With ActiveChart會出現錯誤
    錯誤訊息是:執行階段錯誤'1004' ActiveChart方法('_Glocal'物件)失敗
    錯誤好像都是發生在當我的VB執行一次後
    在沒有關掉程式的情況下要在畫另一個圖時會產生(就是同一個button按第二次,但是儲存檔名我有改過)
    在其他地方有看到類似情形 點我
    他是在後面加上
    objexcel.Cells.Select  
    objexcel.Selection.ClearContents

    選Cells來清除是因為他要清掉之前存在物件中的資料?
    所以我在新增圖形中出現錯誤
    是不是就應該要寫成
    xlApp.ActiveChart.Select  
    xlApp.Selection.ClearContents

    (不過結果證明~當然不能這樣寫@@)
    下面是我的程式碼

    Set xlApp = CreateObject(\"excel.application\")
    Set oBook = xlApp.Workbooks.Add
    With xlApp
    .Cells(1, 1).Value = \"0\"
    ...
    ...
    ...
    .Charts.Add
    End With
    With ActiveChart
    .HasTitle = True
    .ChartTitle.Characters.Text = \"class A\"
    .ChartTitle.Select
    '.Left = 508
    Selection.Top = 30
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = \"grades\"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = \"counts\"
    .HasLegend = False
    .ChartType = 73
    .SetSourceData Source:=Sheets(\"sheet1\").Range(\"A1:B20\"), _
    PlotBy:=xlColumns
    .Location Where:=xlLocationAsObject, Name:=\"sheet1\"
    End With
    oBook.SaveAs track & \".xls\"
    2006年9月19日 上午 09:10

所有回覆

  • 你好~璉璉~

    剛回頭查詢了一下

    是跟

    xlBook = xl.Workbooks.Add() ' 新增工作簿

    xlSheet = xlBook.Sheets.Add() ' 新增工作頁

    有關係嗎?

    我現在出現的問題就是在於

    當我第二次輸入資料和儲存路徑與檔名時(沒有結束程式)

    第二個檔案會出現(資料有輸入進去,Chart.Add也有成功)

    但是從那以後(就是從With ActiveChart開始)

    所做的動作都會在第一次產生的那個Excel檔中執行

    包含決定圖表標題、座標軸名稱、選定Range、畫圖等等

    所以第一個Excel檔的圖形就會被修改

    (但是如果當時第一個Excel檔不是開啟的狀態就會出現1004的錯誤訊息)

    現在唯一想到解決的辦法就是每存完一個excel檔就結束程式

    想要在新增第二個要再執行一次(很不方便:()

    希望前輩能在多給點提示~謝謝

    2006年9月20日 上午 01:26
  • 關鍵字有用到 Selection ,所以是跟 Selection 有關。

    一般來說,除非在應用軟體內使用 VBA ,否則應該盡量避免 Selection, Active* 這類應用程式公用物件與屬性,因為你的程式跟應用軟體是分離的,所以當你使用這類物件時,你應該確認你的行為是符合你的需求,並確保中途不被插斷或是多檔存取時,被其他動作或行為變更公用物件。一般來說,應該使用絕對定址的物件,才不致發生問題。

    例如你的程式碼使用 ActiveChart ,當該 Chart 不在作用中,而焦點在其他物件時,就會發生錯誤。所以當你在使用
    .Charts.Add
    時,就改用
    Set nowChart = .Charts.Add
    ' 你的程式碼看起來像是 VB6/VBA/VBScript ,若在 VBNET 則把 Set 移除

    後續操控 Chart 物件時,直接用 nowChart ,不要用 ActiveChart ,這樣不論焦點是否在該 Chart 上,仍可順利變更該 Chart 屬性。

    當你大量運用 Office 時,由於 Active*, Select* 變更都會造成效能降低,所以大量運算或變更時,會跳過這類屬性與方法,甚至讓工作中的視窗處於隱藏狀態、停止自動重算,利用 Application.StatusBar 來顯示目前進度與執行的工作項目,提高執行效能。

    駐:這類問題應該張貼在 Office Developer 版

    2006年9月20日 上午 03:44
    版主
  • 謝謝~

    我現在是用    Dim wb As Excel.Workbook, ws As Excel.Worksheet

        Dim ct As Chart
        ws.Application.Charts.Add
        Set ct = ws.Application.ActiveChart
        With ws.Application.ActiveChart
            .ChartType = 73
            .HasTitle = True

    這樣就可以顯示出標題了

    而且就如你所說

    類似        .ChartTitle.Select
                   Selection.Top = 30  的這些指令在第二次就無法使用了

    我會在好好研究的

     

     

     

     

    2006年9月20日 上午 08:16
  •     ws.Application.Charts.Add
        Set ct = ws.Application.ActiveChart

    合併改成

        Set ct = ws.Application.Charts.Add

    會比較好。

    在執行 Add 方法時,即會傳回參照,若是你同時有多個 Excel 檔再跑,在 Add 完後剛好其他 Excel 檔友執行到 Active, Add, Select 等方法時,可能會導致你參照的 ActiveChart 是其他程式產生或選擇的。

    所以在產生物件時直接參照即可。

    2006年9月20日 下午 12:54
    版主