返回列表 上一主題 發帖

[發問] 階層邏輯判斷

[發問] 階層邏輯判斷

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檔案

謝謝 : )
  1. Sub choose()
  2.    
  3.     Row = Worksheets(1).Range("A35536").End(xlUp).Row

  4.    
  5.     lv = 6
  6.     Dim i As Integer
  7.    
  8.     For i = 1 To Row
  9.    
  10.           'Debug.Print "No." & i
  11.           'Debug.Print "lv:" & lv
  12.                
  13.                
  14.            If Range("A" & i) <> "" And Range("F" & i) = "" Then 'And lv <= 6 Then
  15.            Range("H" & i) = "color1"
  16.            lv = 5
  17.            End If
  18.                

  19.            If Range("B" & i) <> "" And Range("F" & i) = "" And lv <= 5 Then
  20.            Range("H" & i) = "color2"
  21.            lv = 4
  22.            End If


  23.            If Range("C" & i) <> "" And Range("F" & i) = "" And lv <= 4 Then
  24.            Range("H" & i) = "color3"
  25.            lv = 3
  26.            End If
  27.             
  28.    
  29.            If Range("D" & i) <> "" And Range("F" & i) = "" And lv <= 3 Then
  30.            Range("H" & i) = "color4"
  31.            lv = 2
  32.            End If
  33.                
  34.                
  35.            If Range("E" & i) <> "" And Range("F" & i) = "" And lv <= 2 Then
  36.            Range("H" & i) = "color5"
  37.            lv = 1
  38.            End If
  39.                
  40.                
  41.     Next
  42.    
  43. End Sub
複製代碼
Test.zip (15.97 KB)

回復 1# li_hsien
試試看是這樣嗎?
  1. Option Explicit
  2. Sub choose()
  3.     Dim i As Integer, Rng As Range, lv As Integer
  4.     With Worksheets(1)
  5.         lv = 6
  6.         For i = 1 To .Range("G35536").End(xlUp).Row
  7.             .Range("G" & i).Interior.ColorIndex = IIf(.Range("F" & i) = "", 3, lv)
  8.             .Range("h" & i) = ""
  9.             If .Range("F" & i) = "" Then
  10.                 Set Rng = .Range("A" & i).Resize(, 5).Find("*")
  11.                 .Range("h" & i) = "color" & Rng.Column
  12.             End If
  13.         Next
  14.     End With
  15. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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(紅色)

TOP

回復 3# li_hsien

附檔是正確該出現的儲存格顏色
後面的COLOER1.2.3...
是我參考修改用的


給您可以參考一下

謝謝 : )

Test.zip (16.06 KB)

TOP

本帖最後由 GBKEE 於 2013-10-28 16:22 編輯

再試試看
  1. Option Explicit
  2. Sub choose()
  3.     Dim flag As Boolean, i As Integer, Rng As Range
  4.     With Worksheets(1)
  5.         For i = 1 To .Range("G35536").End(xlUp).Row  'G欄才真的有資料
  6.             .Range("h" & i) = ""
  7.             If .Range("a" & i) <> "" And .Range("F" & i) = "" Then
  8.                 flag = True
  9.             ElseIf .Range("a" & i) <> "" And .Range("F" & i) = "*" Then
  10.                 flag = False
  11.             End If
  12.             If flag = True And .Range("F" & i) = "" Then
  13.                Set Rng = .Range("A" & i).Resize(, 5).Find("*")
  14.                 .Range("h" & i) = "color" & Rng.Column
  15.             End If
  16.         Next
  17.     End With
  18. End Sub
複製代碼
回復 3# li_hsien
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 5# GBKEE

我就是卡在這邊XDD

第二個3因為他有標記*
所以以下的4.5階都不用變色
(G8~G18都不用變顏色)

直接跳到上一階(2)

來判斷變顏色
   
是一個回覆的附件
程式碼沒更改喔
我只讓表單顯示正確的顏色而已


麻煩囉 謝謝 : )

TOP

  1. Sub Test()
  2.   Dim CurrentLevel As Long, i As Long
  3.   Dim bMark As Boolean, ar() As Long
  4.   
  5.   With Sheets(1).[G1].CurrentRegion
  6.     ReDim ar(.Cells(1).Column - 1 To .Columns.Count)
  7.     ar(LBound(ar)) = vbRed
  8.    
  9.     For i = 1 To .Rows.Count
  10.       CurrentLevel = .Range(.Cells(i, "A"), .Cells(i, "E")).SpecialCells(xlCellTypeConstants).Column
  11.       bMark = (.Cells(i, "F").Value = "*")
  12.       
  13.       .Cells(i, "G").Interior.Color = IIf(bMark, vbYellow, ar(CurrentLevel - 1))
  14.       ar(CurrentLevel) = .Cells(i, "G").Interior.Color
  15.     Next
  16.   End With
  17. End Sub
複製代碼
回復 6# li_hsien

TOP

回復 6# li_hsien
再試試看
  1. Option Explicit
  2. Sub choose()
  3.     Dim flag(1 To 5) As Boolean, i As Integer, R As Integer, ii As Integer
  4.     With Worksheets(1)
  5.         .Range("a1", .Range("G35536").End(xlUp)).Interior.ColorIndex = 6
  6.         For i = 1 To .Range("G35536").End(xlUp).Row  'G欄才真的有資料
  7.             R = .Range("A" & i).Resize(, 5).Find("*", .Range("A" & i)).Column
  8.             If .Range("F" & i) = "*" And R = 1 Then Erase flag
  9.             If .Range("F" & i) = "" Then
  10.                 flag(R) = True
  11.             ElseIf .Range("F" & i) = "*" Then
  12.                 flag(R) = False
  13.             End If
  14.             For ii = 1 To R
  15.                 If flag(ii) = False Then GoTo 10:
  16.             Next
  17.             .Range("G" & i).Interior.ColorIndex = 3
  18. 10:
  19.         Next
  20.     End With
  21. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 7# stillfish00


謝謝大大的幫忙

不過我COPY來測試還是跟剛剛板大所PO出來的結果差不多

正常來說如果1階標記* 下面的都不需要變色

但那程式碼的結果還是會變色

: )

TOP

回復 8# GBKEE

OK了耶

但板大您的程式碼好精簡

我昨天想了一整天 最後也有想出來

不過都是用最基本的語法

邏輯判斷設了一大堆

我再慢慢研究這些比較專業的語法
還有stillfish00大提供的部分


希望能多學點

不然每次都是用一些沒有效率的作法來處理


謝謝 : )

TOP

        靜思自在 : 【時間無法遮擋】怕時間消逝,花了許多心血,想盡各式方法要遮擋時間,結果是:浪費了更多時間,且一無所成!
返回列表 上一主題