Board logo

標題: [發問] 選項按鈕 [打印本頁]

作者: Michelle-W    時間: 2016-8-22 13:18     標題: 選項按鈕

目前又有另一個工作上的需求,需要請各位前輩協助指點
自動填滿儲存格的方式,在先前文章有討論到
但小妹還需要增加幾個功能...
sheets("選項預留") 內有幾個選項,則在sheets("選擇")的抬頭列顯示幾個
並且下面填滿選項按鈕(能否做到只留一個選項,不要後面的option的文字?)
最後在sheets("統計")的頁面,可以進行分類統計數量?

不好意思,這次問題有點多...QQ"

[attach]25003[/attach]
作者: lpk187    時間: 2016-8-22 19:29

回復 1# Michelle-W

請試看看,是不是你要的,也不知道對不對!
    [attach]25014[/attach]
作者: lpk187    時間: 2016-8-22 19:53

回復 1# Michelle-W


    我多寫了一列代碼,可能不是你需要的,可以把它刪除
.Cells(ro, c.Offset(, 2).Column) = 1
作者: Michelle-W    時間: 2016-8-23 08:21

回復 3# lpk187


正是我工作上的需求~~^^
另外請問一下,當sheets("選擇")新增人員資料的時候
填滿選項按鈕執行後,會全部更新,覆蓋過先前已選擇的
這點有辦法修改嗎^^""
作者: Michelle-W    時間: 2016-8-23 11:57

本帖最後由 Michelle-W 於 2016-8-23 12:00 編輯

回復 2# lpk187

請問這組程式碼人員欄與編號欄是否有字數的限制?
很容易出現錯誤1004
這是為什麼呀? 我從程式碼看不出來有這層限制...
有方法可以解除嗎QQ
[attach]25023[/attach]
作者: lpk187    時間: 2016-8-23 13:59

本帖最後由 lpk187 於 2016-8-23 14:05 編輯

回復 5# Michelle-W

物件太多,佔的記憶體也相對多,會影響到整體的執行,所以會產生錯誤
建議你可以用其他方法來處理同樣問題,而少用OptionButton
例如:使用工作表事件Worksheet_SelectionChange來取代物件OptionButton的使用
也會得到相同的效果
作者: Michelle-W    時間: 2016-8-23 14:32

回復 6# lpk187


我能明白佔用記憶體多
但我想不出更好的方式讓使用者去選擇
請問您能稍微用我這次的問題做個示範嗎?
SelectionChange的部份
在此感謝QQ
作者: 准提部林    時間: 2016-8-23 14:47

SelectionChange 容易發生誤觸, 可改用BeforeDoubleClick,
最好還是使用下拉清單, 對資料統計及篩選也較合適!
作者: jackyq    時間: 2016-8-23 14:50

大大可以用 ●○ + SelectionChange  去偽裝成 option
作者: lpk187    時間: 2016-8-23 15:38

回復 7# Michelle-W

試試看

不只只選取一個儲存格,也可以一次選取一個欄位,但2個欄位以上就不行了

[attach]25032[/attach]
作者: lpk187    時間: 2016-8-23 15:48

回復 7# Michelle-W


    依據准大說的SelectionChange 容易發生誤觸

所以也可以改用下列代碼,在該儲存格中點2下
  1. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  2.     co = Cells(1, Columns.Count).End(xlToLeft).Column
  3.         If Target.Column > 2 And Target.Column < 9 And Target.Row > 1 And Cells(Target.Row, 1) <> "" And Cells(1, Target.Column) <> "" Then
  4.             Range(Cells(Target.Row, "C"), Cells(Target.Row, co)) = "" '先清空原來的"●"
  5.             Target.Value = "●"
  6.         End If
  7. End Sub
複製代碼

作者: Michelle-W    時間: 2016-8-23 17:41

回復 8# 准提部林
回復 9# jackyq
回復 11# lpk187

謝謝各位大大的指點,是真的蠻容易誤觸的^^"
不過這真的是一個好方法耶!!!
又學到一招了~~謝謝
作者: Michelle-W    時間: 2016-8-24 16:17

回復 11# lpk187


請問lpk187大大
因為在作業中,又遇到新的問題
可否麻煩您幫忙看一下...
詳細敘述寫在附件中

真的非常感謝您><
[attach]25037[/attach]
作者: lpk187    時間: 2016-8-24 19:43

本帖最後由 lpk187 於 2016-8-24 19:52 編輯

回復 13# Michelle-W

