返回列表 上一主題 發帖

[發問] vba的篩選功能 (取消部分篩選)

回復 24# jcchiang

回復 24# jcchiang

兩位好
首先先感謝二位花時間幫我想辦法

至於空間的部分
我重新換個空間
googl
https://drive.google.com/file/d/1VFZMILovCRpQT6AGyaAd8ZNb9VAZSFlO/view?usp=sharing
onedrive
https://1drv.ms/u/s!Amaq2OY73W7WiSHXDt88TA7rsUgC?e=BmwuJh

附件:我有砍東西因為論壇只給1MB,不過用來理解需求應該夠
對戰統計 - 複製.rar (666.38 KB)
  1. Sub ex3()
  2. Dim d As Object, ar As Object, r As Object
  3. Dim i%, AA$, a

  4. Set d = CreateObject("Scripting.Dictionary")
  5. Set ar = [A1].CurrentRegion

  6. For i = 1 To ar.Rows.Count
  7.    AA = Join(Application.Transpose(Application.Transpose(ar(i, 1).Resize(, 102))), ",") & "," & ar(i, 106) '建立判斷條件
  8.    If ar(i, 103) = "" Then ar(i, 103) = 1 '勝場空白填入1
  9.    If Not d.exists(AA) Then   '字典內查無該條件
  10.       d(AA) = ar(i, 1).Resize(, 106) '增加字典資料
  11.    Else
  12.       a = Application.Transpose(Application.Transpose(d(AA)))   '將字典資料取出
  13.       a(103) = a(103) + ar(i, 103) '勝率累加
  14.       a(104) = a(104) + 1           '備註:相符的筆數(不包含第一筆)
  15.       a(105) = a(105) + ar(i, 105) '敗局累加
  16.       d(AA) = a   '將資料放回字典
  17.    End If
  18. Next
  19. [a14000].Resize(d.Count, 106) = Application.Transpose(Application.Transpose(d.items)) '將字典資料列出
  20. For Each r In Range([cw14001], [cw14001].End(4))  '保留勝場+1
  21.    r.Value = r.Value + 1
  22. Next
  23. Set d = Nothing
  24. End Sub
複製代碼
因為加了新英雄所以位置不一樣了
我把程式的數字都往後推,但是看起來是有問題的
應該是因為前面的沒有給圖所以這裡會有問題
(勝跟敗中間有一個備註欄位)




加總後應該優先填在這種列上 DC OR DE OR DK有值 其次是CZ有值

P.S.
在把數值加上去之前有讓程式跑過一遍
不過跟預計的一樣,格子不對所以是有問題的
但發現有幾個想問問可否變更的部分
其一
目前資料已有九千多行,所以其實比對出來資料是否正確我也無法驗證
所以可否將運行完成後的直接產生另一個活頁簿,我直接看兩個活業簿的列數是否有差異
(當然初始驗證運作的時候可以先把固定的資料複製多行再到產生的活頁簿去看相同列是否有加總上去就知道了)
ex.
原始資料(sheet1)9000行,產生的新活頁簿(sheet2)(比對過的資料),變成8800,這樣就可以知道確實有疊上去了
再人工去確認sheet1跟sheet2的差異點就可以確認程式是否正確

其二
執行的時候是否可加上
Application.Calculation = xlCalculationManual '關閉自動計算
Application.ScreenUpdating = False '關閉螢幕刷新
全部結束後再加上
Application.Calculation = xlCalculationAutomatic '開啟自動計算
Application.ScreenUpdating = True '開啟螢幕刷新
避免程式一直重新計算儲存格?
(我目前無法測,因為我也不知道目前的程式到底對不對)

to 軒云熊
抱歉之前我沒自己下回來測過,這次我有下回來測過了,應該可以用了
p.s. 無法解壓也有可能是因為rar版本過舊,可以試看看新版的rar,目前個人版是免費的。

真的沒法下載的話,我把第一列都拍下來了




目前是比對A~CX and DB長一樣
把上述條件一樣的列的CY(勝場) | DA(敗場)  加總填入同一列
至於填入哪一列優先考慮   DC OR DE OR DK有值 其次是CZ有值

jcchiang所理解的條件是對的

