返回列表 上一主題 發帖

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

回復 12# Andy2483
感謝Andy2483大不厭其煩的指導,後進會好好拜讀消化,有問題再請教您,感恩
年齡不小,但我很想學

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

回復 10# Andy2483
衷心感謝Andy2483大的指導,正是小弟想要的,不知您是否有空可在您的程式碼中加入中文說明?讓小弟學習,謝謝
年齡不小,但我很想學

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

回復 8# Andy2483
謝謝Andy2483大的指導,可以用了,但如果希望改變E4或F4時之前的數值也要保留該如何處理?
例如:E4=5、F4=9則F9=14,但如果更改E4=10,F4=7時,希望F9=14被保留不被清除掉,同時顯示F9=14.F13=17------,請不吝指教,謝謝
年齡不小,但我很想學

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

本帖最後由 bhsm 於 2023-4-10 10:35 編輯

回復 5# Andy2483
感謝Andy2483大指導,我將您寫的程式放入工作表1中後,得到的結果是F5的公式被清除了,所以也無法自動填入F9~F14,不知我在哪個環節出錯,能否請您幫我修正我的壓縮檔?謝謝

A.rar (12.23 KB)

年齡不小,但我很想學

TOP

回復 4# sillykin
感謝sillykin大再次指導,測試結果還是無法將數值填入F9~F14,能否請您打開我的壓縮檔看看我哪裡搞錯了?

1-1.rar (11.51 KB)

年齡不小,但我很想學

TOP

本帖最後由 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

回復 3# bhsm


   幫您修改了一下,請試試看這個版本:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$E$4" Or Target.Address = "$F$4" Then
        If Range("E4").Value = "B4" Then
            Select Case Range("F4").Value
                Case "C4"
                    Range("F5").Value = Range("F9").Value
                Case "C5"
                    Range("F5").Value = Range("F10").Value
                Case "C6"
                    Range("F5").Value = Range("F11").Value
            End Select
        ElseIf Range("E4").Value = "B5" Then
            Select Case Range("F4").Value
                Case "C4"
                    Range("F5").Value = Range("F12").Value
                Case "C5"
                    Range("F5").Value = Range("F13").Value
                Case "C6"
                    Range("F5").Value = Range("F14").Value
            End Select
        End If
    End If
End Sub

主要的改動是將第一個 Select Case 改成 If...ElseIf...End If,因為您要根據 E4 的值來分別處理不同的情況。另外,您也可以考慮使用資料驗證功能來建立下拉式清單,這樣可能會更簡單一些。

TOP

        靜思自在 : 欣賞別人就是莊嚴自己。
返回列表 上一主題