返回列表 上一主題 發帖

[發問] VBA_請簡化程式碼。謝謝!

回復 8# Airman
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, E As Variant, C As Variant
  4.     With Sheets(2)
  5.         Sheets(1).Range("J7", "P" & Sheets(2).[R6] + 5).Copy .[J7]
  6.         Set Rng = .[J7].Resize(.[J7].End(xlDown).Row, 7)
  7.         For Each E In Array(.[T5], .[T5] - .[T3], .[T5] - .[T3] * 2)
  8.                             '.T5,T5-T3,T5-T3*2 '91,82,73
  9.             C = Application.Match(.[R5], Rng.Rows(E), 0) '找到傳回數字
  10.             If IsNumeric(C) Then
  11.                 With Rng.Rows(E).Cells(C)
  12.                     .Interior.ColorIndex = 4
  13.                     .Font.ColorIndex = 3
  14.                     .Font.FontStyle = "粗體"
  15.                 End With
  16.             End If
  17.         Next
  18.     End With
  19. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 11# 准提部林
字串用 InStr , Split
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, E As Variant, C As Variant, Ar As String
  4.     Ar = "4,45,8"
  5.     With Sheets(2)
  6.         Sheets(1).Range("J7", "P" & Sheets(2).[R6] + 5).Copy .[J7]
  7.         Set Rng = .[J7].Resize(.[J7].End(xlDown).Row, 7)
  8.         For Each E In Array(.[T5], .[T5] - .[T3], .[T5] - .[T3] * 2)
  9.                             '.T5,T5-T3,T5-T3*2 '91,82,73
  10.             C = Application.Match(.[R5], Rng.Rows(E), 0) '找到傳回數字
  11.             If IsNumeric(C) Then
  12.                 With Rng.Rows(E).Cells(C)
  13.                     .Interior.ColorIndex = Split(Ar, ",")(0)
  14.                     .Font.ColorIndex = 3
  15.                     .Font.FontStyle = "粗體"
  16.                 End With
  17.                 If InStr(Ar, ",") Then Ar = Mid(Ar, InStr(Ar, ",") + 1)
  18.             End If
  19.         Next
  20.     End With
  21. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 17# Airman
  1. With Sheets(2)
  2.    ' 如准提部林版主 的
  3.     Application.Goto .Range("T7:T" & .[R7].End(xlDown).Row) '不用Select,直接跳選目標區 
  4.    '或 .Activate   
  5.   '或 .Select
  6.    '使Sheets(2) 為作用中工作頁,儲存格才可用.Activate 或.Select
  7.     '
  8.     .[A1].Activate   
  9. '或.[A1].Select
  10. End With
複製代碼
請在指明要簡化的程式碼在哪裡
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 19# Airman
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, E As Variant, C As Variant, Ar As String, x_No, x As Variant
  4.     x_No = Array(7, 39)
  5.     Ar = "4,45,8"
  6.     With Sheets(2)  '
  7.     'With Sheets("Sheet1")
  8.         .Activate   '將目前的工作表成為使用中的工作表。等同於按一下工作表索引標籤。

  9.         Sheets(1).Range("J7", "P" & Sheets(2).[R6] + 5).Copy .[J7]
  10.         Set Rng = .[J7].Resize(.[J7].End(xlDown).Row, 7)
  11.         For Each E In Array(.[T5].Value, .[T5] - .[T3], .[T5] - .[T3] * 2) '期別的迴圈
  12.             '『搜尋在R7(=90期),R7-T3(=81期),R7-T3*2(=72期)三個期數~
  13.             '.T5,T5-T3,T5-T3*2 '91,82,73 請修改公式
  14.             
  15.             For Each x In x_No   '比對數字的迴圈
  16.                 C = Application.Match(x, Rng.Rows(E), 0) '找到傳回數字
  17.                 If IsNumeric(C) Then
  18.                     With Rng.Rows(E).Cells(C)
  19.                         .Interior.ColorIndex = Split(Ar, ",")(0)
  20.                         .Font.ColorIndex = 3
  21.                         .Font.FontStyle = "粗體"
  22.                     End With
  23.                 End If
  24.             Next
  25.             If InStr(Ar, ",") Then Ar = Mid(Ar, InStr(Ar, ",") + 1)
  26.         Next
  27.         .[a1].Select  '滑鼠停留在Sheets(2)的 A1
  28.     End With
  29. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 21# Airman
你想要某一期數中開出的號碼(最多7個)或是指定的號碼,在下幾期中標出顏色
數字範圍:01~49。可能有1個,可能有2個,....最多7個。   
所以交集數字是依據有數字的T欄之對應R欄期數而變化

你的規律邏輯 ,附檔中可指明嗎? 說清楚.


  1. For Each E In Array(.Range("R" & b.Row).Value, .Range("R" & b.Row) - .[T3], .Range("R" & b.Row) - .[T3] * 2)
複製代碼