TOP

回復 28# jcchiang

你好
先以5格為基準直接執行
經測試,勝率部分不管有沒有重複都會直接+1上去
圖一
(原始資料)
圖二
(產出資料)

勝率這格有問題的樣子
我總共以5格做測試,1~5格複製一份放在下面列中,僅更改星象部分
出來結果是錯誤的
圖三
(原始資料)
圖四
(產出資料)

正確應該為
圖5



另外,之前要修正後資料放進sheet2內本來就是為了比對程式是否執行正確
這次也是多虧了這點才能看出加總的部分不對
而我的第二位置活頁簿其實是有其他資料的,這樣就直接把資料全蓋過去了
可以麻煩改成複製一份當前(sheet)執行程式的副本,然後直接在執行活頁簿中將重複列刪除加總?
(建立副本作為備份,直接在需要運行的活頁簿內做刪除,若無法
我想到的是執行後把目前的sheet1刪除,sheet2改名成sheet1而已)

複製副本的指令可以的話幫我加註解,確認程式都正常運行之後就不需要做副本了
因為副本本來就是為了驗證是否正確執行而存在的
感謝

TOP

回復 27# 軒云熊
你好
直接執行你的附件,勝率的確會增加
以刪除下面幾行,僅複製2~3行做副本,貼在5~6行
執行不會運作(懷疑是因為我空行了)
圖1

並且在你初始的檔案中,執行後並未合併,而是直接加上勝率(場)

圖2
初始

圖3
執行後

正確應該是
圖4

TOP

回復 31# jcchiang

30F的確是我算錯了
力量英雄應該是4

(#23樓:而勝場部份的值則分別為3、空格、1,敗場的值則為1、空格、空格
  算出來合併的勝場欄位應為"6",敗場則為"1"
   算法是這樣的,假設3那格保留,而空格代表勝1場,勝場填入1的實際上是"當列"加"勝1場"
   所以加出來是"6")

第二段的部分你的理解是對的

勝場(3,空,1)=6,如果以空為1,實際也是5,多的1場不就是而外增加的嗎??
這個其實我沒看懂

我這樣看你能不能理解
紀錄出來的當列,本身就代表那次的勝場,當我統計到一模一樣的對戰,就在勝場處+1
所以每一列都代表了1,而勝場是另外加上去的,才會變成處理到該格若該格有值要+1上去
勝率那格若無另外的數值,整列視為1

===================分隔線======================
我拿了你在28F提供的程式碼下去執行
圖1

圖一的第一跟第二列勝率欄位都是0,代表各自當列的勝場,而這兩個結構都一樣
所以運行出來應該是
合併起來,勝率寫1  (實際上是贏2場沒錯,但自己這一列就代表了一場,所以勝率那格只會寫1)
第三行是獨自自己一個,沒有相同列,所以就只有保留,至於勝率因為該格是0,且只有它自己,所以應該留空
我想執行出來的結果
圖2

===============================================
實際執行出來的結果
圖3

我執行的結果出來感覺是,勝率那格無論是空還是1都會被視為1
但實際上應該是該列等於1,勝率那格若有數字,
且該列要被併到另一列的話,就要以該格數字加上自己這一列代表的1

而是勝率那格是空值且無相同列可合併的,保留該列,勝率那格也就還是0
(因為贏的依舊只有一場,而那場就是該列本身)

==============================================
若這樣真的很難被理解的話,我可以改變統計方式
整列不代表任何數字,贏的次數全寫在勝率那裏
這個組合贏一次就寫1,贏兩次就寫2
這樣就不會有要計算本身列為1的問題了

你的整個程式我再研究看看要改哪裡才會符合我的需求
感謝兩位

圖1.png (16.24 KB)

圖1.png

TOP

回復  wei9133

你把 jcchiang前輩的 以下這段改一下 看看 是不是你要的結果

Sub ex3()
Dim d As Ob ...
軒云熊 發表於 2020-10-21 21:56

你好
因為測試完
勝率那格無論是空還是1都會被視為1,但實際上應該是空為1,寫1實際應為2 (要被合併的狀況下)
而不被合併的狀況下空就是空,該格不應有值 (因為該列自己就是1)
所以只註解掉迴圈加1的部分還是沒用的
勝率那格有值的正確了,空的就會有問題,反之亦然
所以你改的這樣還是不太對
感謝你了

