Board logo

標題: [發問] 先不重複篩選後,並自動設為下拉式選單 [打印本頁]

作者: iceandy6150    時間: 2020-5-16 00:41     標題: 先不重複篩選後,並自動設為下拉式選單

大家好,小弟目前有一工作表要填寫,如圖1
[attach]32029[/attach]
也就是工作表1的第G、H、I欄
而填寫內容必須參照工作表2的表格,如圖2
[attach]32030[/attach]

如果[用途類別(科目)]是--物品/消耗品
則[用途別] 必定是--業務費
且[工作計畫] 也必定是--公司業務

其實準則在[用途類別(科目)]

我的想法是
既然工作表1的第G、H、I欄,要慢慢打字,能否設定下拉式選單
而選單的內容值,是從工作表2去不重複篩選
這樣就可以用下拉式去選,不必打字
不重複篩選後如圖3
[attach]32031[/attach]

當我在工作表1按下按鈕後
會自動把工作表1的G欄,設定下拉式清單,一次50列,來源是工作表2的F
會自動把工作表1的H欄,設定下拉式清單,一次50列,來源是工作表2的G
會自動把工作表1的I欄,設定下拉式清單,一次50列,來源是工作表2的H

但是,工作表2的這個表格,是隨時有可能增減的
每一次執行,都要能重新判斷,並把舊的篩選結果移除



【第二個自動化完美做法】
就是既然準則在[用途類別(科目)] --(工作表1的I欄)
那按下按鈕後
會自動把工作表1的I欄,設定下拉式清單,一次50列,來源是工作表2的H
然後I欄下拉選定某個值後
會自動把工作表1的H欄,填入工作表2對照表格中相對應的值
會自動把工作表1的G欄,填入工作表2對照表格中相對應的值
(連動的概念)


不論做法一 或 做法二(完美法)
我用錄製巨集的方式找出 不重複進階篩選並複製貼上到別的地方 的寫法
可是要讓那個範圍,設定為下拉式選單的參照範圍,尤其可能又是動態的
我一直搞不定
求助各位大大了,感謝

附上檔案
[attach]32032[/attach]
作者: 准提部林    時間: 2020-5-16 12:21

利用"定義名稱"動態下拉清單:
[attach]32033[/attach]
作者: iceandy6150    時間: 2020-5-17 13:18

回復 2# 准提部林

感謝版主提供檔案
但是我看按鈕裡面似乎沒有程式碼

目前需求是這樣
基本上工作表1是保持空的
如果有請購單據進來的話,才會開始逐筆打資料進去
打完後會剪走,讓工作表1又保持乾淨空的狀態

只是要打  [工作計畫        用途別        用途類別] 的時候
方法一,用手慢慢打
方法二,設定資料驗證,設定去找 [清單]裡面的範圍   工作計畫設定一次         用途別設定一次          用途類別設定一次
               然後每一筆資料該填什麼,就去下拉選擇

方法三,利用VBA設一個按鈕,把方法二的程序都自動化。
               要使用的時候就按一下產生,選完後剪走,讓工作表1又保持乾淨空的狀態
               

現在目標有幾個
目前可以做到按下按鈕,就自動把篩選不重複後的東西,貼到某欄
但是可能現在篩選後有四種,但是參照表以後修改,可能篩選後會變六種
  1. With Sheets("工作表2")
  2.   .UsedRange.Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("工作表2").Range( _
  3.         "F1"), Unique:=True
  4. Set Rng =.Range("F1").CurrentRegion
  5. End With
複製代碼
<目標一>如何讓程式判斷,現在{清單}的[用途類別(科目)]..篩選後有幾種
<目標二>判斷有幾種後,將這個..幾種類別...設定給....工作表1的...[用途類別]那一欄...的下拉式選單
  1. Range("I1").Select
  2. With Selection.Validation
  3.     .Delete
  4.     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  5.     xlBetween, Formula1:=Sheets("工作表2").Rng   '"=工作表2!$C$2:$C$7"
  6.     .IgnoreBlank = True
  7.     .InCellDropdown = True
  8.     .InputTitle = ""
  9.     .ErrorTitle = ""
  10.     .InputMessage = ""
  11.     .ErrorMessage = ""
  12.     .IMEMode = xlIMEModeNoControl
  13.     .ShowInput = True
  14.     .ShowError = True
  15. End With
