標題:
[發問]
階層邏輯判斷
[打印本頁]
作者:
li_hsien
時間:
2013-10-28 14:24
標題:
階層邏輯判斷
A B C D E F G
1 * 6B01M
2 6102B
2 6105B
1
2530B
2
2410M
2
241ZM
3
2110M
3 * 3100B
4 3200B
4 * 3200B
4 3600B
5 3600B
4 3B00B
4 * 3B00B
4 * 3B02M
5 3B01B0
4 * 3B02M
5 3B01B
2
4101B
2 * 4101B
2
4101B
2
4101B
上面的簡圖是我EXCEL中所出現的圖樣
(因為我無法用表格,只能牽強的用這種方式呈現....Sorry...)
數字是代表階層(由上而下檢視)
如果F欄沒有顯示*字號
則最後G欄的代碼顯示為紅色,反之有*則為黑色
階層的用意:
如果1階為*則2.3.4.5...階都為黑色(不用改變)
如果2階為*則3.4.5.......階都為黑色(不用改變)
.......
如果同階EX: 2下面接著是2則個別依據是否有*來做顏色判別
小弟我目前所做的,只能判別是否有*,但一直想不到該如何依階層判斷的邏輯
麻煩各位大大幫幫忙
以下附上程式碼及EXCEL檔案
謝謝 : )
Sub choose()
Row = Worksheets(1).Range("A35536").End(xlUp).Row
lv = 6
Dim i As Integer
For i = 1 To Row
'Debug.Print "No." & i
'Debug.Print "lv:" & lv
If Range("A" & i) <> "" And Range("F" & i) = "" Then 'And lv <= 6 Then
Range("H" & i) = "color1"
lv = 5
End If
If Range("B" & i) <> "" And Range("F" & i) = "" And lv <= 5 Then
Range("H" & i) = "color2"
lv = 4
End If
If Range("C" & i) <> "" And Range("F" & i) = "" And lv <= 4 Then
Range("H" & i) = "color3"
lv = 3
End If
If Range("D" & i) <> "" And Range("F" & i) = "" And lv <= 3 Then
Range("H" & i) = "color4"
lv = 2
End If
If Range("E" & i) <> "" And Range("F" & i) = "" And lv <= 2 Then
Range("H" & i) = "color5"
lv = 1
End If
Next
End Sub
複製代碼
[attach]16491[/attach]
作者:
GBKEE
時間:
2013-10-28 15:31
回復
1#
li_hsien
試試看是這樣嗎?
Option Explicit
Sub choose()
Dim i As Integer, Rng As Range, lv As Integer
With Worksheets(1)
lv = 6
For i = 1 To .Range("G35536").End(xlUp).Row
.Range("G" & i).Interior.ColorIndex = IIf(.Range("F" & i) = "", 3, lv)
.Range("h" & i) = ""
If .Range("F" & i) = "" Then
Set Rng = .Range("A" & i).Resize(, 5).Find("*")
.Range("h" & i) = "color" & Rng.Column
End If
Next
End With
End Sub
複製代碼
作者:
li_hsien
時間:
2013-10-28 15:54
回復
2#
GBKEE
(SORRY我怕版面跑掉所以用括號來註記顏色)
標紅色的是有()的序號
本身為*不用標色
以下的階級也都不用標
(1>2>3>4>5)
因為第一個1階他有標*
所以以下的不用標色
第二個1沒有標*
所以以下的2.3.4.5要做*判斷
到了第二個3有標*
所以以下的4.5都不需標色了
最下面的四個2往上階看是第二個1
因為1沒標*
所以那四個2自己做個別判斷
有*則不用標色,沒*則要標色
規則大致說明是這樣
有點亂,希望大大幫忙解決
謝謝 : )
1 * 6B01M
2 6102B
2 6105B
1 2530B(紅色)
2 2410M(紅色)
2 241ZM(紅色)
3 2110M(紅色)
3 * 3100B
4 3200B
4 * 3200B
4 3600B
5 3600B
4 3B00B
4 * 3B00B
4 * 3B02M
5 3B01B
4 * 3B02M
5 3B01B
2 4101B(紅色)
2 * 4101B
2 4101B(紅色)
2 4101B(紅色)
作者:
li_hsien
時間:
2013-10-28 16:08
回復
3#
li_hsien
附檔是正確該出現的儲存格顏色
後面的COLOER1.2.3...
是我參考修改用的
給您可以參考一下
謝謝 : )
[attach]16493[/attach]
作者:
GBKEE
時間:
2013-10-28 16:21
本帖最後由 GBKEE 於 2013-10-28 16:22 編輯
再試試看
Option Explicit
Sub choose()
Dim flag As Boolean, i As Integer, Rng As Range
With Worksheets(1)
For i = 1 To .Range("G35536").End(xlUp).Row 'G欄才真的有資料
.Range("h" & i) = ""
If .Range("a" & i) <> "" And .Range("F" & i) = "" Then
flag = True
ElseIf .Range("a" & i) <> "" And .Range("F" & i) = "*" Then
flag = False
End If
If flag = True And .Range("F" & i) = "" Then
Set Rng = .Range("A" & i).Resize(, 5).Find("*")
.Range("h" & i) = "color" & Rng.Column
End If
Next
End With
End Sub
複製代碼
回復
3#
li_hsien
作者:
li_hsien
時間:
2013-10-28 16:32
回復
5#
GBKEE
我就是卡在這邊XDD
第二個3因為他有標記*
所以以下的4.5階都不用變色
(G8~G18都不用變顏色)
直接跳到上一階(2)
來判斷變顏色
是一個回覆的附件
程式碼沒更改喔
我只讓表單顯示正確的顏色而已
麻煩囉 謝謝 : )
作者:
stillfish00
時間:
2013-10-29 13:56
Sub Test()
Dim CurrentLevel As Long, i As Long
Dim bMark As Boolean, ar() As Long
With Sheets(1).[G1].CurrentRegion
ReDim ar(.Cells(1).Column - 1 To .Columns.Count)
ar(LBound(ar)) = vbRed
For i = 1 To .Rows.Count
CurrentLevel = .Range(.Cells(i, "A"), .Cells(i, "E")).SpecialCells(xlCellTypeConstants).Column
bMark = (.Cells(i, "F").Value = "*")
.Cells(i, "G").Interior.Color = IIf(bMark, vbYellow, ar(CurrentLevel - 1))
ar(CurrentLevel) = .Cells(i, "G").Interior.Color
Next
End With
End Sub
複製代碼
回復
6#
li_hsien
作者:
GBKEE
時間:
2013-10-29 16:28
回復
6#
li_hsien
再試試看
Option Explicit
Sub choose()
Dim flag(1 To 5) As Boolean, i As Integer, R As Integer, ii As Integer
With Worksheets(1)
.Range("a1", .Range("G35536").End(xlUp)).Interior.ColorIndex = 6
For i = 1 To .Range("G35536").End(xlUp).Row 'G欄才真的有資料
R = .Range("A" & i).Resize(, 5).Find("*", .Range("A" & i)).Column
If .Range("F" & i) = "*" And R = 1 Then Erase flag
If .Range("F" & i) = "" Then
flag(R) = True
ElseIf .Range("F" & i) = "*" Then
flag(R) = False
End If
For ii = 1 To R
If flag(ii) = False Then GoTo 10:
Next
.Range("G" & i).Interior.ColorIndex = 3
10:
Next
End With
End Sub
複製代碼
作者:
li_hsien
時間:
2013-10-29 17:12
回復
7#
stillfish00
謝謝大大的幫忙
不過我COPY來測試還是跟剛剛板大所PO出來的結果差不多
正常來說如果1階標記* 下面的都不需要變色
但那程式碼的結果還是會變色
: )
作者:
li_hsien
時間:
2013-10-29 17:15
回復
8#
GBKEE
OK了耶
但板大您的程式碼好精簡
我昨天想了一整天 最後也有想出來
不過都是用最基本的語法
邏輯判斷設了一大堆
我再慢慢研究這些比較專業的語法
還有stillfish00大提供的部分
希望能多學點
不然每次都是用一些沒有效率的作法來處理
謝謝 : )
作者:
ui123
時間:
2013-10-29 19:14
感謝 前輩提供~看過受益良多!!!
作者:
stillfish00
時間:
2013-10-29 19:28
本帖最後由 stillfish00 於 2013-10-29 19:40 編輯
回復
9#
li_hsien
你在 For i = 1 To .Rows.Count 前一行加入 .Value = .Value 看看。
附檔的儲存格怪怪的,無法用特殊尋找找到常數儲存格,加上上面的重新賦值就可以了,不知道是為什麼::(
我的判斷邏輯是該行有星號就黃色,沒星號就和上一階同色,(並設定第0階為紅色)。
作者:
li_hsien
時間:
2013-10-30 08:54
回復
12#
stillfish00
加了那行就OK!!!
謝謝stillfish00大
我再來研究研究語法的內容
: )
作者:
li_hsien
時間:
2013-10-30 14:34
回復
8#
GBKEE
想起問版主大大
R = .Range("A" & i).Resize(, 5).Find("*", .Range("A" & i))
為什麼R會印出儲存格的數字?
.Range("A" & i).Resize(, 5) <-這段是選取A欄到F吧
.Find("*", .Range("A" & i)) <-這是找有*的儲存格位置,從A欄開始找吧
不知這樣的理解對不對
但我不清楚為什麼他會回傳前面的數字
以下用代碼的區塊
A B C D E F
1 * <-回傳1
2 <-回傳2
2 <-回傳2
3 * <-回傳3
複製代碼
麻煩大大幫我解惑一下 謝謝 : )
作者:
GBKEE
時間:
2013-10-30 15:43
回復
14#
li_hsien
Find("") ->尋找空白的儲存格
Find("*") ->尋找任何有資料的儲存格
.Find("*", .Range("A" & i)) 沒錯 : 是找有有資料的儲存格位置,從A欄開始找吧
作者:
li_hsien
時間:
2013-10-30 16:07
回復
15#
GBKEE
請問 :
Find("*") ->尋找任何有資料的儲存格
所以上面這個*字號
並不是找F欄的*
而是指"有資料"(非空值)的意思嗎???
作者:
GBKEE
時間:
2013-10-31 14:52
回復
16#
li_hsien
.Range("A" & i).Resize(, 5).Find("*", .Range("A" & i))
Resize將指定擴充為(幾列,幾欄)的範圍 -> Ai:Ei 的範圍.Find("*", .Range("A" & i))->Find("*" : 尋找有資料的儲存格.
F欄的* 在這裡判斷出來 -> ElseIf .Range("F" & i) = "*" Then
Dim flag(1 To 5) As Boolean-> 初始化 1 - 5 為 False
If .Range("F" & i) = "*" And R = 1 Then Erase flag
'*************************
Erase 陳述式
重新初始化固定大小陣列的元素,並釋放動態陣列的儲存空間。-> 1 - 5 為 False
'*******************************************
複製代碼
作者:
li_hsien
時間:
2013-10-31 15:17
回復
17#
GBKEE
謝謝板大
我測試了幾次就清楚了
又學到了一些東西
謝謝 : )
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)