TOP

回復  wei9133

#33
有2場一樣(勝率欄為"空","空")合併勝率為1
只有1場(勝率欄為"空")勝率為"空"

幾 ...
jcchiang 發表於 2020-10-22 08:22



   
#33
有2場一樣(勝率欄為"空","空")合併勝率為1
只有1場(勝率欄為"空")勝率為"空"

幾種狀況如何計算
2場(勝率為"3","空")合併勝率??(是否為4)
3場(勝率為"3","空","空")合併勝率??(是否為4)
3場(勝率為"空","空","空")合併勝率??(是否為1)
3場(勝率為"3","1","空")合併勝率??(是否為5)
4場(勝率為"空","3","1","空")合併勝率??(是否為5)
只有一場是否勝率欄位都不變
多場的只要勝率為空的不管幾場都只算1場勝場,其餘勝率欄有值的直接累加值

你好,抱歉現在才回復

2場(勝率為"3","空")合併勝率??  
總共勝5場,合併後勝率欄標記為 4

3場(勝率為"3","空","空")合併勝率??  
總共勝6場,合併後勝率欄標記為 5

3場(勝率為"空","空","空")合併勝率??  
總共勝3場,合併後勝率欄標記為 2

3場(勝率為"3","1","空")合併勝率??     
總共勝7場,合併後勝率欄標記為 6

4場(勝率為"空","3","1","空")合併勝率??
總共勝7場,合併後勝率欄標記為 6

以下追加,看能否理解

僅1列無其他相同者 (該格勝率為 "3")
總共勝4場,合併後勝率欄標記為 3

僅1列無其他相同者 (該格勝率為 "空")
總共勝1場,合併後勝率欄標記為

共2列相同 勝率為 "2","空"
總共勝4場,合併後勝率欄標記為 3

共2列相同 勝率為 "空","空"
總共勝2場,合併後勝率欄標記為 1

共2列相同 勝率為 "2","1"
總共勝5場,合併後勝率欄標記為 4

共3列相同 勝率為 "2","空","1"
總共勝6場,合併後勝率欄標記為 5

共4列相同 勝率為 "7","空","3","空"
總共勝14場,合併後勝率欄標記為 13

以上都是合併完後僅留一列

只有一場是否勝率欄位都不變
沒有2個相同的列勝率欄不變無誤

多場的只要勝率為空的不管幾場都只算1場勝場,其餘勝率欄有值的直接累加值

登記過的一列就是一,後面勝率欄有值就代表登記的當下有2個一樣的組合獲勝
因為登記不見得是同一天,所以才會出現
同樣的列但勝率不同的狀況,這個時候就需要合併
先前就是都手工合併

TOP

回復 37# 准提部林


      
這的確是同一對戰,我目前沒辦法統計到這麼細,所以才會各自填上勝跟敗場
        因為有分我去打跟被打的狀況,我就是統計贏跟輸而已
        一個一個截圖,然後把資料打進excel裡
       
        因為要打的時候會用excel去篩選敵對方條件,然後去打,打贏在勝場+1,打輸在敗場+1
        然後敗場多了再用篩選去找相對的部分,把兩邊的數字換過來
       
        基本上這個紀錄表著重在打贏的部分,比較麻煩的部分在於敵對方有些是課金英雄
        所以會出現僅有幾場勝率但敗率很高的列,這個就沒得反轉了

       
        回到主題
        這張表是拿來參考敵對方出陣時我要出甚麼組合才有較高勝率
       
        組合1--a/b/d/f/h-人類 -- 勝5敗3
        組合2--b/d/e/f/g-人類 -- 勝3敗5
        理論上來講,若攻守雙方組合中沒有含我沒有的課金英雄,我會留存勝率高的那組
        也就是組合1,然後碰到對方出陣組合2就拿組合1去打
       
        但因為有課金英雄存在這個就會複雜很多
        因為我沒有那個英雄,就只能登記組合2
        雖然敗場比勝場高,但是我只有組合2可以出
       
        所以目前只能這樣登記而已