複製代碼
設定來源那邊有問題  Formula1:=

<目標三>自動設定50列都有下拉式選單
  1. Selection.AutoFill Destination:=Range("I1:I50"), Type:=xlFillDefault
複製代碼
<遠程目標>
若是目標一二都能達成,則   [用途類別] 的下拉選擇某一類後, [工作計畫]跟[用途別]可能自動產生相對應的值出來 (能參考{清單}中的表
例如:
[用途類別](I欄) 的下拉選擇......離職儲金   之後
那麼
[用途別](H欄),會自動放入.....人事費
[工作計畫](G欄),會自動放入....公司業務

如果程式有辦法做到的話
再麻煩版主及其他大大協助指點,謝謝
作者: n7822123    時間: 2020-5-18 05:05

回復 1# iceandy6150


自己試試吧!
  1. Sub 下拉選單()

  2. '工作表2的A欄
  3. Arr = Range([工作表2!A2], [工作表2!A65535].End(3))
  4. List$ = ""
  5. For R = 1 To UBound(Arr)  '去除重複
  6.   If InStr(List, Arr(R, 1)) = 0 Then List = List & "," & Arr(R, 1)
  7. Next
  8. With [G2:G100].Validation  '下拉格式的範圍自己改
  9.   .Delete
  10.   .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
  11. End With

  12. '工作表2的B欄
  13. Arr = Range([工作表2!B2], [工作表2!B65535].End(3))
  14. List = ""
  15. For R = 1 To UBound(Arr)  '去除重複
  16.   If InStr(List, Arr(R, 1)) = 0 Then List = List & "," & Arr(R, 1)
  17. Next
  18. With [H2:H100].Validation  '下拉格式的範圍自己改
  19.   .Delete
  20.   .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
  21. End With

  22. '工作表2的C欄
  23. Arr = Range([工作表2!C2], [工作表2!C65535].End(3))
  24. List = ""
  25. For R = 1 To UBound(Arr)  '去除重複
  26.   If InStr(List, Arr(R, 1)) = 0 Then List = List & "," & Arr(R, 1)
  27. Next
  28. With [I2:I100].Validation  '下拉格式的範圍自己改
  29.   .Delete
  30.   .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
  31. End With
  32. End Sub
複製代碼
[attach]32039[/attach]
作者: n7822123    時間: 2020-5-18 12:55

回復 4# n7822123


   
原寫法有瑕疵,未考慮項目可能有互相包含的字串

修正如下 (紅色部分)



Sub 下拉選單()

'工作表2的A欄
Arr = Range([工作表2!A2], [工作表2!A65535].End(3))
List$ = ""
For R = 1 To UBound(Arr)  '去除重複
  If InStr("," & List & ",", "," & Arr(R, 1) & ",") = 0 Then List = List & "," & Arr(R, 1)
Next
With [G2:G100].Validation  '下拉格式的範圍自己改
  .Delete
  .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
End With

'工作表2的B欄
Arr = Range([工作表2!B2], [工作表2!B65535].End(3))
List = ""
For R = 1 To UBound(Arr)  '去除重複
  If InStr("," & List & ",", "," & Arr(R, 1) & ",") = 0 Then List = List & "," & Arr(R, 1)
Next
With [H2:H100].Validation  '下拉格式的範圍自己改
  .Delete
  .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
End With

'工作表2的C欄
Arr = Range([工作表2!C2], [工作表2!C65535].End(3))
List = ""
For R = 1 To UBound(Arr)  '去除重複
  If InStr("," & List & ",", "," & Arr(R, 1) & ",") = 0 Then List = List & "," & Arr(R, 1)
Next
With [I2:I100].Validation  '下拉格式的範圍自己改
  .Delete
  .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=List
End With

End Sub

作者: 准提部林    時間: 2020-5-18 13:35

回復 3# iceandy6150


想用第三層選單, 往回推算前兩層相關聯文字, 再自動填入???
問題:第三層選單所對應的有兩個以上, 如何判斷屬于哪一個???

2樓給的是漸進式的動態選單, 選第一層後, 自動判斷第二層清單, 再至第三層,
越選越少, 也不須打字!!!

至于表1, 可預建1~200列驗證清單,
輸入完成-轉出後, 用CLEARCONTENTS清空內容, 即可繼續輸入新的資料,
幾行程式碼即可~~

=========================
作者: iceandy6150    時間: 2020-5-18 23:03

回復 5# n7822123

感謝你的幫忙,我自己後來有找到方法了,會貼在最下面的回應
再與大大您分享交流
作者: iceandy6150    時間: 2020-5-18 23:09

本帖最後由 iceandy6150 於 2020-5-18 23:12 編輯

回復 6# 准提部林

版主您好,我後來想了個土方法

我知道可以選定一個大範圍,給他定義名稱
然後VLOOKUP這個函數只能找...一個範圍內,最左邊那欄當標準

所以原本 A欄 B欄 C欄,就複製到別的地方,變成C欄,B欄,A欄
然後VLOOKUP C欄,可以找到相對應的A跟B
(其實用FIND好像也可以)

至於下拉式選單的內容,因為進階篩選過後,把篩選過的範圍,定義名稱
再把這個名稱給下拉式選單 (來源為變數)
這邊要配合 INDIRECT 這個語法,才能正常使用,也是網路查到的

以下是程式碼
跟測試檔案
(目前自動產生下拉清單只設定5格)
  1. Private Sub CommandButton1_Click()
  2.     Range("A2:C20").Select
  3.     Selection.ClearContents
  4.     With Selection.Validation
  5.         .Delete
  6.         .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
  7.         :=xlBetween
  8.         .IgnoreBlank = True
  9.         .InCellDropdown = True
  10.         .IMEMode = xlIMEModeNoControl
  11.         .ShowInput = True
  12.         .ShowError = True
  13.     End With
  14.    
  15.     Range("C2").Select
  16.    
  17. End Sub


  18. '*******************************************************************************


  19. Private Sub CommandButton2_Click()
  20. Dim a, b, c, d

  21. Sheets("工作表2").Select

  22. With Sheets("工作表2")

  23.     '每次執行先將最右邊四欄砍光
  24.     .Columns(.Columns.Count).Delete Shift:=xlShiftLeft
  25.     .Columns(.Columns.Count - 1).Delete Shift:=xlShiftLeft
  26.     .Columns(.Columns.Count - 2).Delete Shift:=xlShiftLeft
  27.     .Columns(.Columns.Count - 3).Delete Shift:=xlShiftLeft


  28.     '[用途類別]先複製到最右邊倒數第三欄
  29.     .Columns("C:C").Select
  30.     Selection.Copy
  31.     Sheets("工作表2").Columns(.Columns.Count - 2).PasteSpecial (xlPasteAll)
  32.     Application.CutCopyMode = False


  33.     '[用途別]先複製到最右邊倒數第二欄
  34.     .Columns("B:B").Select
  35.     Selection.Copy
  36.     Sheets("工作表2").Columns(.Columns.Count - 1).PasteSpecial (xlPasteAll)
  37.     Application.CutCopyMode = False
  38.    
  39.    
  40.     '[工作計畫]先複製到最右邊倒數第一欄
  41.     .Columns("A:A").Select
  42.     Selection.Copy
  43.     Sheets("工作表2").Columns(.Columns.Count).PasteSpecial (xlPasteAll)
  44.     Application.CutCopyMode = False
  45.    

  46.     '進階不重複篩選--放到...最右邊倒數第四欄
  47.     .Columns("C:C").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Columns(.Columns.Count - 3), Unique:=True
  48.      Application.CutCopyMode = False
  49.      
  50.     a = Sheets("工作表2").Columns(.Columns.Count - 3).End(xlDown).Row '查看(科目)有多少個數量
  51.     b = .Columns.Count - 3 'b為第幾欄(最右邊倒數第四欄)
  52.      
  53.      
  54.     '設定--定義範圍
  55.     ActiveWorkbook.Names.Add Name:="abc", RefersToR1C1:="=工作表2!R2C" & b & ":R" & a & "C" & b
  56.     ActiveWorkbook.Names("abc").Comment = ""
  57.      
  58.      
  59.     '設定下拉式清單
  60.     Sheets("工作表1").Select

  61.         Range("C2").Select
  62.         With Selection.Validation
  63.             .Delete
  64.             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  65.             xlBetween, Formula1:="=INDIRECT(""abc "")"
  66.             .IgnoreBlank = True
  67.             .InCellDropdown = True
  68.             .InputTitle = ""
  69.             .ErrorTitle = ""
  70.             .InputMessage = ""
  71.             .ErrorMessage = ""
  72.             .IMEMode = xlIMEModeNoControl
  73.             .ShowInput = True
  74.             .ShowError = True
  75.         End With

  76.     '複製下拉式清單到別格
  77.      Selection.AutoFill Destination:=Range("C2:C5"), Type:=xlFillDefault


  78.     '設定 定義範圍
  79.      a = Sheets("工作表2").Columns(.Columns.Count - 2).End(xlDown).Row  '查看這張參照表有多少[用途類別],這張表的底部到多低
  80.      b = .Columns.Count - 2 'b為第幾欄(最右邊倒數第三欄...[用途類別])
  81.    
  82.         Sheets("工作表2").Select
  83.         ActiveWorkbook.Names.Add Name:="data", RefersToR1C1:="=工作表2!R2C" & b & ":R" & a & "C" & (b + 2)  '這個範圍有三欄,從b到b+2
  84.         ActiveWorkbook.Names("data").Comment = ""

  85.     '設定自動出現-方法2,若對照表中為空格,顯示空格,若工作類別(科目)未選,顯示空格
  86.      '(從定義好的範圍data中去找到範圍中的第2欄,放到B2---B2要放用途別,data的第2欄也是用途別)
  87.      
  88.      '先設定[用途別]
  89.          Sheets("工作表1").Select
  90.          Range("B2").Select
  91.          ActiveCell.FormulaR1C1 = _
  92.              "=IFERROR(IF(VLOOKUP(RC3,data,2,0)=0,"""",VLOOKUP(RC3,data,2,0)),"""")"
  93.         '複製公式到別格
  94.          Selection.AutoFill Destination:=Range("B2:B5"), Type:=xlFillDefault
  95.         
  96.       '再設定[工作計畫]---A2要放用[工作計畫],data的第3欄也是[工作計畫])
  97.          Sheets("工作表1").Select
  98.          Range("A2").Select
  99.          ActiveCell.FormulaR1C1 = _
  100.              "=IFERROR(IF(VLOOKUP(RC3,data,3,0)=0,"""",VLOOKUP(RC3,data,3,0)),"""")"
  101.         '複製公式到別格
  102.          Selection.AutoFill Destination:=Range("A2:A5"), Type:=xlFillDefault
  103.         
  104. End With

  105. Range("C2").Select


  106. End Sub
複製代碼
[attach]32048[/attach]

感謝各位
作者: n7822123    時間: 2020-5-19 11:16

本帖最後由 n7822123 於 2020-5-19 11:17 編輯

回復 1# iceandy6150

【第二個自動化完美做法】
就是既然準則在[用途類別(科目)] --(工作表1的I欄)
那按下按鈕後
會自動把工作表1的I欄,設定下拉式清單,一次50列,來源是工作表2的H
然後I欄下拉選定某個值後
會自動把工作表1的H欄,填入工作表2對照表格中相對應的值
會自動把工作表1的G欄,填入工作表2對照表格中相對應的值
(連動的概念)


原來你的需求只是這麼簡單~ 10分鐘搞定
這我常常幫公司的同事做
不需命名名稱、不用函數
看你有沒有心想學別人的做法



xls版本是給舊版Excel的人使用的,
2007以後請開xlsm版本


[attach]32049[/attach]
作者: 准提部林    時間: 2020-5-19 15:55

1) 如果表2的C欄都是不重覆的, 那直接用這來設定第三層選單,
   又如果資料並不變動或變動少, 則可固定範圍定義名稱,
   若時有變動(重點:不重覆), 用動態定義名稱即可解決, 何須每次都要跑VBA迴圈!!!
   這樣用FIND就可定位找出前兩層資料~
