返回列表 上一主題 發帖

請問如何在一欄數字當中 最大值 次大值 第三大值 設不同底色

本帖最後由 Kubi 於 2016-4-10 21:11 編輯

另外提供幾種色彩標示法做參考:

一、先[給值](產生新樣本),以方便做測試
二、利用[輔助欄排序法]來填色
三、利用[輔助欄非排序法]來填色
四、利用[陣列法]來填色
五、[排序]是作為填色後,方便資料驗證之用
六、如用字點檔(Dictionary)來填色也可盡功,請自行撰寫

底下就式程式碼拙作:

Option Base 1

Sub 給值()
    Randomize
    Cells.Interior.ColorIndex = xlNone
    Cells.ClearContents
    er = Int(Rnd * 100) + 10
    Application.ScreenUpdating = False
    For c = 1 To Int(Rnd * 10) + 2
        For r = 1 To er
            Cells(r, c).Value = Int(Rnd * 1000)
        Next r
    Next c
    Application.ScreenUpdating = True
End Sub

Sub 輔助欄排序法()
    ci = Array(3, 8, 6)
    er = [A1].CurrentRegion.Rows.Count
    ec = [A1].CurrentRegion.Columns.Count + 1
    Application.ScreenUpdating = False
    For i = 1 To er
        Cells(i, ec).Value = i
    Next i
    For c = 1 To ec - 1
        Range(Cells(1, c), Cells(er, ec)).Sort key1:=Cells(1, c), order1:=2
        x = -1
        n = -1
        For Each cell In Cells(1, c).Resize(er)
            If cell.Value <> n Then
                n = cell.Value
                x = x + 1
                If x = 3 Then Exit For
                cell.Interior.ColorIndex = ci(x + 1)
            Else
                cell.Interior.ColorIndex = ci(x + 1)
            End If
        Next cell
        Range(Cells(1, c), Cells(er, ec)).Sort key1:=Cells(1, ec), order1:=1
    Next c
    Columns(ec).ClearContents
    Application.ScreenUpdating = True
End Sub

Sub 輔助欄非排序法()
    ci = Array(3, 8, 6)
    er = [A1].CurrentRegion.Rows.Count
    ec = [A1].CurrentRegion.Columns.Count
    Application.ScreenUpdating = False
    For c = 1 To ec
        Range(Cells(1, ec + 1), Cells(er, ec + 2)).ClearContents
        For r = 1 To er
            For i = 1 To 3
                If Cells(i, ec + 1).Value = "" Then
                    Cells(i, ec + 1).Value = Cells(r, c).Value
                    Cells(i, ec + 2).Value = Trim(r)
                    Exit For
                Else
                    If Cells(r, c).Value = Cells(i, ec + 1).Value Then
                        Cells(i, ec + 2).Value = Cells(i, ec + 2).Value & "," & Trim(r)
                        Exit For
                    Else
                        If Cells(r, c).Value > Cells(i, ec + 1).Value Then
                            Range(Cells(i, ec + 1), Cells(i, ec + 2)).Insert Shift:=xlDown
                            Cells(i, ec + 1).Value = Cells(r, c).Value
                            Cells(i, ec + 2).Value = Trim(r)
                            Exit For
                        End If
                    End If
                End If
            Next i
        Next r
        For i = 1 To 3
            n = Split(Cells(i, ec + 2).Value, ",")
            For j = 0 To UBound(n)
                Cells(n(j), c).Interior.ColorIndex = ci(i)
            Next j
        Next i
    Next c
    Range(Cells(1, ec + 1), Cells(er, ec + 2)).ClearContents
    Application.ScreenUpdating = True
End Sub

Sub 陣列法()
    Dim arr
    Dim brr()
    ci = Array(3, 8, 6)
    arr = [A1].CurrentRegion
    ec = UBound(arr, 2)
    er = UBound(arr)
    For c = 1 To ec
        ReDim brr(3, 2)
        For r = 1 To er
            n = arr(r, c)
            For i = 1 To 3
                If n = brr(i, 1) Then
                    brr(i, 2) = brr(i, 2) & "," & r
                    Exit For
                End If
                If brr(i, 1) = "" Then
                    brr(i, 1) = n
                    brr(i, 2) = r
                    Exit For
                Else
                    If n > brr(i, 1) Then
                        For j = 3 To i + 1 Step -1
                            brr(j, 1) = brr(j - 1, 1)
                            brr(j, 2) = brr(j - 1, 2)
                        Next j
                        brr(i, 1) = n
                        brr(i, 2) = r
                        Exit For
                    End If
                End If
            Next i
        Next r
        For i = 1 To 3
            x = Split(brr(i, 2), ",")
            For j = 0 To UBound(x)
                Cells(x(j), c).Interior.ColorIndex = ci(i)
            Next j
        Next i
    Next c
End Sub

Sub 排序()
    ec = [A1].End(2).Column
    er = [A65536].End(3).Row
    Application.ScreenUpdating = False
    For c = 1 To ec
        Range(Cells(1, c), Cells(er, c)).Sort key1:=Cells(1, c), order1:=2
    Next c
    Application.ScreenUpdating = True
End Sub
[b]Kubi[/b]

TOP

回復 3# peter95
VBA 參考這裡    http://forum.twbts.com/thread-16926-1-1.html
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 2# luhpro

感謝回復

請問 有辦法寫成VBA嗎
還有 我執行 不出來
請在幫幫我
感謝
學習 學習 一直學習

TOP

本帖最後由 luhpro 於 2016-4-1 03:34 編輯

回復 1# peter95
先選取 A1 到 A30(請依實際情修改末列列號) 儲存格, 再依底下圖片內容設定即可.

TOP

        靜思自在 : 【時間如鑽石】時間對一個有智慧的人而言,就如鑽石般珍貴;但對愚人來說,卻像是一把泥土,一點價值也沒有。
返回列表 上一主題