標題:
[發問]
●(發問)大量資料連續新增欄位去計算的值的問題
[打印本頁]
作者:
yagami12th
時間:
2012-1-7 16:03
標題:
●(發問)大量資料連續新增欄位去計算的值的問題
本帖最後由 yagami12th 於 2012-1-8 12:05 編輯
一直無法夾帶檔案貼到文章裡面,試了好幾次,有人知道原因嗎
請教一個大量資料連續新增欄位計算的問題,在GBKEE大的幫忙下,數據分類好了之後,資料狀況如圖1到圖4所示:
分類好的數據附檔如下:
[attach]9139[/attach]
資料說明:
我們以2011/1月為例,裡面有2011_01_c跟2011_01_p兩個資料夾,這兩個資料夾裡面
分別有34個excel檔案
,在
2011_01_c
裡頭有2011_01_6900_c.xls到2011_01_10400_c.xls(共34個檔案),
2011_01_p
的資料夾裡也是一樣有34個excel檔(同2011_01_c)
如圖1到圖4所示:
圖一:
圖二:
圖三:
圖四:
-------------------------------------------------------------------------------------------
以
2011_01_c
裡頭的
2011_01_6900_c.xls
為例:
步驟1(要計算的東西):
我先在o1欄位新增字串"高價減低價"之後o2計算公式為g2-h2,計算完畢往下複製
再到p1欄位新增字串"成交量變化"(因為要算變化量,所以從p3欄開始才有計算結果,p2欄為空白),p3欄=j3-j2之後往下複製
完成存檔,關閉檔案,再開2011_01_7000_c.xls,同樣在o1欄新增字串"高價減低價"跟p1欄新增字串"成交量變化",之後的計算同上,
完成存檔,關閉檔案,再開2011_01_7100_c.xls,一直做到2011_01_10400_c.xls(2011_01資料夾裡的最後一個檔案),結束。
步驟2:
接著開2011_01_p資料夾,再計算
2011_01_6900_p.xls
到2011_01_10400_p.xls(計算方式同上),結束。
步驟3:
由於2011_01裡的2011_01_c(裡頭34個excel在上面已計算完畢),2011_01_p(裡頭34個excel在上面也已計算完畢),結束
接著開2011_02的資料,再計算完
2011_02_c
跟
2011_02_p
的資料夾裡面的
各30幾個excel檔
,存檔完畢後,
再接著做2011_03的資料一直做到2011_12(要計算的東西同步驟1)
----------------------------------------------------------------------------------------------
步驟1 計算結果的範例(數字是隨便打的,因為排版一直無法完成:(只要計算最右邊兩個欄位的資料)(註:加註顏色會跑掉排版所以沒加註顏色)
| A1 |-----| F1 | 最高價(F1) | 最低價(G1) | H1 |成交量(J1) |
高價減低價(O1)
|
成交量變化(P1)
|
|2010/12/16 |-----| F2 | 100 | 20 | H2 |2000 | 80 | |
|2010/12/17 |-----| F3 | 200 | 10 | H2 |11000 | 190 | 9000 |
..
..
2010/1/19
---------------------------------------------------------------------------------------
補充說明,圖五:
[attach]9122[/attach]
------------------------------------------------------------------------------------------------
我用巨集錄製的檔案,儲存格的指定方式用錄的會變的怪怪的,因為資料比較多,所以想向各位請教,先謝謝了。
程式碼如下:
Sub 巨集1()
ChDir "C:\Users\user\Desktop\選擇權資料,按年份月份整理\2011選擇權整理完畢\2011_01\2011_01_C"
Workbooks.Open Filename:= _
"C:\Users\user\Desktop\選擇權資料,按年份月份整理\2011選擇權整理完畢\2011_01\2011_01_C\2011_01_6900_C.xlsx" '這裡是開啟指定的檔案
Range("O1").Select '是指在Range(a1)的欄位貼上嗎?不太確定
With Selection '從這行到第13行都看不懂,但感覺不太重要
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "高價減低價" '在英文字母 O1欄位(不是零1)輸入字串"高價減低價",不知道為什麼會變成R1C1這種指定格式,用cell(1,15)比較容易理解
Range("O2").Select '點選O2(英文字母O2)欄位
ActiveCell.FormulaR1C1 = "=RC[-8]-RC[-7]" '然後在O2欄位=g2-h2
Range("O2").Select
Selection.AutoFill Destination:=Range("O2:O26") '算好結果複製到O2到O26
Range("O2:O26").Select
Range("P1").Select '再點選P1欄位
With Selection '從這行到 .MergeCells=Flase 看不懂
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "成交量變化" '在英文字母 p2欄位輸入字串"成交量變化",不知道為什麼會變成R1C1這種指定格式,用cell(1,16)比較容易理解
Range("P3").Select
ActiveCell.FormulaR1C1 = "=RC[-6]-R[-1]C[-6]" '在p3格位輸入公式=j3-j2
Range("P3").Select '停在p3欄位
Selection.AutoFill Destination:=Range("P3:P26") '將p3格位計算結果複製到p26欄位
Range("P3:P26").Select '視窗框在p3:p26停住
ActiveWorkbook.Save '存檔
ActiveWindow.Close '關檔
Workbooks.Open Filename:= _
"C:\Users\user\Desktop\選擇權資料,按年份月份整理\2011選擇權整理完畢\2011_01\2011_01_C\2011_01_7000_C.xlsx" '繼續開2011_01_7000_C.xlsx的檔案,同上所述,繼續做
Range("O1").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "高價減低價"
Range("O2").Select
ActiveCell.FormulaR1C1 = "=RC[-8]-RC[-7]"
Range("O2").Select
Selection.AutoFill Destination:=Range("O2:O26")
Range("O2:O26").Select
Range("P1").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "成交量變化"
Range("P3").Select
ActiveCell.FormulaR1C1 = "=RC[-6]-R[-1]C[-6]"
Range("P3").Select
Selection.AutoFill Destination:=Range("P3:P26")
Range("P3:P26").Select
ActiveWorkbook.Save
ActiveWindow.Close
End Sub
作者:
GBKEE
時間:
2012-1-8 13:13
本帖最後由 GBKEE 於 2012-1-8 13:16 編輯
回復
1#
yagami12th
-> 用你這裡發文的檔案 執行此程式
Const ThePath = "d:\You\" '指定存放的主資料夾
Sub Ex()
Dim d As Object, SavePath As String, Sh As Worksheet, R As Variant, E As Variant, Newbook As Workbook
Dim MonPath As String, 選擇權 As String, 履約價 As String
Application.DisplayAlerts = False '停止系統 的提示
Application.ScreenUpdating = False '停止螢幕更新功能
Set d = CreateObject("scripting.Dictionary") '建立字典物件
SavePath = Dir(ThePath, 16) '傳回指定存放的主資料夾
If SavePath = "" Then MkDir (ThePath) '如主資料夾不存在 建立它
For Each Sh In Sheets
d.RemoveAll '字典物件 清空子物件
With Sh '依序處裡 每一工作表
For Each R In .Range(.[D2], .[D2].End(xlDown)) '每一工作表中在d欄
d(R.Value) = "" '字典物件 設立子物件(履約價)
Next
MonPath = Mid(.[c2], 1, 4) & "_" & Mid(.[c2], 5) '月資料夾
SavePath = Dir(ThePath & MonPath, 16) '尋找月資料夾
If SavePath = "" Then MkDir (ThePath & MonPath) '如月資料夾不存在 建立它
For Each E In Array("買權", "賣權") '依選擇權
選擇權 = "\" & MonPath & IIf(E = "買權", "_C\", "_P\") '月資料夾\選擇權資料夾
SavePath = Dir(ThePath & MonPath & 選擇權, 16)
If SavePath = "" Then MkDir (ThePath & MonPath & 選擇權)
For Each R In d.KEYS '字典物件 依序處裡子物件 R (履約價)
.AutoFilterMode = False '工作表中取消自動篩選
.Range("A1").AutoFilter Field:=4, Criteria1:=R
.Range("A1").AutoFilter Field:=5, Criteria1:=E
'AutoFilter 方法[自動篩選] 篩選出一個清單。
'Field:=4 第4欄 (履約價) ,Criteria1:=R 準則=R (履約價)
'Field:=5 第5欄 (選擇權) ,Criteria1:=E 準則=E (選擇權)
履約價 = Mid(.[c2], 1, 4) & "_" & Mid(.[c2], 5) & "_" & R & IIf(E = "買權", "_C", "_P")
SavePath = ThePath & MonPath & 選擇權 & 履約價 '存檔的完整路徑名稱
Set Newbook = Workbooks.Add(1) '新開檔案(1頁)
.UsedRange.SpecialCells(xlCellTypeConstants).Copy Newbook.Sheets(1).[a1]
'自動篩選的資料 複製到新開檔案第1頁的.[a1]
With Newbook.Sheets(1)
.[O1] = "高價減低價"
.[P1] = "成交量變化"
With .[O2].Resize(.UsedRange.Columns(1).Rows.Count - 1) '在這範圍
.Cells = "=RC[-8]-RC[-7]" '然後在O2欄位=g2-h2: 制訂公式
.Value = .Value '取值 -> 消除公式
End With
With .[P3].Resize(.UsedRange.Columns(1).Rows.Count - 2)
.Cells = "=RC[-6]-R[-1]C[-6]" '在p3格位輸入公式=j3-j2
.Value = .Value
End With
End With
Newbook.Close True, SavePath '新開檔案關閉 存檔
Next
Next
.AutoFilterMode = False '離開工作表恢復原狀
End With
Next
Application.DisplayAlerts = True '恢復系統的提示
Application.ScreenUpdating = True '螢幕更新功能是開啟的則為 True。
MsgBox "工作完成"
End Sub
複製代碼
作者:
yagami12th
時間:
2012-1-8 14:24
回復
2#
GBKEE
謝謝GBKEE大
,
發現我只會簡單的判斷式跟簡單的迴圈(如在版上發的"銷售管理範例"),跟一些版大分享的小技巧,還有錄製好巨集再回去編輯,再簡化成一層迴圈,不知道為什麼?看到兩層以上的迴圈就會開始不懂,兩層以上涵數應用也是同樣的情況。
想請教像字典元件一些用在大量資料篩選跟整理的一些進階程式碼,我從圖書館借來的書沒有這個部份,想請教GBKEE大有什麼推薦的教學跟書嗎?
如果想像大大程式一樣這麼強的話,能不能請大大分享一些學習的經驗。
作者:
GBKEE
時間:
2012-1-8 15:23
回復
3#
yagami12th
台語俚語 : 戲棚下站久是你的
我沒什麼經驗,功力是在這裡練習的 (多看多問多練習)
Sub Ex()
Dim D As Object, AR(), E As Variant
Set D = CreateObject("SCRIPTING.DICTIONARY")
AR = Array("AA", "BB", "CC", "DD")
For Each E In AR
D(Mid(E, 1, 1)) = E
Next
For Each E In D.KEYS
MsgBox E
Next
MsgBox Join(D.KEYS, ":")
For Each E In D.ItemS
MsgBox E
Next
MsgBox Join(D.ItemS, ":")
End Sub
複製代碼
[attach]9145[/attach]
作者:
yagami12th
時間:
2012-1-8 16:22
回復
4#
GBKEE
謝謝GBKEE大 ,找到幾個影片教學,先來練看看,小弟沒灌VB,要找人看看有沒有光碟。
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)