2) 如果C欄是會重覆的, 那用第三層選單找對應的前兩層, 就不是那麼準確,
   何況如果C欄有幾百或上千行, 每次都要從長又長的選單中去選取所要的, 滑鼠滑上滑下__並不太聰明,也容易選錯重來;
   再則, 幾百上千行的內容用字典檔擠成字串, 再塞進清單中, 會不會超過文字長度限制???
作者: n7822123    時間: 2020-5-19 22:55

回復 10# 准提部林


幾百上千行的內容用字典檔擠成字串, 再塞進清單中, 會不會超過文字長度限制???

回準大~原來字典的Key 與 item 都可以是 String,而String 最多可裝大約 20 億 ( 2^31)個字元。

而此做法每個item 已不是 String,變成物件,物件又可以定義多個屬性,每個屬性都可以是String

只要單一 String 變數 不超過 20 億 ( 2^31)個字元,就不會有問題。

至於字典 key的數量與物件能擴充的屬性數量,網路上查不到相關資訊

不過我猜字典跟陣列一樣,是虛擬的,能裝多少東西取決於"電腦記憶體"

如此行程式 Arr = Range([A1], Cells(Rows.Count, Columns.Count))

使用新版Excel 的人執行這行基本上都會跳出 "記憶體不足"  (除非你電腦記憶體非常大)


