標題:
[發問]
如何自動選取相同的組合
[打印本頁]
作者:
donod
時間:
2012-2-26 02:49
標題:
如何自動選取相同的組合
將B組與A組有相同的PT組合(PT1-PT8)選出來,再把B組相關的分數顯示在P欄,請教大大如何寫才能做到?謝謝!
[attach]9755[/attach]
作者:
oobird
時間:
2012-2-26 07:58
歡迎新同學!
Sub test()
Dim d As Object, a As Range, b As Range, i%, x$
Set d = CreateObject("Scripting.Dictionary")
Set b = [r7:ac18]
For i = 1 To b.Rows.Count
x = Join(Application.Transpose(Application.Transpose(b(i, 5).Resize(, 8))), ",")
d(x) = b(i, 1)
Next
Set a = [h7:o18]
For i = 1 To a.Rows.Count
x = Join(Application.Transpose(Application.Transpose(a(i, 1).Resize(, 8))), ",")
If d.exists(x) Then a(i, 9).Value = d(x)
Next
End Sub
複製代碼
作者:
donod
時間:
2012-2-26 10:42
本帖最後由 donod 於 2012-2-26 11:15 編輯
回復
2#
oobird
謝謝大大回覆!
實際工作時,有多個工作頁,可否每個工作頁加入多個"選擇範圍按鈕",請問如何寫才可以?謝謝!
[attach]9758[/attach]
作者:
GBKEE
時間:
2012-2-26 11:29
回復
3#
donod
實際工作時,有多個工作頁
你舉的範例不是多個工作頁
作者:
donod
時間:
2012-2-26 12:16
本帖最後由 donod 於 2012-2-26 12:26 編輯
回復
4#
GBKEE
對不起!是我說不清楚!
是指會重複增開工作頁,而工作內容大約類同(範例用了相同內容),都是各組配對A組。請教大大如何寫才做到。
[attach]9761[/attach]
作者:
GBKEE
時間:
2012-2-26 13:50
回復
5#
donod
請複製到ThisWorkbook模組內
'ThisWorkbook 的預設事件
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim xX As Integer, Ar(), A As Range, B As Range, i As Integer, x As Variant
With Sh
If Target.Address(0, 0) = "P7" Then '選擇了 P7
Set B = .Range("T10:AE21") '制訂 B 組(分數- PT8) 範圍
xX = 0 ' P欄
ElseIf Target.Address(0, 0) = "Q7" Then '選擇了 Q7
Set B = .Range("AH10:AS21") '制訂 C組(分數-PT8) 範圍
xX = 1 ' P欄 右移一欄 :Q欄
ElseIf Target.Address(0, 0) = "R7" Then '選擇了 R7
Set B = .Range("AV10:BG21") '制訂 D組(分數-PT8) 範圍
xX = 2 ' P欄 右移二欄 :R欄
Else
Exit Sub '離開程序
End If
Set A = .Range("H10:O21") '制訂 A 組(PT1-PT8) 範圍
A.Interior.ColorIndex = xlNone '清除A 組(PT1-PT8) 範圍圖樣
B.Interior.ColorIndex = xlNone '清除B ,C , D. 組 範圍圖樣
ReDim Ar(1 To A.Rows.Count) '重新宣告 陣列的維數
For i = 1 To B.Rows.Count '取得B,C,D,組的 (PT1-PT8) 的內容 置入陣列 Ar
Ar(i) = Join(Application.Transpose(Application.Transpose(B(i, 5).Resize(, 8))), ",")
Next
For i = 1 To A.Rows.Count
x = Join(Application.Transpose(Application.Transpose(A(i, 1).Resize(, 8))), ",")
x = Application.Match(x, Ar, 0) '工作表函數Match 在Ar尋找 相同字串
A(i, 9 + xX) = "" '清除
If Not IsError(x) Then '找到傳回數字
B(x, 5).Resize(, 8).Interior.ColorIndex = 6
A(i, 1).Resize(, 8).Interior.ColorIndex = 6
A(i, 9 + xX) = B(x, 1) 'B,C,D,組的分數
End If
Next
End With
End Sub
複製代碼
作者:
donod
時間:
2012-2-26 14:15
回復
6#
GBKEE
可以了!感謝大大細心講解!
作者:
donod
時間:
2012-2-27 17:10
本帖最後由 donod 於 2012-2-27 17:13 編輯
回復
6#
GBKEE
22. Ar(i) = Join(Application.Transpose(Application.Transpose(B(i, 5).Resize(, 8))), ",")
請教大大以上公式是什麼意思?B(i, 5)是指哪些位置?謝謝!
作者:
GBKEE
時間:
2012-2-27 17:32
回復
8#
donod
如 Set B=[B2]
B(2, 5) = B.Cells(2, 5) =B.Offset(1, 4) =[F3]
-> B.Cells(2, 5) ->
含B2 的位置
向下位移2列 : 向右位移5欄 =[F3]
-> B.Offset(1, 4)->
不含B2 的位置
向下位移1列 : 向右位移4欄 =[F3]
作者:
donod
時間:
2012-2-27 17:40
回復
9#
GBKEE
明白了,謝謝!
作者:
donod
時間:
2012-2-28 00:41
回復
9#
GBKEE
請教大大,是什麼位置出錯?
[attach]9787[/attach]
作者:
GBKEE
時間:
2012-2-28 10:46
回復
11#
donod
Module1 中 的Private Sub
Workbook_
SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 是不會 有動作的
那是ThisWorkbook 的預設事件
那程序必須是在 ThisWorkbook中
你每一工作表的 B,C,D組的位置都不一樣 當然會不準確
需用每一工作表的預設事件 程序 Private Sub
Worksheet_
SelectionChange(ByVal Target As Range)
依每一工作表的 B,C,D組的位置 去設定
作者:
donod
時間:
2012-2-28 13:44
回復
12#
GBKEE
改了,煩請大大看看是哪裡錯,謝謝!
[attach]9791[/attach]
作者:
GBKEE
時間:
2012-2-28 14:48
回復
13#
donod
用ThisWorkbook模組內 Private Sub Worksheet_SelectionChange(ByVal Target As Range)程序
是因為
如 每一工作表有B,C,D 分組的 位置都一樣
可用 Private Sub
Workbook
_SheetSelectionChange 不必每一工作表模組內去寫程序
現在因每一工作表B,C,D 分組的 位置都不一樣 所以啊
每一有B,C,D 分組的工作表模組內 都要一有個它適用的 Private Sub Worksheet_SelectionChange(ByVal Target As Range)程序
作者:
donod
時間:
2012-2-28 15:09
回復
14#
GBKEE
謝謝大大回覆!
但第1張工作頁錯在什麼,請大大指教!
[attach]9793[/attach]
作者:
register313
時間:
2012-2-28 15:17
回復
15#
donod
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim xX As Integer, Ar(), A As Range, B As Range, i As Integer, x As Variant
If Target.Address(0, 0) = "Q8" Then '選擇了 Q8
Set B = Range("V9:AJ20") '制訂 B 組(分數- PT8) 範圍
xX = 0 ' Q欄
ElseIf Target.Address(0, 0) = "R8" Then '選擇了 R8
Set B = Range("AM9:BA20") '制訂 C組(分數-PT8) 範圍
xX = 1 ' P欄 右移一欄 :R欄
ElseIf Target.Address(0, 0) = "S8" Then '選擇了 S8
Set B = Range("BD9:BR20") '制訂 D組(分數-PT8) 範圍
xX = 2 ' P欄 右移二欄 :S欄
ElseIf Target.Address(0, 0) = "T8" Then '選擇了 T8
Set B = Range("BU9:CI20") '制訂 E組(分數-PT8) 範圍
xX = 3 ' P欄 右移三欄 :T欄
Else
Exit Sub '離開程序
End If
Set A = Range("G9:P20") '制訂 A 組(PT1-PT8) 範圍
A.Interior.ColorIndex = xlNone '清除A 組(PT1-PT8) 範圍圖樣
B.Interior.ColorIndex = xlNone '清除B ,C , D. 組 範圍圖樣
ReDim Ar(1 To A.Rows.Count) '重新宣告 陣列的維數
For i = 1 To B.Rows.Count '取得B,C,D,組的 (PT1-PT8) 的內容 置入陣列 Ar
Ar(i) = Join(Application.Transpose(Application.Transpose(B(i, 6).Resize(, 10))), ",")
Next
For i = 1 To A.Rows.Count
x = Join(Application.Transpose(Application.Transpose(A(i, 1).Resize(, 10))), ",")
x = Application.Match(x, Ar, 0) '工作表函數Match 在Ar尋找 相同字串
A(i, 11 + xX) = "" '清除
If Not IsError(x) Then '找到傳回數字
B(x, 6).Resize(, 10).Interior.ColorIndex = 6
A(i, 1).Resize(, 10).Interior.ColorIndex = 6
A(i, 11 + xX) = B(x, 1) 'B,C,D,E組的分數
End If
Next
End Sub
複製代碼
另外建議每張工作表應有相同之格式(可以作到的),這樣就可以只用一個活頁簿模組
如每張工作表之格式不同,那就要每張工作表分別放工作表模組
作者:
GBKEE
時間:
2012-2-28 16:11
回復
15#
donod
With Target
If Target.Address(0, 0) = "Q8" Then '選擇了 Q8
Set B = .Range("V9:AJ20") '制訂 B 組(分數- PT8) 範圍
B.Select ' *** 加上這行看看 B的範圍在哪裡
16# 修改為 Set B = Range("V9:AJ20") 少了 一個點 Set B =
.
Range("V9:AJ20") 就正確了
有這 一點 代表是 以 With Target 為基點 所擴展的範圍
作者:
donod
時間:
2012-2-28 17:14
回復
16#
register313
可以了! 謝謝大大!
作者:
donod
時間:
2012-2-28 17:18
回復
17#
GBKEE
謝謝大大!這樣修改正確嗎?
[attach]9796[/attach]
作者:
GBKEE
時間:
2012-2-28 20:36
回復
19#
donod
如此只有SHEETS("1" )有程式碼可以, 其他工作表沒有是沒有動作的
作者:
donod
時間:
2012-2-28 21:56
回復
20#
GBKEE
明白,就如兩位大大所說,每張工作表有相同之格式是最方便。
再次謝謝兩位大大教導!
作者:
donod
時間:
2012-2-29 00:09
回復
20#
GBKEE
現在改用Workbook,但用了較多數據,沒有顯示結果,煩請大大檢查,謝謝!
[attach]9801[/attach]
作者:
register313
時間:
2012-2-29 00:47
回復
22#
donod
Option Explicit
'ThisWorkbook 的預設事件
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim xX As Integer, Ar(), A As Range, B As Range, i As Integer, x As Variant
With Sh
If Target.Address(0, 0) = "R8" Then '選擇了 P7
Set B = Range("Z9:AO1500") '制訂 B 組(最頂1個利潤- 最後最底1個OPT) 範圍
'而Set B = .Range("V9:AJ20"), Range之前 有 一點 代表是 以 With Target 為基點 所擴展的範圍
' B.Select ' 加上這行 可顯示 B的範圍在哪裡
xX = 0 ' P欄
ElseIf Target.Address(0, 0) = "S8" Then '選擇了 Q7
Set B = Range("AR9:BG1500") '制訂 C組(最頂1個利潤- 最後最底1個OPT) 範圍
'B.Select
xX = 1 ' P欄 右移一欄 :Q欄
ElseIf Target.Address(0, 0) = "T8" Then '選擇了 R7
Set B = Range("BJ9:BY1500") '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 2 ' P欄 右移二欄 :R欄
ElseIf Target.Address(0, 0) = "U8" Then '選擇了 Q7
Set B = Range("CB9:CQ1500") '制訂 C組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 3 ' P欄 右移3欄 :Q欄
ElseIf Target.Address(0, 0) = "V8" Then '選擇了 R7
Set B = Range("CT9:DI1500") '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 4 ' P欄 右移4欄 :R欄
ElseIf Target.Address(0, 0) = "W8" Then '選擇了 R7
Set B = Range("DL9:EA1500") '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 5 ' P欄 右移5欄 :R欄
Else
Exit Sub '離開程序
End If
Set A = Range("H9:Q1500") '制訂 A 組(全部OPT) 範圍
A.Interior.ColorIndex = xlNone '清除A 組(OPT1-OPT10) 範圍圖樣
B.Interior.ColorIndex = xlNone '清除B ,C , D. 組 範圍圖樣
ReDim Ar(1 To A.Rows.Count) '重新宣告 陣列的維數
For i = 1 To B.Rows.Count '取得B,C,D,組的 (OPT1-OPT10) 的內容 置入陣列 Ar
Ar(i) = Join(Application.Transpose(Application.Transpose(B(i, 7).Resize(, 10))), ",")
Next
For i = 1 To A.Rows.Count
x = Join(Application.Transpose(Application.Transpose(A(i, 1).Resize(, 10))), ",")
x = Application.Match(x, Ar, 0) '工作表函數Match 在Ar尋找 相同字串
A(i, 11 + xX) = "" '清除
If Not IsError(x) Then '找到傳回數字
B(x, 7).Resize(, 10).Interior.ColorIndex = 6
A(i, 1).Resize(, 10).Interior.ColorIndex = 6
A(i, 11 + xX) = B(x, 1) 'B,C,D,組的分數
End If
Next
End With
End Sub
複製代碼
作者:
donod
時間:
2012-2-29 02:39
回復
23#
register313
謝謝大大!
35. Ar(i) = Join(Application.Transpose(Application.Transpose(B(i, 7).Resize(, 10))), ",")
40. A(i, 11 + xX) = ""
請問以上的(B(i, 7).Resize(, 10)) 和 A(i, 11 + xX)是指什麼位置?
作者:
register313
時間:
2012-2-29 09:23
回復
24#
donod
Set B = Range("Z9:AO1500")
則B(1,1)= Range("Z9") B(1,2)= Range("AA9") B(1,3)= Range("AB9") …
B(2,1)= Range("Z10") B(2,2)= Range("AA10") B(2,3)= Range("AB10") …
若i=1,則B(i, 7).Resize(, 10)= B(1, 7).Resize(, 10)= Range("AF9").Resize(, 10) = Range("AF9:AO9")
若i=2,則B(i, 7).Resize(, 10)= B(2, 7).Resize(, 10)= Range("AF10").Resize(, 10) = Range("AF10:AO10")
Set A = Range("H9:Q1500")
若xX=0,i=1,則A(i, 11 + xX)= A(1, 11)= Range("R9")
若xX=0,i=2,則A(i, 11 + xX)= A(2, 11)= Range("R10")
作者:
donod
時間:
2012-2-29 11:06
回復
25#
register313
謝謝大大回覆!明白更多了。
如果其他組首300個PT組合個別跟A組首50個PT組合配對,請教應如何改寫?
作者:
register313
時間:
2012-2-29 11:57
回復
26#
donod
看看對不對
Option Explicit
'ThisWorkbook 的預設事件
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim xX As Integer, Ar(), Br(), A As Range, B As Range, i As Integer, x As Variant
With Sh
If Target.Address(0, 0) = "R8" Then '選擇了 P7
Set B = Range("Z9:AO9").Resize(300) '制訂 B 組(最頂1個利潤- 最後最底1個OPT) 範圍
'而Set B = .Range("V9:AJ20"), Range之前 有 一點 代表是 以 With Target 為基點 所擴展的範圍
' B.Select ' 加上這行 可顯示 B的範圍在哪裡
xX = 0 ' P欄
ElseIf Target.Address(0, 0) = "S8" Then '選擇了 Q7
Set B = Range("AR9:BG9").Resize(300) '制訂 C組(最頂1個利潤- 最後最底1個OPT) 範圍
'B.Select
xX = 1 ' P欄 右移一欄 :Q欄
ElseIf Target.Address(0, 0) = "T8" Then '選擇了 R7
Set B = Range("BJ9:BY9").Resize(300) '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 2 ' P欄 右移二欄 :R欄
ElseIf Target.Address(0, 0) = "U8" Then '選擇了 Q7
Set B = Range("CB9:CQ9").Resize(300) '制訂 C組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 3 ' P欄 右移3欄 :Q欄
ElseIf Target.Address(0, 0) = "V8" Then '選擇了 R7
Set B = Range("CT9:DI9").Resize(300) '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 4 ' P欄 右移4欄 :R欄
ElseIf Target.Address(0, 0) = "W8" Then '選擇了 R7
Set B = Range("DL9:EA9").Resize(300) '制訂 D組(最頂1個利潤- 最後最底1個OPT) 範圍
xX = 5 ' P欄 右移5欄 :R欄
Else
Exit Sub '離開程序
End If
Set A = Range("H9:Q9").Resize(50) '制訂 A 組(全部OPT) 範圍
A.Interior.ColorIndex = xlNone '清除A 組(OPT1-OPT10) 範圍圖樣
B.Interior.ColorIndex = xlNone '清除B ,C , D. 組 範圍圖樣
' ReDim Ar(1 To A.Rows.Count) '重新宣告 陣列的維數
ReDim Br(1 To B.Rows.Count)
For i = 1 To B.Rows.Count '取得B,C,D,組的 (OPT1-OPT10) 的內容 置入陣列 Ar
Br(i) = Join(Application.Transpose(Application.Transpose(B(i, 7).Resize(, 10))), ",")
Next
For i = 1 To A.Rows.Count
x = Join(Application.Transpose(Application.Transpose(A(i, 1).Resize(, 10))), ",")
x = Application.Match(x, Br, 0) '工作表函數Match 在Ar尋找 相同字串
A(i, 11 + xX) = "" '清除
If Not IsError(x) Then '找到傳回數字
B(x, 7).Resize(, 10).Interior.ColorIndex = 6
A(i, 1).Resize(, 10).Interior.ColorIndex = 6
A(i, 11 + xX) = B(x, 1) 'B,C,D,組的分數
End If
Next
End With
End Sub
複製代碼
作者:
donod
時間:
2012-2-29 12:36
回復
27#
register313
可行了,也知多點,謝謝大大教導!
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)