標題:
[發問]
選項按鈕
[打印本頁]
作者:
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下
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
co = Cells(1, Columns.Count).End(xlToLeft).Column
If Target.Column > 2 And Target.Column < 9 And Target.Row > 1 And Cells(Target.Row, 1) <> "" And Cells(1, Target.Column) <> "" Then
Range(Cells(Target.Row, "C"), Cells(Target.Row, co)) = "" '先清空原來的"●"
Target.Value = "●"
End If
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
你原本是可以利用"統計"的代碼去實現你的問題的,我只多了幾列代碼而已
參考下面代碼:
Sub 統計()
co = Sheets("統計").Rows(1).SpecialCells(xlCellTypeConstants)
With Sheets("統計")
For Each Rng In .Rows(1).SpecialCells(xlCellTypeConstants)
ro = .Cells(.Rows.Count, Rng.Column).End(xlUp).Row
If ro > 2 Then .Range(.Cells(3, Rng.Column), .Cells(ro, Rng.Offset(, 2).Column)).Clear
ro = 0
Next
End With
co = Cells(1, Columns.Count).End(xlToLeft).Column
ro = Cells(Rows.Count, 1).End(xlUp).Row
For Each Rng In Range("C2", Cells(ro, co))
If Rng.Value Like "●" Then
With Sheets("統計")
Set c = .Rows(1).Find(Cells(1, Rng.Column))
If Not c Is Nothing Then
ro = .Cells(Rows.Count, c.Column).End(xlUp).Row + 1
.Cells(ro, c.Column) = Cells(Rng.Row, 1)
.Cells(ro, c.Offset(, 1).Column) = Cells(Rng.Row, 2)
'''.擷取人名
T = Split(Cells(Rng.Row, 1) & "//", "//")(1)
T = Split(T & "/", "/")(0)
If T <> "" Then .Cells(ro, c.Offset(, 2).Column) = T
''''寫入新增
Set cr = Sheets("新增").Columns(1).Find(Cells(Rng.Row, 1)) '查詢在哪一列
If Not cr Is Nothing Then
Set cc = Sheets("新增").Rows(1).Find(c.Value) '查詢在哪一欄
If Not cc Is Nothing Then
Sheets("新增").Cells(cr.Row, cc.Column) = Rng.Value '然後放入"●"
End If
End If
End If
Set c = Nothing
Set sr = Nothing
Set cc = Nothing
End With
End If
Next
'Module1.擷取人名<<<這裡可以不用啦!
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
我的理解是最後做排序的動作,是這樣嗎?還是要再做另一個程序?
Sub 統計()
co = Sheets("統計").Rows(1).SpecialCells(xlCellTypeConstants)
With Sheets("統計")
For Each Rng In .Rows(1).SpecialCells(xlCellTypeConstants)
ro = .Cells(.Rows.Count, Rng.Column).End(xlUp).Row
If ro > 2 Then .Range(.Cells(3, Rng.Column), .Cells(ro, Rng.Offset(, 2).Column)).Clear
ro = 0
Next
End With
co = Cells(1, Columns.Count).End(xlToLeft).Column
ro = Cells(Rows.Count, 1).End(xlUp).Row
For Each Rng In Range("C2", Cells(ro, co)).SpecialCells(xlCellTypeConstants)
If Rng.Value Like "●" Then
With Sheets("統計")
Set c = .Rows(1).Find(Cells(1, Rng.Column))
If Not c Is Nothing Then
ro = .Cells(Rows.Count, c.Column).End(xlUp).Row + 1
.Cells(ro, c.Column) = Cells(Rng.Row, 1)
.Cells(ro, c.Offset(, 1).Column) = Cells(Rng.Row, 2)
'''.擷取人名
T = Split(Cells(Rng.Row, 1) & "//", "//")(1)
T = Split(T & "/", "/")(0)
If T <> "" Then .Cells(ro, c.Offset(, 2).Column) = T
''''寫入新增
Set cr = Sheets("新增").Columns(1).Find(Cells(Rng.Row, 1)) '查詢在哪一列
If Not cr Is Nothing Then
Set cc = Sheets("新增").Rows(1).Find(c.Value) '查詢在哪一欄
If Not cc Is Nothing Then
Sheets("新增").Cells(cr.Row, cc.Column) = Rng.Value '然後放入"●"
End If
End If
End If
Set c = Nothing
Set sr = Nothing
Set cc = Nothing
End With
End If
Next
''''排序
Set Rng = Sheets("新增").Range("a1").CurrentRegion
For i = Rng.Columns.Count To 3 Step -1
Rng.Sort Key1:=Rng(1, i), Order1:=xlAscending, Header:=xlYes
Next
'Module1.擷取人名<<<這裡可以不用啦!
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/)