作者: iceandy6150    時間: 2020-5-19 23:32

回復 9# n7822123

哇賽~~~龍大你這個太屌了吧
我土炮方法想了好久,繞了好幾圈,才做出這樣的功能
你沒幾行就做完了.....
能否教兩句? 想學...

(有搜尋ByVal Target As Range的用法,但還不是很懂,我們這版之前也有相關主題)
目前看來有兩大重點
1.觸發功能
2.塞字典功能

另外是,我只會插入AXTIVE的按鈕,裡面放程式碼
你那兩個按鈕...好像也不是按鈕,為什麼可以按啊? 真神奇

然後你還有建立了 模組 跟 物件類別模組....
這我以前都沒有用過...
作者: iceandy6150    時間: 2020-5-19 23:54

本帖最後由 iceandy6150 於 2020-5-19 23:56 編輯
1) 如果表2的C欄都是不重覆的, 那直接用這來設定第三層選單,
   又如果資料並不變動或變動少, 則可固定範圍定義名稱,
   若時有變動(重點:不重覆), 用動態定義名稱即可解決, 何須每次都要跑VBA迴圈!!!
   這樣用FIND就可定位找出前兩層資料~
2) 如果C欄是會重覆的, 那用第三層選單找對應的前兩層, 就不是那麼準確,
   何況如果C欄有幾百或上千行, 每次都要從長又長的選單中去選取所要的, 滑鼠滑上滑下__並不太聰明,也容易選錯重來;
   再則, 幾百上千行的內容用字典檔擠成字串, 再塞進清單中, 會不會超過文字長度限制???
