返回列表 上一主題 發帖

[發問] 選擇下拉式清單自動填入

本帖最後由 Andy2483 於 2023-4-10 09:40 編輯

回復 1# bhsm


    謝謝論壇,謝謝前輩發表此主題與範例
後學藉此帖練習字典與觸發,學習方案如下,請前輩參考

執行前:


[F4]輸入7 執行結果:



Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   If .Address = "$E$4" Or .Address = "$F$4" Then
      Dim Y, i%, j%, T$, S
      Set Y = CreateObject("Scripting.Dictionary")
      For i = 4 To 5
         For j = 4 To 6
            T = Cells(i, 2) & "|" & Cells(j, 3)
            S = Cells(i + j + (3 ^ (i - 4)), 6)
            If Not Y.Exists(T) Then
               Y(T) = S
               ElseIf Y(T) <> S Then
                  Y(T) = "無法辨識"
            End If
         Next
      Next
      [F5] = Y([E4] & "|" & [F4])
      If [F5] = "無法辨識" Then MsgBox "排列組合子重複無法辨識"
      Set Y = Nothing
   End If
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 7# bhsm


    謝謝前輩回復
後學藉此帖練習公式,學習方案如下,請前輩參考

F9~F14公式:
=IFERROR(IF(E$4=INDIRECT("B"&(INT(ROW()/12)+4)),E$4,"")+IF(F$4=INDIRECT("C"&MOD(ROW(),3)+4),F$4,""),"")



PS:5樓方案的VBA程式碼需刪除
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-4-10 15:15 編輯

回復 9# bhsm

如果希望改變E4或F4時之前的數值也要保留該如何處理?
例如:E4=5、F4=9則F9=14,但如果更改E4=10,F4=7時,希望F9=14被保留不被清除掉,同時顯示F9=14.F13=17------

    謝謝前輩再回復
後學藉此帖研究VBA方案如下,請前輩參考

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   If .Address = "$E$4" Or .Address = "$F$4" Then
      Dim Y, i%, j%, T$, S, Brr
      Set Y = CreateObject("Scripting.Dictionary")
      Brr = [F9].Resize(6, 1)
      For i = 4 To 5
         For j = 4 To 6
            T = Cells(i, 2) & "|" & Cells(j, 3)
            S = Val(Cells(i, 2)) + Val(Cells(j, 3))
            N = N + 1: Y(T) = S
            If T = [E4] & "|" & [F4] Then Brr(N, 1) = Y(T)
         Next
      Next
      [F9].Resize(6, 1) = Brr
      Set Y = Nothing: Erase Brr
   End If
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-4-10 16:27 編輯

回復 11# bhsm

謝謝前輩,以下心得註解請參考
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'↑當使用者或外部連結變更工作表中的儲存格時會發生此事件
With Target
'↑以下是關於觸發事件的程序
   If .Address = "$E$4" Or .Address = "$F$4" Then
   '↑如果觸發儲存格是[E4] 或[F4]的位址
      Dim Y, S, Brr, i%, j%, T$, N&
      '↑宣告變數:(Y,S,Brr)是通用型變數,(i,j)是短整數,T是字串變數
      'N是長整數

      Set Y = CreateObject("Scripting.Dictionary")
      '↑令Y這通用型變數是 字典
      Brr = [F9].Resize(6, 1)
      '↑令Brr這通用型變數是 二維陣列,以[F9]向下擴展6格的儲存格值帶入
      For i = 4 To 5
      '↑設順迴圈!i從4到 5
         For j = 4 To 6
         '↑設順迴圈!j從4到 6
            T = Cells(i, 2) & "|" & Cells(j, 3)
            '↑令T這字串變數是 i迴圈列B欄儲存格值連接 "|",
            '再連接 j迴圈列C欄儲存格值之後的新字串

            S = Val(Cells(i, 2)) + Val(Cells(j, 3))
            '↑令S這通用型變數是 i迴圈列B欄儲存格值轉化為數字值,
            '加上j迴圈列C欄儲存格值轉化為數字值之後的新數值

            N = N + 1: Y(T) = S
            '↑令N這長整數變數 累加1
            '令以T變數為key,item是S變數,納入Y字典

            If T = [E4] & "|" & [F4] Then Brr(N, 1) = Y(T)
            '↑如果T變數(字串)同
            '[E4]儲存格值連接"|" 再連接[F4]儲存格值組成的新字串??
            '就令N變數列第1欄Brr陣列值是 以T變數查Y字典的item值

         Next
      Next
      [F9].Resize(6, 1) = Brr
      '↑[F9]向下擴展6格的儲存格值以 Brr陣列值帶入
      Set Y = Nothing: Erase Brr
      '↑釋放變數
   End If
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 13# bhsm


    謝謝前輩不嫌棄,請前輩常上論壇一起學習
