• 2

請問 Excel VBA 的 範圍複製問題效能改寫建議

問題一

Excel vba 只要copy一個範圍的值就好 有哪些寫法?
Range("B2:AE2").Copy Range("B" & xlocation & ":AE" & xlocation)
若不需要格式等資料只要copy 值就好 要怎麼寫呢?
可以用cells
或是陣列的方式改寫嗎?
謝謝


問題二
請問這個Excel VBA 要怎麼改寫 才能增加執行效率呢?

Sub runmen()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim xlocation As Integer
xlocation = Cells(1, 1)


Dim aoutmoney, xoutmoney, zoutmoney As Integer
aoutmoney = Cells(5, 5)
xoutmoney = Cells(6, 5)
zoutmoney = Cells(7, 5)







'以上參數範圍定義'
'''''''''''''''''''我是分隔線''''''''''''''''''''''''''''''''
'以下跑回圈 跑盈虧等屬性報表



For ioutmoney = aoutmoney To zoutmoney Step xoutmoney
Cells(2, 5) = ioutmoney

Application.Calculation = xlCalculationAutomatic

Range("B2:AE2").Copy
Cells(xlocation, 2).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Application.Calculation = xlCalculationManual

xlocation = xlocation + 1

Next ioutmoney



Application.Calculation = xlCalculationAutomatic

End Sub
2016-07-27 22:39 發佈
dazzcarr wrote:
問題一



問題一

Cells(xlocation, 2).Resize(1, Range("B2:AE2").Count) = Range("B2:AE2").Value

問題二
Sub runmen()
Application.ScreenUpdating = False
Dim xlocation As Integer
xlocation = Cells(1, 1)

Dim aoutmoney, xoutmoney, zoutmoney As Integer
aoutmoney = Cells(5, 5)
xoutmoney = Cells(6, 5)
zoutmoney = Cells(7, 5)

'以上參數範圍定義'
'''''''''''''''''''我是分隔線''''''''''''''''''''''''''''''''
'以下跑回圈 跑盈虧等屬性報表
For ioutmoney = aoutmoney To zoutmoney Step xoutmoney
Cells(2, 5) = ioutmoney
Cells(xlocation, 2).Resize(1, Range("B2:AE2").Count) = Range("B2:AE2").Value
xlocation = xlocation + 1
Next ioutmoney
Application.ScreenUpdating = True

End Sub

只剩 Range("B2:AE2") 要計算
所以就把 Application.Calculation = xlCalculationManual 拿掉了
效率應該有好一點... 試試看
To YS2000

謝謝您的幫忙

不過用您的語法

儲存格有時候數據會沒有更新

怎麼會這樣呢?

我是i3-3310的筆電

需要加其他程式碼嗎? Doevents甚麼的?

dazzcarr wrote:
To YS2000...(恕刪)

1.先檢查公式必須是自動計算狀態下,Range("B2:AE2")的值才會更新


2.可能 Range("B2:AE2")內的公式太複雜,計算速度趕不上貼的速度
在 Cells(2, 5) = ioutmoney 後加 Doevents 看看
---
Cells(2, 5) = ioutmoney
Doevents
Cells(xlocation, 2).Resize(1, Range("B2:AE2").Count) = Range("B2:AE2").Value
---
3.如果前面都不行,就只好把公式也複製過去,就不會發生來不及計算,不過可能會跑久一點

Sub runmen()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim xlocation As Integer
xlocation = Cells(1, 1)

Dim aoutmoney, xoutmoney, zoutmoney As Integer
aoutmoney = Cells(5, 5)
xoutmoney = Cells(6, 5)
zoutmoney = Cells(7, 5)

'以上參數範圍定義'
'''''''''''''''''''我是分隔線''''''''''''''''''''''''''''''''
'以下跑回圈 跑盈虧等屬性報表
For ioutmoney = aoutmoney To zoutmoney Step xoutmoney
Cells(2, 5) = ioutmoney
Cells(xlocation, 2).Resize(1, Range("B2:AE2").Count) = Range("B2:AE2").FormulaR1C1
xlocation = xlocation + 1
Next ioutmoney
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

試試看
謝謝

出錯率降低

但仍有機會出錯

我還是用

Range("B2:AE2").Copy
Cells(xlocation, 2).PasteSpecial xlPasteValues

就好了

謝謝
建議您把檔案上傳
(需內含資料,如有隱私問題,請先改成假數據)

這樣比較方便,那些熱心回答的高手們檢查
有時候影響效率的不是程式碼
檔案在這裡

https://drive.google.com/file/d/0B6dmbh4cheCxZEY1YWpteVl5djA/view?usp=sharing

大家可以下載嗎?

麻煩大家了

小弟不是科班的

亂寫一通 見笑了
dazzcarr wrote:
檔案在這裡https...(恕刪)


大概看一下,您的問題不在複製貼上,原因就如 ys2000這位高手所說的
YS2000 wrote:
2.可能 Range("B2:AE2")內的公式太複雜,計算速度趕不上貼的速度...(恕刪)



您的 run 工作表中的 b2:ae2 ,要從(母體、明細、績效圖、結算價)工作表取資料

而這些工作表中又要用到公式計算,您把複製那幾行先取消,程式跑一遍就知道了
效能差的原因就是因為 b2:ae2 取資料太慢


要改善的話

一、把(母體、明細、績效圖、結算價)工作表的內容,在程式一開始就先丟到2維陣列
可以一個一個試,建議先從母體,雖然有公式,但內容單純幾乎都是歷史資料,沒什麼變動

二、b2:ae2的內容(公式不需改變)
資料的取得,不要從工作表複製,全部用2維陣列在程式中計算

三、最後等迴圈跑完後,再從2維陣列中,一次把資料複製=>貼上

雖然說的很簡單,不過要這樣作是大工程喔…加油


ps. 這程式您寫的嗎?? 其實這行 => Dim xlocation As Integer,一開始就定義錯誤,不改的話會造成溢位錯誤
謝謝 snare 大大

全部都是小弟自己亂寫的

xlocation是一個1~19999的正整數

或是是一個1~99999的正整數

該怎麼宣告才好呢?

甚麼是溢位?會拖慢速度嗎?


甚麼是二微陣列?哪邊有範例嗎?
dazzcarr wrote:
該怎麼宣告才好呢?

甚麼是溢位?會拖慢速度嗎?


甚麼是二微陣列?哪邊有範例嗎?
...(恕刪)


一、as long 或 as double 都可以

二、as integer 範圍 -32768~32767,數值超出就會溢位,程式直接中斷跳出錯誤

三、是2"維"陣列,請直接google
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?