回復 10# 准提部林

版大您好,關於這次程式需求的部分,我略做說明一下

三層式下拉選單,我有搜尋過網路
有個做法也是要先把類別表,從直的轉成橫的,之後再去做處理
但是因為我也是幫忙同事處理的,怕以後參照表有變動(新增或刪減),可能同事就不會操作了
所以我要寫一個...按下按鈕就會通通自己完成的檔案

而且A部門的人,參照表也許有15種。但是B部門的人,參照表也許只有12種。C部門的有26種...等等
所以我希望檔案給他們後,他們只要會增減參照表,剩下的,我的按鈕都會幫他們設定好好的,方便使用

參照表的C欄 (用途類別) 應該是絕對不重覆的。
A欄是大分類,所以在表中很多重覆
B欄是中分類,所以有一些重覆,更討厭的是有一些類別還是空的
C欄是小分類,所以應該必定不會重覆,不然帳就會出錯了

然後...為什麼不要做...先A欄下拉式大分類,之後B欄會剩下相對應的分類,最後剩下C欄的分類
正常來講一般比如說在搜尋料件或倉儲,應該是這樣比較快
但是我這邊報帳表,是不能選錯的
比如,A選到3大類,B選3中類,C卻選去1小類---(這樣帳的科目就錯了)

所以,這樣東西 是 A的3  那肯定是B的3   肯定是C的3  (就是整個表的第3列的ABC)
本來是很想叫同事在填的時候,乾脆自己跳去Sheet("參照表"),複製ABC看哪一列,再回來貼上值就好
但是又怕他們把參照表弄亂了
只好想出....只要下拉選擇C欄,經過查照功能,自動幫你放入....相對應的A跟B
所以才想出我那個檔案的做法 (很土炮...)

