標題:
[發問]
動態修正匯入圖表的最後資料列之列數所延伸的問題
[打印本頁]
作者:
c_c_lai
時間:
2012-4-5 10:00
標題:
動態修正匯入圖表的最後資料列之列數所延伸的問題
我有一些疑惑想請各位大大指導,程式碼如下: (裡面分別處理了6個統計圖表)
Sub getEndRows() ' 以 Excel -> 插入 -> 折線圖、直條圖 方式一一插入於工作表單內的檢查方式。
Dim oShape As Shape
Dim numChart As Integer
Dim totalRows As Single
numChart = 0
Sheets("統計圖表").Select
totalRows = Range("B" & Rows.Count).End(xlUp).Row ' 傳回 B 欄所使用儲存格之最後一格之列號 (實際匯入資料之總列數)
For Each oShape In ActiveSheet.Shapes
If oShape.Type = 3 Then
numChart = numChart + 1
Cells(lines, 36).Value = "第 " & lines - 1 & " 個圖表"
Cells(lines, 37).Value = oShape.Name
' Shapes(oShape.Name).Select ' 必須先行宣告 oShape.Name 選擇,否則以下座標位置、高度、以及寬度之重新設定將予以忽略而無實質作用
ActiveSheet.ChartObjects(oShape.Name).Activate
Cells(lines, 38).Value = ActiveSheet.ChartObjects(oShape.Name).Name ' 結果是等於 oShape.Name
Select Case numChart
Case 1
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $I$1:$J$" & totalRows)
Case 2
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AA$1:$AA$" & totalRows)
Case 3
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AC$1:$AC$" & totalRows)
Case 4
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AE$1:$AE$" & totalRows)
Case 5
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $AG$1:$AG$" & totalRows)
Case Else
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $V$1:$V$" & totalRows) ' 圖示會分別顯示出 成交價
' 測試OK後,之後又增加了以下四行程式碼
ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
ActiveChart.Axes(xlCategory).MajorTickMark = xlNone
' 將時間軸從 0 刻度線下方(圖表預設值)移至到圖表之最下方位置 (原本預設於負值數值列處,遮蓋了負值曲線之檢視;故將之移位,將使得表格易於閱覽)
ActiveChart.Axes(xlCategory).TickLabelPosition = xlLow
Cells(lines, 38).Value = ActiveChart.ChartTitle.Text
End Select
End If
Next
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?
謝謝您!
作者:
GBKEE
時間:
2012-4-5 10:12
回復
1#
c_c_lai
Option Explicit
Sub Ex()
With ActiveSheet.ChartObjects(oShape.Name).Chart
.Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
.Axes(xlCategory).MajorTickMark = xlNone
.Axes(xlCategory).TickLabelPosition = xlLow
Cells(Lines, 38).Value = ActiveChart.ChartTitle.Text
End With
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-5 10:21
太感激您了, 對於我這個剛觸摸 VBA 的人來說的確是大有幫助,
它和一般傳統語言確實有些不同 (C/C++,Java....),謝謝您呦!
作者:
c_c_lai
時間:
2012-4-5 21:40
各位大大請幫個忙:
我已把 GBKEE 前輩的 Code 引入,執行時卻出現了以下之錯誤訊息,將它們Marked又恢復正常,
起問應如何處理? 謝謝各位大大!
' 執行階段錯誤 '-2147467259 (80004005)':
' Automation 錯誤
' 無法指出的錯誤
作者:
c_c_lai
時間:
2012-4-5 21:43
回復
4#
c_c_lai
望了案回覆鈕,所以又再發了一次,對不起!
各位大大請幫個忙:
我已把 GBKEE 前輩的 Code 引入,執行時卻出現了以下之錯誤訊息,將它們Marked又恢復正常,
起問應如何處理? 謝謝各位大大!
' 執行階段錯誤 '-2147467259 (80004005)':
' Automation 錯誤
' 無法指出的錯誤
作者:
alexliou
時間:
2012-4-6 06:44
本帖最後由 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
作者:
GBKEE
時間:
2012-4-6 07:15
回復
5#
c_c_lai
傳上檔案看看
作者:
c_c_lai
時間:
2012-4-6 09:08
回復
7#
GBKEE
小弟將實際在執行的程式碼貼上,敬請各位前輩指導。
Sub setRowColumn() ' 以 Excel -> 插入 -> 折線圖、直條圖 方式一一插入於工作表單內的檢查方式。
Dim oShape As Shape
Dim numChart As Integer
Dim totalRows As Single
numChart = 0
Sheets("統計圖表").Select
totalRows = Range("B" & Rows.Count).End(xlUp).Row ' 傳回 B 欄所使用儲存格之最後一格之列號
For Each oShape In ActiveSheet.Shapes
If oShape.Type = 3 Then
numChart = numChart + 1
Active.Shapes(oShape.Name).Select ' 如果 Shapes 前加上 Active. 執行時會出現 ----> 執行階段錯誤 '424': 此處需要物件
' ActiveSheet.ChartObjects(oShape.Name).Activate
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $V$1:$V$" & totalRows)
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
ActiveSheet.Shapes(oShape.Name).Left = Cells(31, 1).Left ' 設定此圖表實際擺放的 X、Y 座標位置。
ActiveSheet.Shapes(oShape.Name).Top = Cells(31, 1).Top
ActiveChart.ChartArea.Height = 488 ' 將原本設定之高度調至適度位置
ActiveChart.ChartArea.Width = 900
ActiveChart.SeriesCollection(1).InvertIfNegative = True
ActiveChart.SeriesCollection(1).InvertColor = RGB(32, 178, 208)
With ActiveChart.SeriesCollection(1).Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 69, 0)
.Transparency = 0
.Solid
End With
End If
Next
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
執行起來毫無異樣,似乎是一切正常的樣子。
這或許是我用功仍然不足,尚請指證!
作者:
GBKEE
時間:
2012-4-6 09:22
本帖最後由 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版 皆無錯誤
請附上檔檔案方便詳看
作者:
c_c_lai
時間:
2012-4-6 10:05
附上檔案,謝謝您!
[attach]10316[/attach]
作者:
c_c_lai
時間:
2012-4-6 11:45
回復
9#
GBKEE
不知道您有看到我船上的檔案嗎?
作者:
freeffly
時間:
2012-4-6 15:23
回復
11#
c_c_lai
你是要讓你的圖表一直維持所有資料嗎
只要有新資料圖表就要包含那各資料?
如果是應該用定義名稱做就好比較方便吧
作者:
alexliou
時間:
2012-4-6 15:31
回復 c_c_lai
語法錯誤 Active.Shapes(oShape.Name).Select
正確 A ...
GBKEE 發表於 2012-4-6 09:22
不好意思
ActiveSheet 打成Active
我改一下
作者:
c_c_lai
時間:
2012-4-6 16:18
回復
13#
alexliou
謝謝您! 我會更正測試看看。
但除此之外的所提問錯誤訊息,不知有解否 ?
檔案我再附上一次,麻煩幫我看看是哪裡有錯,謝謝您!
[attach]10323[/attach]
作者:
c_c_lai
時間:
2012-4-6 16:34
回復
13#
alexliou
對不起,我沒留意到您無法下載,我把程式碼附上,
剛才使用 ActiveSheet.Shapes() 執行就 OK 了,
然而 Automation 錯誤 以及 程序呼叫或引述不正確 尚未能解決,要麻煩您了!
Sub setRowColumn() ' 以 Excel -> 插入 -> 折線圖、直條圖 方式一一插入於工作表單內的檢查方式。
Dim oShape As Shape
Dim numChart As Integer
Dim totalRows As Single
numChart = 0
Sheets("統計圖表").Select
totalRows = Range("B" & Rows.Count).End(xlUp).Row ' 傳回 B 欄所使用儲存格之最後一格之列號
For Each oShape In ActiveSheet.Shapes
If oShape.Type = 3 Then
numChart = numChart + 1
ActiveSheet.Shapes(oShape.Name).Select ' OK!
' ActiveSheet.ChartObjects(oShape.Name).Activate
ActiveChart.SetSourceData Source:=Range("$B$1:$B$" & totalRows & ", $F$1:$F$" & totalRows & ", $V$1:$V$" & totalRows)
With ActiveSheet.ChartObjects(oShape.Name).Chart
' .Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm:ss" ' 執行階段錯誤 '-2147467259 (80004005)': Automation 錯誤 無法指出的錯誤
.Axes(xlCategory).MajorTickMark = xlCategoryScale
.Axes(xlCategory).TickLabelPosition = xlLow
' Cells(2, 26).Value = .ChartTitle.Text ' 執行階段錯誤 '5': 程序呼叫或引述不正確
End With
ActiveSheet.Shapes(oShape.Name).Left = Cells(3, 1).Left ' 設定此圖表實際擺放的 X、Y 座標位置。
ActiveSheet.Shapes(oShape.Name).Top = Cells(3, 1).Top
ActiveChart.ChartArea.Height = 488 ' 將原本設定之高度調至適度位置
ActiveChart.ChartArea.Width = 900
ActiveChart.SeriesCollection(1).InvertIfNegative = True
ActiveChart.SeriesCollection(1).InvertColor = RGB(32, 178, 208)
With ActiveChart.SeriesCollection(1).Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 69, 0)
.Transparency = 0
.Solid
End With
End If
Next
Cells(1, 1).Select
End Sub
複製代碼
作者:
GBKEE
時間:
2012-4-6 17:11
回復
14#
c_c_lai
With ActiveSheet.ChartObjects(oShape.Name).Chart
.HasAxis(xlCategory, xlPrimary) = True
' .HasAxis(xlCategory, xlPrimary) = False
' 圖表上所存在的座標軸 此座標為 False 下面程式會錯誤
.Axes(xlCategory).MajorTickMark = xlNone
.Axes(xlCategory).TickLabelPosition = xlLow
End With
ActiveSheet.Shapes(oShape.Name).Left = Cells(3, 1).Left ' 設定此圖表實際擺放的 X、Y 座標位置。
ActiveSheet.Shapes(oShape.Name).Top = Cells(3, 1).Top
' 將原本設定之高度調至適度位置
ActiveSheet.Shapes(oShape.Name).Height = Cells(3, 1).Resize(20).Height
ActiveSheet.Shapes(oShape.Name).Width = Cells(3, 1).Resize(, 10).Width
'''*** InvertIfNegative, InvertColor 不適用這圖表的型態
'****由於對圖表的涉獵尚少 所以正在尋找答案中 或請高手相助
'ActiveChart.SeriesCollection(1).InvertIfNegative = True
'ActiveChart.SeriesCollection(1).InvertColor = RGB(32, 178, 208)
' With ActiveChart.SeriesCollection(1).Format.Fill
' .Visible = msoTrue
' .ForeColor.RGB = RGB(255, 69, 0)
' .Transparency = 0
' .Solid
'End With
複製代碼
作者:
c_c_lai
時間:
2012-4-6 19:45
回復
16#
GBKEE
終於可以正常運作了,謝謝您!
唯一不解的是為何 Cells(Lines, 38).Value = ActiveChart.ChartTitle.Text 會有錯誤訊息,真希望能確切了解問題所在。
作者:
c_c_lai
時間:
2012-4-6 20:27
回復
16#
GBKEE
找到答案了
ActiveChart.SetElement (msoElementChartTitleCenteredOverlay) ' 一定要先宣告 SelElement, 否則 ChartTile 執行時會出現執行階段錯誤 '5': 程序呼叫或引述不正確
ActiveChart.ChartTitle.Text = "成交價與成交量"
Cells(3, 38).Value = ActiveChart.ChartTitle.Text
複製代碼
作者:
GBKEE
時間:
2012-4-6 20:43
回復
18#
c_c_lai
2003 沒 SelElement 這屬性
Sub Ex()
With ActiveSheet.ChartObjects(1).Chart
.HasAxis(xlCategory, xlPrimary) = True
.Axes(xlCategory).TickLabels.NumberFormatLocal = "hh:mm"
.Axes(xlCategory).MajorTickMark = xlNone
.Axes(xlCategory).TickLabelPosition = xlLow
'Cells(Lines, 38).Value = .ChartTitle.Text '2003版中 此式有 型態不符合 的錯誤
MsgBox TypeName(Lines)
MsgBox Lines.Count
Cells(Lines.Count + 1, 38).Value = .ChartTitle.Text
End With
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-6 21:57
回復
19#
GBKEE
感謝感謝,實在是獲益良多!
作者:
c_c_lai
時間:
2012-4-18 11:13
回復
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?
謝謝您了!
作者:
GBKEE
時間:
2012-4-19 06:55
回復
21#
c_c_lai
上傳檔案看看
作者:
c_c_lai
時間:
2012-4-19 08:05
回復
22#
GBKEE
該情況需在盤中運作時才觀察得到,因昨日盤中不小心刪掉最後的那張圖表,怕不客觀,所以今天我再觀察看看,
如果仍然一樣我再向您稟告,謝謝您!
作者:
c_c_lai
時間:
2012-4-19 10:39
回復
22#
GBKEE
觀察結果如:
1). 我故意先將游標 Focus 到 AZ2 欄位上,做為方便辨識之用。
[attach]10498[/attach]
2). 接下不去碰觸任何咚咚,觀察齊資料動態處哩,只要它一回寫 getEndRows ,
動作結束後便會自動 Focus 到 "主力、散戶、與成交價、量" 的圖表上。
[attach]10499[/attach]
請教應如何去避免此狀況,而且也不會影響到原本查看的頁面。
謝謝您!
Sub Test()
.
.
.
Call getEndRows("統計圖表")
Call getEndRows("Omega")
.
End Sub
Sub getEndRows(sDraw As String)
Dim oShape As Shape
Dim numChart As Integer
Dim totalRows As Single
numChart = 0
totalRows = Sheets("統計圖表").Range("B" & Rows.Count).End(xlUp).Row ' 傳回 B 欄所使用儲存格之最後一格之列號
Sheets(sDraw).Select
For Each oShape In ActiveSheet.Shapes
If oShape.Type = 3 Then
numChart = numChart + 1
ActiveSheet.ChartObjects(oShape.Name).Activate
Select Case numChart
Case 1
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AA$1:統計圖表!$AA$" & totalRows) ' 圖示會分別顯示出 主力界入
Case 2
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AB$1:統計圖表!$AB$" & totalRows) ' 圖示會分別顯示出 力差
Case 3
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AC$1:統計圖表!$AC$" & totalRows) ' 圖示會分別顯示出 消化力
Case 4
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AD$1:統計圖表!$AD$" & totalRows) ' 圖示會分別顯示出 均差(大戶)
Case 5
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$I$1:統計圖表!$J$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows) ' 圖示會分別顯示出 成交價、主力界入、散戶方向、以及成交量。
Case Else
ActiveChart.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows) ' 圖示會分別顯示出 成交價
End Select
End If
If (sDraw = "Omega" And numChart = 5) Then Exit For
Next
End Sub
複製代碼
作者:
GBKEE
時間:
2012-4-19 11:52
本帖最後由 GBKEE 於 2012-4-19 12:31 編輯
回復
24#
c_c_lai
問題在
ActiveSheet.ChartObjects(oShape.Name).
Activate
Sub getEndRows(sDraw As String)
Dim oShape As Shape
Dim numChart As Integer
Dim totalRows As Single
numChart = 0
totalRows = Sheets("統計圖表").Range("B" & Rows.Count).End(xlUp).Row ' 傳回 B 欄所使用儲存格之最後一格之列號
Sheets(sDraw).Select
For Each oShape In ActiveSheet.Shapes
If oShape.Type = 3 Then
numChart = numChart + 1
With ActiveSheet.ChartObjects(oShape.Name).Chart
Select Case numChart
Case 1
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AA$1:統計圖表!$AA$" & totalRows) ' 圖示會分別顯示出 主力界入
Case 2
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AB$1:統計圖表!$AB$" & totalRows) ' 圖示會分別顯示出 力差
Case 3
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AC$1:統計圖表!$AC$" & totalRows) ' 圖示會分別顯示出 消化力
Case 4
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$AD$1:統計圖表!$AD$" & totalRows) ' 圖示會分別顯示出 均差(大戶)
Case 5
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$I$1:統計圖表!$J$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows) ' 圖示會分別顯示出 成交價、主力界入、散戶方向、以及成交量。
Case Else
.SetSourceData Source:=Range("統計圖表!$B$1:統計圖表!$B$" & totalRows & ", 統計圖表!$F$1:統計圖表!$F$" & totalRows & ", 統計圖表!$V$1:統計圖表!$V$" & totalRows) ' 圖示會分別顯示出 成交價
End Select
End With
End If
If (sDraw = "Omega" And numChart = 5) Then Exit For
Next
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-19 12:07
本帖最後由 c_c_lai 於 2012-4-19 12:18 編輯
回復
25#
GBKEE
如果改成 ActiveSheet.ChartObjects(oShape.Name).Select 可行否?
經實際測試, .Activate = .Select 結果一樣,
應如何修正呢? 如果將它 Mask ' 圖形便走樣了!
作者:
GBKEE
時間:
2012-4-19 12:29
本帖最後由 GBKEE 於 2012-4-19 12:31 編輯
回復
26#
c_c_lai
25# 的 程式碼 你有套用試看看嗎?
經實際測試, .Activate = .Select 結果一樣
,???
With ActiveSheet.ChartObjects(oShape.Name).Chart 並沒有要 Activate OR .Select
作者:
c_c_lai
時間:
2012-4-19 12:44
回復
27#
GBKEE
太棒了!問題終於解決了。
請教您:
使用 With ActiveSheet.ChartObjects(oShape.Name).Chart 與
使用 ActiveSheet.ChartObjects(oShape.Name).Activate
在實務應用面上,其意義上到底有甚麼差別呢? With ActiveSheet.ChartObjects(oShape.Name).Chart
會自行行使 Select 嗎?
作者:
GBKEE
時間:
2012-4-19 14:27
本帖最後由 GBKEE 於 2012-4-19 14:29 編輯
回復
28#
c_c_lai
ActiveSheet.ChartObjects(oShape.Name).Activate
這語法的意思: 將目前的圖表變成作用中的圖表 ,螢幕畫面會轉移到此圖表
With
ActiveSheet.ChartObjects(oShape.Name).Chart
這語法的意思 在一個單一物件或一個使用者自訂型態上執行一系列的陳述式
螢幕畫面不會轉移到此圖表
作者:
c_c_lai
時間:
2012-4-19 15:52
本帖最後由 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 間)
[attach]10509[/attach]
(最後支附件才是)
作者:
c_c_lai
時間:
2012-4-19 17:25
回復
29#
GBKEE
我將此兩頁之畫面附上供參考:
[attach]10513[/attach]
[attach]10515[/attach]
作者:
GBKEE
時間:
2012-4-19 17:48
本帖最後由 GBKEE 於 2012-4-19 17:52 編輯
回復
31#
c_c_lai
對不起 :你的版本較先進 我不易偵錯
只有你導引新增圖表 較簡易的方法, 之後你再依你的需求修改
Sub Ex()
Dim Rng As Range, xi As Integer
With ActiveSheet
.ChartObjects.Delete '圖表全部刪除
For xi = 0 To 4
' Set Rng = .[a1].Offset(, xi * 10) ' 間隔10欄
Set Rng = .[a1].Offset(xi * 15) ' 間隔15列
With .ChartObjects.Add(Rng.Left, Rng.Top, Rng.Resize(, 10).Width, Rng.Resize(10).Height).Chart
' .ChartObjects.Add(Left, Top, Width, Height) '圖表新增( 右邊位置, 上方位置 ,寬度, 高度 )
.SetSourceData Source:=Sheets("統計圖表").UsedRange.Columns(xi + 1), PlotBy:=xlColumns
.HasTitle = True
.ChartTitle.text = "圖表 " & xi + 1
End With
Next
End With
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-20 08:24
回復
32#
GBKEE
我得到了一個心得,那就是當您圖表的資料來源指向非本工作表單時 (例如:要在 A工作表單 繪製統計圖表、而來源資料卻在 B工作表單 ),
於重新在繪製時,時而正常,多時亂序。
但是經多次測試發現最重要的癥結是: 當 A工作表單 內容除了所需選擇按鈕外,無任何資料存在,一切正常。
*** 當 A工作表單 內容除了所需選擇按鈕外,已經存在有其他的任何資料 (如附件之狀況),少少執行正常、多時脫線亂序。
煩請幫忙看看,謝謝您!
[attach]10522[/attach]
[attach]10523[/attach]
[attach]10524[/attach]
作者:
GBKEE
時間:
2012-4-21 10:54
回復
33#
c_c_lai
重新 修改整理 你的 程式碼 , 請將全部的程式碼 複製在同一模組中.
Dim xRow(1 To 6), yCol(1 To 6), cWidth(1 To 6), cHeight(1 To 6), xText(1 To 6)
Dim Chart_Source(1 To 6)
Private Sub 陣列設定(ShName As String)
Dim Rng As Range
xRow(1) = IIf(ShName = "Omega", 4, 1)
xRow(2) = IIf(ShName = "Omega", 18, 16)
xRow(3) = IIf(ShName = "Omega", 4, 1)
xRow(4) = IIf(ShName = "Omega", 18, 16)
xRow(5) = IIf(ShName = "Omega", 4, 1)
xRow(6) = 31
yCol(1) = IIf(ShName = "Omega", 55, 1)
yCol(2) = IIf(ShName = "Omega", 35, 1)
yCol(3) = IIf(ShName = "Omega", 39, 5)
yCol(4) = IIf(ShName = "Omega", 39, 5)
yCol(5) = IIf(ShName = "Omega", 43, 9)
yCol(6) = 1
cWidth(1) = IIf(ShName = "Omega", 209, 222)
cWidth(2) = IIf(ShName = "Omega", 209, 222)
cWidth(3) = 209
cWidth(4) = 209
cWidth(5) = 405
cWidth(6) = 810
cHeight(1) = 240
cHeight(2) = 240
cHeight(3) = 240
cHeight(4) = 240
cHeight(5) = IIf(ShName = "Omega", 485, 488)
cHeight(6) = 480
xText(1) = "主力界入"
xText(2) = "力差"
xText(3) = "消化力"
xText(4) = "均差(大戶)"
xText(5) = "主力、散戶、與成交價、量"
xText(6) = "成交價與成交量"
With Sheets("統計圖表")
Set Rng = .Range("A1").CurrentRegion
Set Chart_Source(1) = Union(Rng.Columns(2), Rng.Columns(27))
Set Chart_Source(2) = Union(Rng.Columns(2), Rng.Columns(28))
Set Chart_Source(3) = Union(Rng.Columns(2), Rng.Columns(29))
Set Chart_Source(4) = Union(Rng.Columns(2), Rng.Columns(30))
Set Chart_Source(5) = Union(Rng.Columns(2), Rng.Columns(6), Rng.Columns(9), Rng.Columns(10), Rng.Columns(22))
Set Chart_Source(6) = Union(Rng.Columns(2), Rng.Columns(6), Rng.Columns(22))
End With
End Sub
Sub 全部重繪() '重繪統計圖表 也是用此程序
製圖程序 Sheets(Array("統計圖表", "Omega"))
End Sub
Sub 重繪Omega()
製圖程序 Sheets(Array("Omega"))
End Sub
Private Sub 製圖程序(xlSh As Sheets) '全部重繪
Dim Sh As Worksheet, xi As Integer
For Each Sh In xlSh '"'Sheets(Array("統計圖表", "Omega"))
Sh.ChartObjects.Delete
陣列設定 Sh.Name
For xi = 1 To IIf(Sh.Name = "Omega", 5, 6)
With Sh.ChartObjects.Add(Sh.Cells(xRow(xi), yCol(xi)).Left, Sh.Cells(xRow(xi), yCol(xi)).Top, cWidth(xi), cHeight(xi)).Chart
.ChartType = IIf(xi >= 5, xlLine, xlColumnStacked) 'xlLine-> 折線圖 'xlColumnStacke-> 堆疊直條圖
.SetSourceData Source:=Chart_Source(xi)
.HasLegend = 0 '圖表的圖例: 不可見
.SeriesCollection(1).AxisGroup = IIf(xi >= 5, 2, 1)
With .Axes(xlCategory) 'X座標軸
.CategoryType = xlCategoryScale
.TickLabels.NumberFormatLocal = "hh:mm"
.MinorTickMark = xlNone
.Border.Weight = xlHairline
.Border.LineStyle = xlNone
.TickLabelPosition = xlLow
.TickLabels.Font.Size = 10
End With
'''''''''''''''''''''''''
If .ChartType = xlColumnStacked Then '堆疊直條圖
.SeriesCollection(1).Shadow = False '圖表中的數列(1)
.SeriesCollection(1).InvertIfNegative = True
With .SeriesCollection(1).Border
.Weight = xlHairline
.LineStyle = xlNone
End With
With .SeriesCollection(1).Interior
.ColorIndex = 5
.PatternColorIndex = 42
.Pattern = xlSolid
End With
Else '折線圖
.HasLegend = True
.Legend.Top = 1
.Legend.Position = xlCorner
.SeriesCollection(1).MarkerStyle = xlNone
With .Legend.Border
.Weight = xlHairline
.LineStyle = xlNone
End With
End If
'''''''''''''''''''''''''''
With .Axes(xlValue).TickLabels.Font 'Y座標軸上刻度的刻度標籤的字體
.FontStyle = "標準"
.Size = 10
End With
.HasTitle = True '圖表的標題 可見
With .ChartTitle '圖表的標題
.Top = 1
.text = xText(xi)
.Font.Size = 14
End With
With .PlotArea ' 圖表的繪圖區
.Top = 1
.Left = 1
.Width = cWidth
.Height = cHeight
.Interior.ColorIndex = xlNone
End With
End With
Next
Next
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-21 11:54
回復
34#
GBKEE
老是打擾您也會感到不好意思的,但不巧的它出現如下的錯誤訊息,它又沒指出是哪裡,只得求助您了!
[attach]10553[/attach]
作者:
GBKEE
時間:
2012-4-21 14:36
本帖最後由 GBKEE 於 2012-4-21 14:37 編輯
回復
35#
c_c_lai
在2003版是沒這問題的 那稍加修改 如下
Sub 全部重繪() '重繪統計圖表 也是用此程序
製圖程序 "統計圖表"
重繪Omega
End Sub
Sub 重繪Omega()
製圖程序 "Omega"
End Sub
Private Sub 製圖程序(xlSh As String) '全部重繪
Dim Sh As Worksheet, xi As Integer
Set Sh = Sheets(xlSh)
Sh.ChartObjects.Delete
陣列設定 Sh.Name
For xi = 1 To IIf(Sh.Name = "Omega", 5, 6)
With Sh.ChartObjects.Add(Sh.Cells(xRow(xi), yCol(xi)).Left, Sh.Cells(xRow(xi), yCol(xi)).Top, cWidth(xi), cHeight(xi)).Chart
.ChartType = IIf(xi >= 5, xlLine, xlColumnStacked) 'xlLine-> 折線圖 'xlColumnStacke-> 堆疊直條圖
.SetSourceData Source:=Chart_Source(xi)
.HasLegend = 0 '圖表的圖例: 不可見
.SeriesCollection(1).AxisGroup = IIf(xi >= 5, 2, 1)
With .Axes(xlCategory) 'X座標軸
.CategoryType = xlCategoryScale
.TickLabels.NumberFormatLocal = "hh:mm"
.MinorTickMark = xlNone
.Border.Weight = xlHairline
.Border.LineStyle = xlNone
.TickLabelPosition = xlLow
.TickLabels.Font.Size = 10
End With
'''''''''''''''''''''''''
If .ChartType = xlColumnStacked Then '堆疊直條圖
.SeriesCollection(1).Shadow = False '圖表中的數列(1)
.SeriesCollection(1).InvertIfNegative = True
With .SeriesCollection(1).Border
.Weight = xlHairline
.LineStyle = xlNone
End With
With .SeriesCollection(1).Interior
.ColorIndex = 5
.PatternColorIndex = 42
.Pattern = xlSolid
End With
Else '折線圖
.HasLegend = True
.Legend.Top = 1
.Legend.Position = xlCorner
.SeriesCollection(1).MarkerStyle = xlNone
With .Legend.Border
.Weight = xlHairline
.LineStyle = xlNone
End With
End If
'''''''''''''''''''''''''''
With .Axes(xlValue).TickLabels.Font 'Y座標軸上刻度的刻度標籤的字體
.FontStyle = "標準"
.Size = 10
End With
.HasTitle = True '圖表的標題 可見
With .ChartTitle '圖表的標題
.Top = 1
.text = xText(xi)
.Font.Size = 14
End With
With .PlotArea ' 圖表的繪圖區
.Top = 1
.Left = 1
.Width = cWidth
.Height = cHeight
.Interior.ColorIndex = xlNone
End With
End With
Next
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-21 15:24
回復
36#
GBKEE
錯誤訊息一樣,發現問題應該是出在 ----> 陣列設定 上。
Dim xRow(1 To 6), yCol(1 To 6), cWidth(1 To 6), cHeight(1 To 6), xText(1 To 6)
Dim Chart_Source(1 To 6)
Private Sub 陣列設定(ShName As String)
Dim Rng As Range
xRow(1) = IIf(ShName = "Omega", 4, 1)
xRow(2) = IIf(ShName = "Omega", 18, 16)
xRow(3) = IIf(ShName = "Omega", 4, 1)
xRow(4) = IIf(ShName = "Omega", 18, 16)
xRow(5) = IIf(ShName = "Omega", 4, 1)
xRow(6) = 31
yCol(1) = IIf(ShName = "Omega", 55, 1)
yCol(2) = IIf(ShName = "Omega", 35, 1)
yCol(3) = IIf(ShName = "Omega", 39, 5)
yCol(4) = IIf(ShName = "Omega", 39, 5)
yCol(5) = IIf(ShName = "Omega", 43, 9)
yCol(6) = 1
cWidth(1) = IIf(ShName = "Omega", 209, 222)
cWidth(2) = IIf(ShName = "Omega", 209, 222)
cWidth(3) = 209
cWidth(4) = 209
cWidth(5) = 405
cWidth(6) = 810
cHeight(1) = 240
cHeight(2) = 240
cHeight(3) = 240
cHeight(4) = 240
cHeight(5) = IIf(ShName = "Omega", 485, 488)
cHeight(6) = 480
xText(1) = "主力界入"
xText(2) = "力差"
xText(3) = "消化力"
xText(4) = "均差(大戶)"
xText(5) = "主力、散戶、與成交價、量"
xText(6) = "成交價與成交量"
With Sheets("統計圖表")
Set Rng = .Range("A1").CurrentRegion
Set Chart_Source(1) = Union(Rng.Columns(2), Rng.Columns(27))
Set Chart_Source(2) = Union(Rng.Columns(2), Rng.Columns(28))
Set Chart_Source(3) = Union(Rng.Columns(2), Rng.Columns(29))
Set Chart_Source(4) = Union(Rng.Columns(2), Rng.Columns(30))
Set Chart_Source(5) = Union(Rng.Columns(2), Rng.Columns(6), Rng.Columns(9), Rng.Columns(10), Rng.Columns(22))
Set Chart_Source(6) = Union(Rng.Columns(2), Rng.Columns(6), Rng.Columns(22))
End With
End Sub
複製代碼
作者:
GBKEE
時間:
2012-4-21 15:37
回復
37#
c_c_lai
上傳你的檔案看看
作者:
c_c_lai
時間:
2012-4-21 15:58
回復
38#
GBKEE
[attach]10562[/attach]
作者:
GBKEE
時間:
2012-4-21 16:12
回復
39#
c_c_lai
奇怪 我執行 Sub 全部重繪() 或 Sub 重繪Omega() 都沒問題阿
請問你是如何執行 Sub 全部重繪() 或 Sub 重繪Omega()
作者:
c_c_lai
時間:
2012-4-21 16:22
回復
40#
GBKEE
[attach]10564[/attach]
作者:
GBKEE
時間:
2012-4-21 16:39
回復
41#
c_c_lai
沒2010版 哪我也沒法度了
作者:
c_c_lai
時間:
2012-4-21 16:59
回復
42#
GBKEE
請教您:
Dim xRow(1 To 6), yCol(1 To 6), cWidth(1 To 6), cHeight(1 To 6), xText(1 To 6)
Dim Chart_Source(1 To 6)
這兩行是在宣告陣列 (Array) 嗎? (1 To 6) ? 一維陣列嗎?
除了這等宣告方式外,還有何種方式表達?
作者:
GBKEE
時間:
2012-4-21 17:39
回復
43#
c_c_lai
Option Explicit
Sub Ex()
Dim xRow(), i As Integer
xRow = Array(1, 2, 3, 4) 'xRow() 是為動態陣列
For i = 0 To 3
MsgBox xRow(i)
Next
End Sub
Sub Ex1()
Dim xRow(4), i As Integer
'xRow(4) 是為靜態陣列
'最小可使用的陣列索引 預設為 0 可用 Option Base {0 | 1} 來改變 是0 或 1
'最大可使用的陣列索引=4
'xRow = Array(1, 2, 3, 4,5) '無法一次給值 ,靜態陣列 須 一一指定值
xRow(0) = 1
xRow(1) = 2
xRow(2) = 3
xRow(3) = 4
xRow(4) = 5
For i = 0 To 4
MsgBox xRow(i)
Next
End Sub
Sub Ex2()
Dim xRow(4 To 8), i As Integer
'xRow(4 to 8) 是為靜態陣列
'設定: 最小可使用的陣列索引 =4 , 最大可使用的陣列索引 = 8
'xRow = Array(1, 2, 3, 4,5) '無法一次給值 ,靜態陣列 須 一一指定值
xRow(4) = 1 '
xRow(5) = 2 '
xRow(6) = 3
xRow(7) = 4
xRow(8) = 5
For i = 4 To 8
MsgBox xRow(i)
Next
End Sub
複製代碼
作者:
c_c_lai
時間:
2012-4-22 13:15
本帖最後由 c_c_lai 於 2012-4-22 13:20 編輯
回復
44#
GBKEE
皇天不辜有心人,終於找到為何型態不符了。
With .PlotArea ' 圖表的繪圖區
.Top = 1
.Left = 1
.Width = cWidth
.Height = cHeight
.Interior.ColorIndex = xlNone
End With
複製代碼
問題出在 cWidth、以及 cHeight 兩個變數的宣告,它們起頭是宣告成 陣列型態的。
所以嘛!
With .PlotArea ' 圖表的繪圖區
.Top = 16
.Left = 1
.Width = cWidth(xi)
.Height = cHeight(xi)
.Interior.ColorIndex = xlNone
End With
複製代碼
如此才對! 雖然是小地方,卻把老命快搞掉了!
如今再把他稍加修飾成我要的需求,我把正確的檔案亦一併附上,
可供有心向學的共修們一同來研習、討論。
[attach]10575[/attach]
[attach]10576[/attach]
差點忘了向您說聲謝謝!
阿里牙豆!
作者:
GBKEE
時間:
2012-4-22 15:02
回復
45#
c_c_lai
這太粗心,還是你細心的找出來,
我查出 2003版 這錯誤:
在圖表: 圖表區, 繪圖區.等 有可指定 Left ,Top, Width ,Height 的地方
都可以接受
這陣列不用索引值
, 會比照 先前使用過的索引值 如下
With Sh.ChartObjects.Add(Sh.Cells(xRow(xi), yCol(xi)).Left, Sh.Cells(xRow(xi), yCol(xi)).Top,
cWidth(xi), cHeight(xi)
).Chart
[attach]10579[/attach]
作者:
c_c_lai
時間:
2012-4-23 11:53
回復
46#
GBKEE
這是這個議題的最後一次提問:
Set Rng = .Range("A1").CurrentRegion
憑我個人的聰明才智,東瞄瞄西敲敲也實在看不出它的實際代表含義,
它在提示甚麼,它扮演的腳色是甚麼? 有何舉足輕重?
每次按 F1 時,其說明真有如聖經,有看沒懂。
謝謝您!
作者:
GBKEE
時間:
2012-4-23 12:20
回復
47#
c_c_lai
CurrentRegion 屬性 ,該物件代表目前的區域。目前區域是指以
任意空白列及空白欄的組合為邊界的範圍
。唯讀。
ActiveCell.CurrentRegion.Select
複製代碼
如圖 四個儲存格任選一個 執行 這程式碼 看看有何變化如何
[attach]10600[/attach]
作者:
cfuxiong
時間:
2012-4-27 19:16
回復
45#
c_c_lai
c_c_lai版大;你好…看了你的Excel圖表只有讚嘆…希望多多發表文章供我們學習…謝謝了~~
作者:
noorudin
時間:
2012-6-8 17:42
就是在這�堹鉧ヮ鴢雃h東西,能人多神人更多
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)