返回列表 上一主題 發帖

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

回復 19# GBKEE
最近實際一口氣每次 Run 了六個圖表,且是線上隨時修正匯入總筆數 (如: "統計圖表!$B$1:統計圖表!$B$" & totalRows ),
結果發現在每次自動更新後,都 Focus 在最後一個圖表上。如果此時動了鍵盤就出狀況了;
譬如: 您可能此時在 Excel 上修正某些資料,如:使用 DEL 鍵等,便將該最後 Focus 的圖表給刪除掉了,
這也是我剛剛沒留意而發生的情況。 結果只剩下了五個圖表,經仔細觀察,發覺只要 VBA 自動執行  
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows) 後,換成第五個圖表 (最後一個圖表) 被
Focus 了。
請問我要如何避開此困擾的問題。 假設 畫完圖表後,下個指令,如: Cells(1,1).Select 當然便將移轉 Focus 到 A1 欄位上了,
但是如果您在 .SetSourceData 執行前,正在閱覽其它的工作表單,則接下來的畫面便會被切到 A1 欄位上了。
這樣處理豈不感到非常奇怪? 因為閱覽頁面突然被強制轉移了!
請問有否判斷原本閱覽頁面、或者是原本游標在哪裡,繪完圖後自動切回到原頁面? 或者是還有更棒的 Idea?
謝謝您了!

TOP

回復 21# c_c_lai
上傳檔案看看

TOP

回復 22# GBKEE

該情況需在盤中運作時才觀察得到,因昨日盤中不小心刪掉最後的那張圖表,怕不客觀,所以今天我再觀察看看,
如果仍然一樣我再向您稟告,謝謝您!

TOP

回復 22# GBKEE
觀察結果如:
1).   我故意先將游標 Focus 到 AZ2 欄位上,做為方便辨識之用。


2).  接下不去碰觸任何咚咚,觀察齊資料動態處哩,只要它一回寫 getEndRows ,
      動作結束後便會自動  Focus 到 "主力、散戶、與成交價、量" 的圖表上。


請教應如何去避免此狀況,而且也不會影響到原本查看的頁面。
謝謝您!
  1. Sub Test()
  2.     .
  3.     .
  4.     .
  5.     Call getEndRows("統計圖表")
  6.     Call getEndRows("Omega")
  7.     .
  8. End Sub

  9. Sub getEndRows(sDraw As String)  
  10.     Dim oShape As Shape
  11.     Dim numChart As Integer
  12.     Dim totalRows As Single
  13.    
  14.     numChart = 0
  15.    
  16.     totalRows = Sheets("統計圖表").Range("B" & Rows.Count).End(xlUp).Row     ' 傳回 B 欄所使用儲存格之最後一格之列號
  17.     Sheets(sDraw).Select
  18.             
  19.     For Each oShape In ActiveSheet.Shapes
  20.         If oShape.Type = 3 Then
  21.             numChart = numChart + 1
  22.             
  23.             ActiveSheet.ChartObjects(oShape.Name).Activate   
  24.                
  25.             Select Case numChart
  26.                 Case 1
  27.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AA$1:統計圖表!$AA$" & totalRows) ' 圖示會分別顯示出 主力界入
  28.                 Case 2
  29.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AB$1:統計圖表!$AB$" & totalRows) ' 圖示會分別顯示出 力差
  30.                 Case 3
  31.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AC$1:統計圖表!$AC$" & totalRows) ' 圖示會分別顯示出 消化力
  32.                 Case 4
  33.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AD$1:統計圖表!$AD$" & totalRows) ' 圖示會分別顯示出 均差(大戶)
  34.                 Case 5
  35.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$I$1:統計圖表!$J$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows)  ' 圖示會分別顯示出 成交價、主力界入、散戶方向、以及成交量。
  36.                 Case Else
  37.                     ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows)   ' 圖示會分別顯示出 成交價
  38.             End Select
  39.         End If
  40.         
  41.         If (sDraw = "Omega" And numChart = 5) Then Exit For
  42.     Next
  43. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2012-4-19 12:31 編輯