以目前公司的狀況,參照表的C欄,要報帳的科目應該是不會超過30~50樣

感謝版大的熱心教學
作者: n7822123    時間: 2020-5-20 00:10

本帖最後由 n7822123 於 2020-5-20 00:21 編輯

回復 12# iceandy6150


有搜尋ByVal Target As Range的用法,但還不是很懂,我們這版之前也有相關主題

不是三言兩語學得來的,直接給你網址吧~ (GTW 這個人寫的 VBA教學很適合 VBA新手看)

目錄第14項    當然他只介紹幾種常用的而以,要更詳細還是買本書吧!  


https://blog.gtwang.org/programming/vba

另外是,我只會插入AXTIVE的按鈕,裡面放程式碼

你那兩個按鈕...好像也不是按鈕,為什麼可以按啊? 真神奇

任何圖片 滑鼠右鍵 > 指定巨集  都可以指定你要點擊圖片時,所要執行的巨集

[attach]32051[/attach]
作者: jackyq    時間: 2020-5-20 08:26

你要的功能想要弄到最容易使用 ( List 易搜 , 支持 mousescroll )

就是 把另一個 EXCEL 嵌入到 本體 EXCEL

另一個 EXCEL 直接拿來當 List

直接支援 mousescroll ,  綜觀查找,  也可篩選查找

ListBox 最大問題:  No mousescroll , 東西一多要找到東西有點費力
作者: iceandy6150    時間: 2020-5-20 23:52

回復 14# n7822123

感謝您的教學,原來用照片也可以做同樣的功能,又學到一招
也感謝分享網址,會多去看看的
作者: iceandy6150    時間: 2020-5-20 23:54

回復 15# jackyq

聽起來是挺深的,有時間再來搜尋看看這些用法,感謝您的分享與教學
作者: 准提部林    時間: 2020-5-22 15:10

本帖最後由 准提部林 於 2020-5-22 15:42 編輯

回復 13# iceandy6150


比如,A選到3大類,B選3中類,C卻選去1小類---(這樣帳的科目就錯了)  
_2樓的檔案, 不會有這問題
_未選取第一層, 不會准許選第二層; 選了第一層, 自動幫你篩選出符合第一層的清單,
續選第二層(若第二層空白, 可不用選)後, 再過瀘出第三層, 可以說下拉清單會越來越少,
絕對不會有錯選的問題~~
_至于"清單"來源表, 可不限制往下新增, 只要將公式下拉到底, 會自動判斷清單範圍, 這部份還不用VBA