你原本是可以利用"統計"的代碼去實現你的問題的,我只多了幾列代碼而已
參考下面代碼:
  1. Sub 統計()
  2.     co = Sheets("統計").Rows(1).SpecialCells(xlCellTypeConstants)
  3.     With Sheets("統計")
  4.         For Each Rng In .Rows(1).SpecialCells(xlCellTypeConstants)
  5.             ro = .Cells(.Rows.Count, Rng.Column).End(xlUp).Row
  6.             If ro > 2 Then .Range(.Cells(3, Rng.Column), .Cells(ro, Rng.Offset(, 2).Column)).Clear
  7.             ro = 0
  8.         Next
  9.     End With
  10.     co = Cells(1, Columns.Count).End(xlToLeft).Column
  11.     ro = Cells(Rows.Count, 1).End(xlUp).Row
  12.     For Each Rng In Range("C2", Cells(ro, co))
  13.         If Rng.Value Like "●" Then
  14.             With Sheets("統計")
  15.                 Set c = .Rows(1).Find(Cells(1, Rng.Column))
  16.                  If Not c Is Nothing Then
  17.                     ro = .Cells(Rows.Count, c.Column).End(xlUp).Row + 1
  18.                     .Cells(ro, c.Column) = Cells(Rng.Row, 1)
  19.                     .Cells(ro, c.Offset(, 1).Column) = Cells(Rng.Row, 2)
  20.                     '''.擷取人名
  21.                     T = Split(Cells(Rng.Row, 1) & "//", "//")(1)
  22.                     T = Split(T & "/", "/")(0)
  23.                     If T <> "" Then .Cells(ro, c.Offset(, 2).Column) = T
  24.                     ''''寫入新增
  25.                     Set cr = Sheets("新增").Columns(1).Find(Cells(Rng.Row, 1)) '查詢在哪一列
  26.                     If Not cr Is Nothing Then
  27.                         Set cc = Sheets("新增").Rows(1).Find(c.Value) '查詢在哪一欄
  28.                         If Not cc Is Nothing Then
  29.                             Sheets("新增").Cells(cr.Row, cc.Column) = Rng.Value '然後放入"●"
  30.                         End If
  31.                     End If
  32.                 End If
  33.                 Set c = Nothing
  34.                 Set sr = Nothing
  35.                 Set cc = Nothing
  36.             End With
  37.         End If
  38.     Next
  39. 'Module1.擷取人名<<<這裡可以不用啦!
  40. End Sub
複製代碼

作者: lpk187    時間: 2016-8-24 20:09

回復 13# Michelle-W

另外,如果我把For Each Rng In Range("C2", Cells(ro, co))這列代碼又修改成
   For Each Rng In Range("C2", Cells(ro, co)).SpecialCells(xlCellTypeConstants)
是不是又會更快了一些!
作者: 准提部林    時間: 2016-8-24 21:18

[選擇]工作表
Target.Value = "●"   這行下面,增加下一行,可避免雙擊後變成編輯狀態
Cancel = True
作者: Michelle-W    時間: 2016-8-24 22:03

本帖最後由 Michelle-W 於 2016-8-24 22:06 編輯

回復 15# lpk187


如果在新增工作表中新增一個統計按鈕,執行起來就會沒反應
只能統一在選擇的工作表執行是嗎?
有辦法可以由第一項開始依序排列順序嗎~?
作者: lpk187    時間: 2016-8-24 23:08

本帖最後由 lpk187 於 2016-8-24 23:13 編輯

回復 17# Michelle-W

我的建議:
1。你目前應該先瞭解"統計"這個程序中的代碼,以及其意義。
      寫下選擇工作表中的"統計"程序並不一定只能在選擇工作表中執行!
      當然我寫的代碼只能在其工作表中執行,但也只須修改幾個語法就能夠在其他的工作表中執行!
      其中的Cells()、Range(),這些都必須要正確的地址給它,然後就當然可以在其他的工作表中實現
2。有辦法可以由第一項開始依序排列順序嗎~?
      可以解釋"依序排列順序"嗎?
      從哪依序?人員?編號?還是依據目前的新增工作表之排序?
其實你本身代碼理解還蠻不錯的,再想一下,你一定可以的!
作者: Michelle-W    時間: 2016-8-24 23:16

回復 19# lpk187


我正剛在研究了解意思~~^^
順序是想這樣排列
[attach]25041[/attach]
作者: GBKEE    時間: 2016-8-25 11:09

回復 20# Michelle-W
試試看
    [attach]25043[/attach]
作者: lpk187    時間: 2016-8-25 14:10

