iT邦幫忙

1

VBA核取方塊(CheckBox)複選問題

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20220125/20109231PeAA9DUEqj.png

功能說明:
目前已設計可依勾選條件顯示對應欄位,如未勾選則隱藏該欄位,如取消全選則顯示所有欄位。

問題:

  1. 目前左方藍框選項,均可依條件顯示、隱藏,但欲加入左方紅框年份時,卻想不出該如何設計並互相影響。
    例如:勾選「目標+達成率+2020年」時,B:SK欄僅顯示2021年(1-12月)+目標+達成率欄位,其餘隱藏。
       勾選「實績+來客數+客單價+2020年+2021年」時,B:SK欄僅顯示2020年(1-12月)+2021年(1-12月)+實績+來客數+客單價欄位,其餘隱藏。

  2. 顯示、隱藏欄位功能需依勾選、取消勾選即時呈現。

以上請求大大解惑~~~~pls

測試檔https://drive.google.com/file/d/1pzCy7KmIpttYdWJhf61_EA7egCPP0rj1/view?usp=sharing

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-01-25 16:39:20
最佳解答

沒有實測過
看看合不合用

Sub ShowHide()
    Dim arrCategory(), arrYear() As String
    Dim nIdx As Integer
    
    '1.收集有勾選的類別存成一個陣列
    nIdx = 0
    If checkbox1.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrCategory(nIdx)
        arrCategory(nIdx) = "目標"
    End If
    If checkbox2.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrCategory(nIdx)
        arrCategory(nIdx) = "實績"
    End If
    If checkbox13.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrCategory(nIdx)
        arrCategory(nIdx) = "外送佔比"
    End If

    '2.收集有勾選的 年份 存成一個陣列
    nIdx = 0
    If checkbox14.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrYear(nIdx)
        arrYear(nIdx) = "2019"
    End If
    If checkbox15.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrYear(nIdx)
        arrYear(nIdx) = "2020"
    End If
    If checkbox16.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrYear(nIdx)
        arrYear(nIdx) = "2021"
    End If
    If checkbox17.Value = True Then
        nIdx = nIdx + 1
        ReDim Preserve arrYear(nIdx)
        arrYear(nIdx) = "2022"
    End If
    
    '3.比較 類別 與 年份,都有在陣列裡的就顯示,否則就隱藏
    Set Rng = Range("B1", "SK1")
    For Each x In Rng
        If IsInArray(x.Offset(1, 0), arrCategory) And IsInArray(Left(x.Value, 4), arrYear) Then
            Cells(x.Column, x.Column).EntireColumn.Hidden = False
        Else
            Cells(x.Column, x.Column).EntireColumn.Hidden = True
        End If
    Next
End Sub
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False

End Function
看更多先前的回應...收起先前的回應...

https://ithelp.ithome.com.tw/upload/images/20220125/20109231PnuoT2sEUX.png

海大~會出現異常

更正了

https://ithelp.ithome.com.tw/upload/images/20220125/20109231piCipcx2dk.png

這次是物件不支援此屬性或方法~~~

又改了

海大實測已解決問題,非常感謝幫忙喔~~~

1
blanksoul12
iT邦研究生 5 級 ‧ 2022-01-25 10:40:21

是不是應該每一個 CHECKBOX CLICK ACTION 也要把所有東西顯示回來先才再跟據所有 CHECKBOX 情況再做動作呢?
如果你不想 EXCEL 閃來閃去,便下個 SCREENUPDATE = FALSE 試試吧.

我有測試過 先顯示所有欄位 > 再隱藏非勾選欄位,但會遇到一個問題是如果先勾選「目標」,其他非目標欄位都會隱藏,但接著再勾選「實績」時,原勾選的「目標」反而也會被隱藏,因為第二個條件覆蓋了第一個條件。所以~~~我才會反過來做,醬反而才達成了我的需求

blanksoul12 iT邦研究生 5 級 ‧ 2022-01-25 16:43:28 檢舉

這沒法吧,你這是多條件查找,不是單一條件查找,先搞清楚你要多條件符合還是單一條件符合啊.
和你做 FILTER 一樣,每個 ITEM 點選後,只會顯示那個符合,但你一個點其他的選項後,得出來的結果只會越來越少

應該說我需要每個項目可單選或複選,勾選時變更條件,取消勾選時恢復變動,所以上下選項都可能放勾選

我要發表回答

立即登入回答