回復 24# c_c_lai
問題在
ActiveSheet.ChartObjects(oShape.Name).Activate
  1. Sub getEndRows(sDraw As String)
  2.     Dim oShape As Shape
  3.     Dim numChart As Integer
  4.     Dim totalRows As Single
  5.     numChart = 0
  6.     totalRows = Sheets("統計圖表").Range("B" & Rows.Count).End(xlUp).Row     ' 傳回 B 欄所使用儲存格之最後一格之列號
  7.     Sheets(sDraw).Select
  8.     For Each oShape In ActiveSheet.Shapes
  9.         If oShape.Type = 3 Then
  10.             numChart = numChart + 1
  11.             With ActiveSheet.ChartObjects(oShape.Name).Chart
  12.                 Select Case numChart
  13.                     Case 1
  14.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AA$1:統計圖表!$AA$" & totalRows) ' 圖示會分別顯示出 主力界入
  15.                     Case 2
  16.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AB$1:統計圖表!$AB$" & totalRows) ' 圖示會分別顯示出 力差
  17.                     Case 3
  18.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AC$1:統計圖表!$AC$" & totalRows) ' 圖示會分別顯示出 消化力
  19.                     Case 4
  20.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AD$1:統計圖表!$AD$" & totalRows) ' 圖示會分別顯示出 均差(大戶)
  21.                     Case 5
  22.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$I$1:統計圖表!$J$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows)  ' 圖示會分別顯示出 成交價、主力界入、散戶方向、以及成交量。
  23.                     Case Else
  24.                         .SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows)   ' 圖示會分別顯示出 成交價
  25.                 End Select
  26.             End With
  27.         End If
  28.         If (sDraw = "Omega" And numChart = 5) Then Exit For
  29.     Next
  30. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2012-4-19 12:18 編輯

回復 25# GBKEE
如果改成 ActiveSheet.ChartObjects(oShape.Name).Select 可行否?

經實際測試, .Activate = .Select 結果一樣,
應如何修正呢? 如果將它 Mask ' 圖形便走樣了!

TOP

本帖最後由 GBKEE 於 2012-4-19 12:31 編輯

回復 26# c_c_lai
25# 的  程式碼 你有套用試看看嗎?
經實際測試, .Activate = .Select 結果一樣,???
With ActiveSheet.ChartObjects(oShape.Name).Chart    並沒有要  Activate OR .Select

TOP

回復 27# GBKEE
太棒了!問題終於解決了。
請教您:
使用             With ActiveSheet.ChartObjects(oShape.Name).Chart    與
使用            ActiveSheet.ChartObjects(oShape.Name).Activate        
在實務應用面上,其意義上到底有甚麼差別呢? With ActiveSheet.ChartObjects(oShape.Name).Chart  
會自行行使 Select 嗎?

TOP

本帖最後由 GBKEE 於 2012-4-19 14:29 編輯

回復 28# c_c_lai
ActiveSheet.ChartObjects(oShape.Name).Activate   
這語法的意思: 將目前的圖表變成作用中的圖表 ,螢幕畫面會轉移到此圖表
With ActiveSheet.ChartObjects(oShape.Name).Chart     
這語法的意思  在一個單一物件或一個使用者自訂型態上執行一系列的陳述式
螢幕畫面不會轉移到此圖表

TOP

本帖最後由 c_c_lai 於 2012-4-19 16:18 編輯

回復 29# GBKEE
再請教一下:
我執行繪圖的程序是:
1)  載入資料全部放置在 "統計圖表"工作表單,按鈕選項全部安插在"Omega"工作表單上。
2) 如果選按 "全部重繪", 它會先繪製 "統計圖表"工作表單上的圖表,接下來再去繪製"Omega"工作表單上的圖表
    (兩個工作表單表單上執行的繪圖模組是一樣的,只是分別將兩個工作表單上繪製同樣圖表)
3) 在"統計圖表"工作表單上成功地繪製出六個圖表後,接著又要在"Omega"工作表單上劃出同樣六個相同圖表時,
     卻出現一錯誤訊息  -----  系統錯誤 &H80040000 (-2147221504)。  無效的 OLEVERB 結構
     按完確認鈕後,不予理會在執行一次,接著又出現一錯誤視窗  -----  400
4) 觀察結果是:"統計圖表"工作表單上成功地繪製出了六個正確圖表,而在"Omega"工作表單上有時只產生了一張圖表,
    有時卻都產生瞭六個圖表,但其數列均非指定的數列,而是"Omega"工作表單上本身之其他用途的數據資料 (亂抓Omega的使用資料)。
請問這是何種情況才會如此?

5) 將其所有相關模組放入另一 Excel 表內執行,都正常。
     但不同的是: 這個表單的"Omega"工作表單上並無存放任何資料,僅擺放按鈕而已。   (將它附上參考,所有模組均一致)
    (為了與原始一致,"Omega" 的圖表位置是在 AI:AF 間)
主力、散戶、成交價、量.rar (198.08 KB)
(最後支附件才是)

主力、散戶、成交價、量.rar (198.08 KB)

TOP

        靜思自在 : 要比誰更受誰.不要比誰更怕誰。
返回列表 上一主題