回復 19# Michelle-W


    我的理解是最後做排序的動作,是這樣嗎?還是要再做另一個程序?
  1. Sub 統計()
  2.     co = Sheets("統計").Rows(1).SpecialCells(xlCellTypeConstants)
  3.     With Sheets("統計")
  4.         For Each Rng In .Rows(1).SpecialCells(xlCellTypeConstants)
  5.             ro = .Cells(.Rows.Count, Rng.Column).End(xlUp).Row
  6.             If ro > 2 Then .Range(.Cells(3, Rng.Column), .Cells(ro, Rng.Offset(, 2).Column)).Clear
  7.             ro = 0
  8.         Next
  9.     End With
  10.     co = Cells(1, Columns.Count).End(xlToLeft).Column
  11.     ro = Cells(Rows.Count, 1).End(xlUp).Row
  12.     For Each Rng In Range("C2", Cells(ro, co)).SpecialCells(xlCellTypeConstants)
  13.         If Rng.Value Like "●" Then
  14.             With Sheets("統計")
  15.                 Set c = .Rows(1).Find(Cells(1, Rng.Column))
  16.                  If Not c Is Nothing Then
  17.                     ro = .Cells(Rows.Count, c.Column).End(xlUp).Row + 1
  18.                     .Cells(ro, c.Column) = Cells(Rng.Row, 1)
  19.                     .Cells(ro, c.Offset(, 1).Column) = Cells(Rng.Row, 2)
  20.                     '''.擷取人名
  21.                     T = Split(Cells(Rng.Row, 1) & "//", "//")(1)
  22.                     T = Split(T & "/", "/")(0)
  23.                     If T <> "" Then .Cells(ro, c.Offset(, 2).Column) = T
  24.                     ''''寫入新增
  25.                     Set cr = Sheets("新增").Columns(1).Find(Cells(Rng.Row, 1)) '查詢在哪一列
  26.                     If Not cr Is Nothing Then
  27.                         Set cc = Sheets("新增").Rows(1).Find(c.Value) '查詢在哪一欄
  28.                         If Not cc Is Nothing Then
  29.                             Sheets("新增").Cells(cr.Row, cc.Column) = Rng.Value '然後放入"●"
  30.                         End If
  31.                     End If
  32.                 End If
  33.                 Set c = Nothing
  34.                 Set sr = Nothing
  35.                 Set cc = Nothing
  36.             End With
  37.         End If
  38.     Next
  39.     ''''排序
  40.     Set Rng = Sheets("新增").Range("a1").CurrentRegion
  41.     For i = Rng.Columns.Count To 3 Step -1
  42.          Rng.Sort Key1:=Rng(1, i), Order1:=xlAscending, Header:=xlYes
  43.     Next

  44. 'Module1.擷取人名<<<這裡可以不用啦!
  45. End Sub
複製代碼

作者: 准提部林    時間: 2016-8-25 14:59

發問題要說得清楚需求, 不然就是亂猜, 很費往返時間!
以下做個草解, 都是基礎程式碼, 就不做說明:
[attach]25044[/attach]
作者: Michelle-W    時間: 2016-8-25 19:47

本帖最後由 Michelle-W 於 2016-8-25 19:58 編輯

回復 20# GBKEE

謝謝版主大大協助,是一個全新的撰寫方式
我可能要在花點時間重新理解一下,對初學者來說有一點深奧^^”


回復 21# lpk187

謝謝L大,這樣就可以了~~!!
只是...新增工作表那邊是怎麼比對,才能跑出●
如果您覺得解釋麻煩也可以省略沒關係,我再繼續研究
不好意思麻煩您這麼久...^^"


回復 22# 准提部林

謝謝准大出手協助~~~!!
我問的方式確實真的沒有講得很清楚,造成各位前輩的困擾了^^"
想要請教您一下
這段更新程式碼的意思嗎....QQ
作者: 准提部林    時間: 2016-8-25 20:46

本帖最後由 准提部林 於 2016-8-25 21:08 編輯

回復 23# Michelle-W


大概猜〔新增〕工作表是人員總表,含所有新舊人員,
而〔選擇〕工作表應是目前有用到的人員,
〔更新〕是使用公式將〔選擇〕工作表有填入"●"的相對儲存格也抓進夾,
C2:=OFFSET(選擇!$A$1,MATCH($A2,選擇!$A:$A,)-1,MATCH(C$1,選擇!$1:$1,)-1)&""
公式右拉下拉,就可以了解公式用意,
程式會將公式貼成〔值〕,再將錯誤值"#N/A"〔取代〕為空,
最後〔依左而右〕將有"●"的人員往上提,沒有的擺下面,
不過要達到〔依左而右〕往上提,排序順序反而是相反的>>由右而左逐一排序,才能達到這效果,
這是獨立的程式,只處理〔新增〕工作表的部份!

[attach]25050[/attach]
 
 
作者: Michelle-W    時間: 2016-8-25 22:11

本帖最後由 Michelle-W 於 2016-8-25 22:13 編輯

回復 24# 准提部林


版大~可以再請教您一下嗎?
如同您說的,我問題真的沒敘述清楚 ,真的很抱歉
如果只看sheet("統計")跟sheet("新增")

sheet("新增")的人員跟sheet("統計")的Name做包含比對
各項目人名有出現過的一樣是●,且照順序排列...
這樣的話程式碼應該如何撰寫?><

(sheet("新增")的人員跟選擇的人員,其實後面XXX是不一樣的QQ",以Match比對不出來)
作者: lpk187    時間: 2016-8-25 22:30

回復 23# Michelle-W


    [attach]25051[/attach]
作者: 准提部林    時間: 2016-8-26 09:54

回復 25# Michelle-W


[統計]表的來源不是從[選擇]表來的嗎?
[新增]表從[選擇]表去取, 又有何不同?

[人員]的格式不相同?
上傳更完整的資料及正確文字結構, 才能看怎麼處理!

另應以lpk大大的為主要解, 我較沒時間跟帖, 只能插花當參考!




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