沒程式碼看不懂 ,
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 29# Airman
有一個(含)以上的交集值(07,39)時
交集值 應有規律性,可讓程式去設定
試試看
  1. Option Explicit
  2. Private Sub CommandButton1_Click()
  3.     Dim b As Range, Rng As Range, E, C As Variant, Ar(), x_No, x As Variant
  4.     Dim xRng As Range, Color_Ar(), i As Integer
  5.     x_No = Array(7, 39)
  6.     Color_Ar = Array(4, 45, 8)
  7.     With Sheets(2)
  8.         .Activate   '將目前的工作表成為使用中的工作表。等同於按一下工作表索引標籤。
  9.         Sheets(1).Range("J7", "P" & Sheets(2).[R6] + 5).Copy .[J7]
  10.         Set Rng = .Range("J7:P" & .[R6] + 5)                '所複製資料的範圍
  11.         Set xRng = .Range("T7:T" & .[R6] + 5)               'T欄的範圍
  12.         If Application.Count(xRng) = 0 Then Exit Sub        'T欄沒有期數時離開程式
  13.         For Each b In xRng.SpecialCells(xlCellTypeConstants) 'T欄 [有期數的儲存格]範圍
  14.             Ar = Array(.Range("R" & b.Row).Value, .Range("R" & b.Row) - .[T3], .Range("R" & b.Row) - .[T3] * 2) '期別的陣列
  15.             '陣列:其在R欄的對應期數
  16.             For i = 0 To UBound(Ar)                 '陣列元素下限值從0開使
  17.                 For Each x In x_No                  '比對數字的迴圈
  18.                     C = Application.Match(x, Rng.Rows(Ar(i)), 0) '找到傳回數字
  19.                     If IsNumeric(C) Then Rng.Rows(Ar(i)).Cells(C).Interior.ColorIndex = Color_Ar(i)
  20.                 Next
  21.             Next
  22.         Next
  23.         .[a1].Select  '滑鼠停留在Sheets(2)的 A1
  24.     End With
  25. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2015-11-24 14:45 編輯

回復 34# Airman

參考准提部林 版主說明
試試看
  1. Option Explicit
  2. Dim Sh As Worksheet '這模組的私用變數
  3. Private Sub CommandButton1_Click()
  4.     Dim b As Range, Rng As Range
  5.     Dim xRng(1 To 2) As Range
  6.     With Sheets("Sheet1") '要呈現的工作表
  7.         Sheets("DATA").Range("J7", "P" & .[R6] + 5).Copy .[J7]
  8.         Set Rng = .Range("J7:P" & .[R6] + 5)                   '所複製資料的範圍
  9.         Rng.Interior.ColorIndex = xlNone
  10.         Set xRng(1) = .Range("T7:T" & .[R6] + 5)               'T欄的範圍
  11.         If Application.Count(xRng(1)) = 0 Then Exit Sub        'T欄沒有期數時離開程式
  12.         
  13.         Set Sh = Sheets.Add(Sheets(1))                         '增加一工作表
  14.         Application.ScreenUpdating = False                     '如果螢幕更新功能是開啟的則為 True
  15.         For Each b In xRng(1).SpecialCells(xlCellTypeConstants) 'T欄 [有期數的儲存格]範圍
  16.             Ex_ChiCK Union(Rng.Rows(.Range("R" & b.Row)), Rng.Rows(.Range("R" & b.Row) - .[T3]), Rng.Rows(.Range("R" & b.Row) - .[T3] * 2))  '期別的陣列
  17.             'Ex_ChiCK Union(Rng.Rows(.Range("R" & b.Row) - .[T3] * 2), Rng.Rows(.Range("R" & b.Row) - .[T3]), Rng.Rows(.Range("R" & b.Row)))  '倒轉期別
  18.         Next
  19.         .Activate   '將目前的工作表成為使用中的工作表。等同於按一下工作表索引標籤。
  20.         .[a1].Select  '滑鼠停留在Sheets(2)的 A1
  21.     End With
  22.     Application.DisplayAlerts = False  '如果巨集在執行時 Microsoft Excel 顯示特定的警告和訊息則為 True
  23.     Sh.Delete                          '刪除:工作表
  24.     Application.DisplayAlerts = True
  25.     Application.ScreenUpdating = True
  26. End Sub
  27. Private Sub Ex_ChiCK(Rng As Range)  '副程式 須傳送參數
  28.     Dim Ar(), i As Variant, E As Variant, X As Variant, M As Integer
  29.     Ar = Array(4, 45, 8)
  30.     Rng.Copy Sh.[a1]             '複製三期資料
  31.     For i = 1 To 49
  32.         X = Application.CountIf(Sh.UsedRange, i)  'x = 3 :同一號碼三期都出現
  33.         If X = 3 Then E = E & IIf(E <> "", ",", "") & i  '紀錄號碼
  34.     Next
  35.     X = Split(E, ",")        '出現3次的號碼,置入陣列
  36.     For Each E In X
  37.         For i = 1 To Rng.Areas.Count
  38.             '傳回 Areas 集合,此集合代表多重範圍中的所有範圍
  39.             M = Application.Match(Val(E), Rng.Areas(i).Cells, 0)
  40.             Rng.Areas(i).Cells(M).Interior.ColorIndex = Ar(i - 1) '依範圍傳回的顏色
  41.         Next
  42.     Next
  43. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 改變自己是自救,影響別人是救人。
返回列表 上一主題