TOP

回復  wei9133

有空幫我看一下 是不是這樣的結果 謝謝

javascript:;
軒云熊 發表於 2020-10-25 01:20



        你好,應該不對
    執行完只贏一場的都被刪掉了
    你幫我看一下#41你是否能夠理解
       
        合併前每列都已經視為1了(勝率無值的狀況)
       
        應該這樣講,勝率無值為1,有值就加上去你把勝率那格內的數字一律+1
        最後把總數加起來-1
        (-1是因為該列自己就是1)
       

        目前有3列一樣 (這裡已經1~102跟106設定為一樣了)
        勝率格分別為
          
        第一列勝率"空" = 這列總共勝1場
        第二列勝率"2"  = 這列總共勝3場
        第三列勝率"空" = 這列總共勝1場
       
    這三列要合併,所以總共是贏了5場
        留下一列,勝場填入4
        (還有一場就是留下的那一列)
       
        ;======================================

        另一個情況
        全部找完就只有這一列,無另一列長得一樣的
        所以變成
       
        第一列勝率"空" = 這列總共勝1場
       
        沒得合併
        留下一列,勝場不填
        (因為本就無值)
       
        ;======================================

        全部找完就只有這一列,無另一列長得一樣的
        所以變成
       
        第一列勝率"3" = 這列總共勝4場
       
        沒得合併
        留下一列,勝場填3
        (留下這一列為1,勝場寫3)
       
        其實勝場應該理解為多贏的次數
       
       
        你們的理解應該都是該列不計數,勝場就是總勝數
        但這樣就不可能出現勝率為空的格子了
        因為每格至少應該都要是1。

        而我在打資料的時候已經把該列視為1了
        出現該列就是勝1場,有再贏再+1在勝場上面
        所以每列的勝場該格的數字數其實未包含自己本身,合併的時候就要把他加上去

TOP

回復  wei9133

1.資料位置放置第二個sheet,請自行修改放置位置
2.勝場計算方式
-->只有1筆資料,勝場都 ...
jcchiang 發表於 2020-10-22 10:24



    你好,這個執行會發生錯誤



勝場計算方式
-->只有1筆資料,勝場都不變動
-->2筆以上資料,所有的"空"都算增加1場,有值的直接累加

有值的應該是該值+1
(因為該列本身就是1)
可以看看#41的枚舉

        你們的理解應該都是該列不計數,勝場就是總勝數
        但這樣就不可能出現勝率為空的格子了
        因為每格至少應該都要是1。


        不過這個問題可以透過我改變統計方式解決,不過上面會發生錯誤的部分要先解決

TOP

回復 49# 准提部林


   
基本概念:
資料表應是"流水表"與"統計表"分開,
1) 流水表: 為所有對戰記錄, 可重覆, 也可累積, 也可將已被統計過的刪除, 減少比對工作及時間,
    勝場為空的, 表示是新記錄, 統計過了填入1, 以免再執行統計時又計一次
2) 統計表: 只留各組合的唯一, 舊組合直接累計, 新組合則新增一筆, 保證不重覆,
    必須有對戰總次數, 及勝場數, 才能換算勝率, 統計完後, 以總對戰數為主,勝率為次排序,
   __過去已有的對戰記錄統計, 須事先手動建立


我目前是這都只做到你寫的第一段,手動執行第二段
(查詢到的時候發現一樣的就把一樣的合併,勝場欄位加總,重複的刪掉)


我也不知對不對? __計算邏輯也還搞不清楚
依表來看, 左方為勝方, 右方為敗方, 但如何知道"我方"是左還是右???
所以, 這表只能統計"勝場數", 而非"勝率"


左邊是敗方,右邊是勝方,不分敵我
查詢的時候將對方出戰角色(需敗方)篩選起來,就可以看右半部的勝方,有哪幾種組合可勝,總共勝了幾場,敗了幾場
然後用右(勝)方的組合去打左(敗)方的組合

的確,CY那欄確切名稱應該叫勝場數,而非勝率。

TOP

        靜思自在 : 待人退一步,愛人寬一寸,就會活得很快樂。
返回列表 上一主題