作者Jerome0511 (Jerome)
看板Office
標題[問題] 迴圈取筆數重複值疑問
時間Wed Jul 24 18:36:03 2019
(若是和其他不同軟體互動之問題 請記得一併填寫)
軟體:EXCEL
版本:2010
目前要寫一段程式,遇到的問題是
當i=1 k =1時 =>j=2 to 26.1 ->25筆資料
i=1 k=2時 =>j=26.1 to 50.2----->需排除=26.1,
但資料等分筆數每個區間要維持25筆
i=1 k=3時 =>j=50.2 to 74.3----->需排除=50.2,
但資料等分筆數每個區間要維持25筆資料
以此類推
這樣在計算平均值的時候,j=26.1 j=50.2這兩個位置會被加總計算一次
i=1 k=1 加總時j=2 到j=26.1的列數加總,最後一筆資料列為j=26.1
i=1 k=2 加總第一筆資料列為j=26.1到50.2
i=1 k=3 加總第一筆為50.2到74.3的列數
1.請問要怎麼避免,計算加總時,避免加總重複計算的列數排除j=26.1和j=50.2?
2.計算迴圈時j=26.1 這個部分在程式中是取26這格
那如果是26.8就會取27這格四捨五入嗎?
請問int取整數是這樣寫吧? Cells(int(j),6)
3.平均迴圈筆數是7.3筆,迴圈計算時是會自動進位用8筆去增加列數,但遇到的問題是
實際情況
第一等份2~9列=>8等份
第二等份10~17列=>8等份
第三等份18~25列=>8等份
第四等份26~33列=>8等份
=>這部份程式計算時由於小數點(7.3*4=29.2進位成30)
程式計算的關係會變成25~32筆,
造成第三等份的第25列與第四等份的25列重複計算了,這部分要怎麼處理呢?
------------------------------------------------------
Start(1) = 2 代表資料在第二列
Start(2) = 243 代表資料在第243列
Start(3) = 501
Start(4) = 763
Start(5) = 1040
Start(6) = 1325
Start(7) = 1614
Start(8) = 1915
Start(9) = 2226
Start(10) = 2543
For i = 1 To 10 ----10群資料
For k = 1 To 5 ----代表每一群資料分成5等分
Sum1 = 0
Sum2 = 0
Count = 0
For j = (Start(i) + (Start(i + 1) - Start(i)) * 0.1 * (k - 1)) - (k > 1) To
(Start(i) + (Start(i + 1) - Start(i)) * 0.1 * k) - ( k > 1)
Sum1 = sum1 + Cells(j, 6)
Sum2 = Sum2 + Cells(j, 7)
Count = Count + 1
Next j
Cells(i + 2, 7 + k) = sum1 / Count
Cells(i + 2, 8 + k) = Sum2 / Count
Next k
Next i
--------------------------------------------------------------
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.54.42 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Office/M.1563964565.A.858.html
1F:→ soyoso: 問題1.所以第二次起(k為2,3,4,5)時,j的第一筆26.1+1(跳到07/24 18:52
2F:→ soyoso: 第二筆)嗎?07/24 18:52
3F:→ soyoso: 如果是的話(...*(k-1)) - (k>1)07/24 18:53
※ 編輯: Jerome0511 (111.71.38.179 臺灣), 07/24/2019 18:56:06
4F:→ soyoso: 問題2,cells內的變數j會四捨五入,cells(26.8,6)取的是儲 07/24 18:57
5F:→ soyoso: 存格f27 07/24 18:57
6F:→ soyoso: 如果要取26的話,配合int取整數 07/24 18:58
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/24/2019 22:52:45
7F:→ Jerome0511: 不好意思,我有詳細描述問題了,再麻煩你謝謝 07/24 22:53
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/24/2019 22:54:44
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/24/2019 22:55:50
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/24/2019 22:57:41
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/24/2019 22:58:16
8F:→ soyoso: 就回文(...*(k-1))-(k>1),j會是27.1和j=51.2來排除26.1和 07/24 23:12
9F:→ soyoso: 50.2 07/24 23:12
10F:→ soyoso: int寫法,如原po內所寫cells(int(j),6) 07/24 23:14
11F:→ Jerome0511: 請問-(K>1)他是怎麼運算方式是什麼? 07/25 09:11
12F:→ Jerome0511: (.. *0.1*(k-1))-(k>1)to(..* 0.1 * k) -(k>1) 前後 07/25 09:12
13F:→ Jerome0511: 都要加-(K>1)才能保持 每一等分相同的筆數吧? 07/25 09:13
14F:→ soyoso: (k>1)為真,在運算後為-1,減-1的話為+1的意思 07/25 09:20
15F:→ soyoso: 迴圈j=26.1到50.2 step沒設,就是每執行一次迴圈就加1 07/25 09:22
16F:→ soyoso: 所以要排除26.1而是從27.1的話,就是我回文寫的 07/25 09:23
17F:→ soyoso: 至於是否前後要加,這要由原po依實際要的去判斷 07/25 09:24
18F:→ soyoso: 我只是依內文要的"排除26.1和50.2"來回文而已 07/25 09:25
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/25/2019 12:04:16
19F:→ Jerome0511: 謝謝,明白了,再多一個問題第3點,再麻煩了 07/25 12:04
20F:→ soyoso: 問題3不太了解,7.3*4=29.2進位成30,程式計算變成25~32 07/25 12:20
21F:→ soyoso: 如何計算? 07/25 12:20
※ 編輯: Jerome0511 (114.42.54.42 臺灣), 07/25/2019 14:24:16
23F:→ soyoso: 所以是執行程序 Computing_every_season_10等分 嗎? 07/25 14:46
24F:→ Jerome0511: 對的 07/25 14:54
25F:→ soyoso: 但測試執行後g3:p5並不同所提供的值 07/25 14:55
27F:→ soyoso: 另外每天都要十等分嗎?因為以10/1來看筆數73,如果每等分 07/25 14:59
28F:→ soyoso: 都8個儲存格來平均的話,那第10等分時就只會有1筆而已 07/25 15:00
30F:→ Jerome0511: 對哦 每天10等份 最後一等份沒關係 1筆也可以 07/25 15:04
31F:→ soyoso: 但我把筆數假設是11好了,那如果roundup平均筆數則會是2 07/25 15:06
32F:→ soyoso: 那7~10等分就不存在了 07/25 15:06
33F:→ soyoso: 或是筆數72,roundup回傳一樣8,那第10筆分也沒有儲存格可 07/25 15:09
34F:→ soyoso: 以平均 07/25 15:09
35F:→ soyoso: 所以這方面平均筆數原po再看看是要幾筆 07/25 15:10
36F:→ soyoso: 1.保持以roundup來取得平均筆數,但這有可以不滿十等分, 07/25 15:19
37F:→ soyoso: 舉例就如上 07/25 15:19
38F:→ soyoso: 2.以int來取平均筆數,多出的筆數,如10/1有73筆,int來取 07/25 15:19
39F:→ soyoso: 平均筆數整數為7,餘3,而這3筆則將第1~3等分各增加1,也 07/25 15:19
40F:→ soyoso: 就是第1~3取8個儲存格,4~10取7個儲存格來平均 07/25 15:19
41F:→ Jerome0511: 用1的方式 07/25 15:20
44F:→ soyoso: 變數s、e和cnt忘了宣告,請自行宣告,看要integer或long再 07/25 15:53
45F:→ soyoso: 依實際情況自行調整 07/25 15:53
47F:→ Jerome0511: 筆數是70筆 10等份為每份7筆,但程式會進位變成8筆 07/25 18:51
48F:→ Jerome0511: 這部分要怎麼排除呢? 07/25 18:51
49F:→ soyoso: 這方面以worksheetfunction.roundup方式排除試試 07/25 19:40
50F:→ soyoso: 或是原本iint內e滅s的部分再多加上減1 07/25 19:51
51F:→ Jerome0511: 在這裡-1 Int((e - s) / 10) 不就全部都會扣掉1嗎? 07/25 23:09
52F:→ soyoso: 是e-s內減,外面還是保留加1的部分 07/25 23:18
53F:→ Jerome0511: Int((e - s - 1) / 10) + 1 這樣嗎?試過了還是會進位 07/25 23:22
54F:→ soyoso: 假設e-s是61~70再減1,就是60~69,除10,取整數就是6 07/25 23:23
55F:→ soyoso: 6+1=7,不就符合是7筆了;那80筆,減1,79/10取整為7+1=8 07/25 23:24
57F:→ soyoso: 當然,start(3)=143,start(4)=216,216-143=73筆 07/25 23:37
58F:→ soyoso: 73筆就會是8,要70筆,start(4)要改為213 07/25 23:38
59F:→ soyoso: 改為213且e-s-1下,檔案內紅字上下是可以相同的 07/25 23:42
61F:→ Jerome0511: 謝謝你 可以了 07/28 12:02