工作表一用到的VBA:
1) 清空輸入資料(若已將原有內容貼至別處), 並重置下拉清單50行

如果第三層清單不重覆(附檔中有兩個"電費", 修改)
[attach]32068[/attach]
作者: iceandy6150    時間: 2020-5-22 22:59

回復 18# 准提部林


    感謝版主回覆教學,看來也是利用Sheet_Change去做處理
    這邊我再研究一下使用方式,謝謝
作者: iceandy6150    時間: 2020-5-22 23:01

回復 15# jackyq


    大大,您說的功能我都不會使用,如果有機會,再請您教學一下,謝謝
作者: iceandy6150    時間: 2020-5-22 23:28

趁這個版面詢問一下,WorkSheet_Change的用法
底下分別是版主跟龍大的程式碼
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim xF As Range, xA As Range
  3. With Target
  4.      If .Count > 1 Or .Columns.Count > 1 Or .Row < 2 Or .Column <> [I1].Column Then Exit Sub
  5.      Set xA = .Cells(1, -1).Resize(1, 2): xA.ClearContents
  6.      If .Value <> "" Then Set xF = [清單!d:d].Find(.Value, Lookat:=xlWhole)
  7.      If Not xF Is Nothing Then xA = xF(1, -1).Resize(1, 2).Value
  8. End With
  9. End Sub



  10. Private Sub Worksheet_Change(ByVal Target As Range)

  11. If Target.Column <> 9 Then Exit Sub

  12. Application.EnableEvents = False
  13. 塞資料入字典
  14. Key$ = Target.Value
  15. Cells(Target.Row, 8) = 下拉選單.D(Key).用途別
  16. Cells(Target.Row, 7) = 下拉選單.D(Key).工作計畫
  17. Application.EnableEvents = True

  18. End Sub
複製代碼
我的問題是
一、為什麼IF的後面都不需要加上 END IF而且除錯都沒問題

二、Target指的是滑鼠點到的任何一個儲存格嗎?   因為可以取得Target.Row
       或是Target.Column。
      但是Private Sub Worksheet_Change(ByVal Target As Range)又把Target當RANGE ?

三、我測試了一個小程式,但是只動了一次,就沒動作了,不曉得錯在哪裡
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Column <> 3 Then Exit Sub
  3. Application.EnableEvents = False
  4. Target.Interior.ColorIndex = 3
  5. End Sub
複製代碼
照理說,我隨便選一個儲存格,如果該儲存格不是第3欄 (C欄)
     那就離開程式
     如果選到其他欄,那就會把儲存格顏色變紅色
     但是就沒辦法
     就算我選到的儲存格,隨便輸入123,再刪掉,這樣算是有Change了吧?
     也沒動作....

四、Set xA = .Cells(1, -1).Resize(1, 2): xA.ClearContents 這邊.Resize是什麼功能?

以上詢問,謝謝
作者: 准提部林    時間: 2020-5-23 09:41

回復 21# iceandy6150


1)、為什麼IF的後面都不需要加上 END IF而且除錯都沒問題?
__if 條件 then 結果, 寫成一行, 就不須加 end if

2)、Target指的是滑鼠點到的任何一個儲存格嗎?
__就是selection中的range物件, 可以是單格, 選續範圍, 或不規則選取區塊

3)、我測試了一個小程式,但是只動了一次,就沒動作了,不曉得錯在哪裡?
__Application.EnableEvents = False
  "觸發事件"--關閉, 這是為了避免"重復觸發"造成無限循環,
  程式底下應再多一行:
  Application.EnableEvents = True
  (恢復觸發) 否則下次就沒作用!

4)、Set xA = .Cells(1, -1).Resize(1, 2) 這邊.Resize是什麼功能?
    以一個range定點, 向右或向下"擴展"成一個範圍,
  例如: range("a1").resize(4,3)  ---> A4:C4


=============================
作者: iceandy6150    時間: 2020-5-25 00:04

回復 22# 准提部林


    感謝版主的教學回覆,我再來好好試試這幾個功能,感謝




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)