祝 順心常樂
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 15# bhsm


    謝謝前輩
1.若不同主題,請另發主題給前輩們幫忙
2.下午剛接到一份急趕的工作需立馬處理,再撥空研究前輩的範例
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 15# bhsm


    謝謝前輩
以下是學習方案,請前輩參考

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   If .Address = "$F$3" Or .Address = "$H$3" Then
      If [G7] = "" Then
         [G7] = [G4]
         Else
            [G65536].End(3).Item(2) = [G4]
      End If
   End If
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 19# bhsm


    謝謝論壇,謝謝各位前輩,謝謝前輩再回復
後學接到的工作很快就完成了,學習了陣列與字典,程式設計的邏輯更清楚,工作效率提升多倍,
設計的程式執行的效率提升上百倍,以前執行30分鐘,現在只要10秒鐘
勤練習是很重要的,謝謝前輩一起上論壇學習

Private Sub Worksheet_Change(ByVal Target As Range)
'↑當使用者或外部連結變更工作表中的儲存格時會發生此事件
With Target
'↑以下是關於觸發事件的程序
   If .Address = "$F$3" Or .Address = "$H$3" Then
    '↑如果觸發儲存格是[F3] 或[H3]的位址
      If [G7] = "" Then
      '↑如果[G7]儲存格值是空字元
         [G7] = [G4]
         '↑令[G7]儲存格值是 [G4]儲存格值
         Else
            [G65536].End(3).Item(2) = [G4]
            '↑否則令G欄最後一個有內容儲存格的下方一格值是 [G4]儲存格值
      End If
   End If
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 21# bhsm


        謝謝前輩回復
邏輯是可以訓練的,例如 厚臉皮的學生 就很笨學了十幾年還很認真的學,不放棄
這麼優質的學習平台怎捨得讓 真的”不會就是不會”成為事實呢?
一天進步一點點就可以了
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-4-24 08:36 編輯

回復 23# 准提部林


    謝謝論壇,謝謝前輩指導
後學學習心得如下,請前輩再指導

'利用 index 值填充//
https://learn.microsoft.com/zh-t ... sheetfunction.index
Private Sub Worksheet_Change(ByVal Target As Range)
'↑當使用者或外部連結變更工作表中的儲存格時會發生此事件。
Dim j%, k%
'↑宣告變數:(j,k)是短整數
With Target
'↑以下是關於觸發的程序
     If .Address <> "$E$4" And .Address <> "$F$4" Then Exit Sub
     '↑如果觸發格的位址不是 "$E$4"而且也不是 "$F$4" 就結束程式執行
     j = Abs(([e4] = [b4]) + ([e4] = [b5]) * 4)
     '↑令j這短整數是 絕對值(布林值 + 布林值 *4)
     '如果[e4] = [b4] 其布林值是1,再如果[e4] = [b5]布林值是0*4=0 ,結果值是1
     '如果[e4] = [b4] 其布林值是0,再如果[e4] = [b5]布林值是1*4=4 ,結果值是4

     k = Abs(([f4] = [c4]) + ([f4] = [c5]) * 2 + ([f4] = [c6]) * 3)
     '↑令k這短整數是 絕對值(布林值 + 布林值 *2)+(布林值 *3)
     '[f4]=[c4]_其布林值是1,[f4]=[c5]_布林值是0*2=0,[f4]=[c6]是0*3=0,結果值是1
     '[f4]=[c4]_其布林值是0,[f4]=[c5]_布林值是1*2=2,[f4]=[c6]是0*3=0,結果值是2
     '[f4]=[c4]_其布林值是0,[f4]=[c5]_布林值是0*2=0,[f4]=[c6]是1*3=3,結果值是3

     If j * k Then [f9].Cells(j + k - 1) = [f5]
     '↑如果j變數*k變數不是 0,就令[f9]相對位置儲存格值是 [f5]
End With
End Sub
絕對值括弧裡的值看起來都是正數,雖然尚不了解為何要加Abs,後學如果知道了會回來補充
謝謝前輩
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 不要隨心所欲,要隨心教育自己。
返回列表 上一主題