返回列表 上一主題 發帖

[發問] 公式程式碼化

回復 10# ML089
標示底色_ML089.rar (105.69 KB)   =>可按清除鍵測試
版主 :
您是不是誤解需求的意思了
If Not....Is Nothing.....
變成<>""的儲存格全部標示藍色
請賜正!謝謝您

TOP

回復 11# ziv976688

Match 做法寫給你

Sub 標示底色_Ex()
Dim Arr, Shs$, Num, Sh As Worksheet, Rg As Range
Shs = "準2進3 準3進4 準4進5 準5進6 準6進7 準7進8"
For Each Sh In Sheets(Split(Shs)): With Sh
  Arr = .[M2].End(4).Resize(, 7)
  Arr = Application.Transpose(Application.Transpose(Arr))  '轉一維
  For Each Rg In Union(.Range("A4:A52"), .Range("D2:J" & .[B65536].End(xlUp).Row - 1))
    Rg.Interior.ColorIndex = 0                           '清底色
    For Each Num In Split(Rg, ",")
      K = Application.Match(--Num, Arr, 0)                     '-- 轉數字比對
      If Not IsError(K) Then Rg.Interior.ColorIndex = 8  '標示藍底色
    Next Num
  Next Rg
End With: Next Sh
End Sub
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2021-7-25 18:00 編輯

回復 1# ziv976688

針對1樓需求~~版主已完成,再錦上添花一下~~

看你的序號從 1853~1878,若數列多

陣列運算,速度應該會快一些

純數值才可以這樣做,改變儲存格顏色啥的,用儲存格就好~


Sub 餘數()
Dim Arr(1 To 2), Brr, Sh As Worksheet, Shs$
Shs = "準2進3 準3進4 準4進5 準5進6 準6進7 準7進8"
For Each Sh In Sheets(Split(Shs)): With Sh
  Rn& = .[B2].End(4).Row - 1: ReDim Brr(1 To Rn, 1 To 7)
  Arr(1) = .[M2].Resize(Rn, 7): Arr(2) = .[V2].Resize(Rn, 7)
  For R = 1 To Rn: For C = 1 To 7
    For Each Num In Split(Arr(2)(R, C), ",")
      餘數 = (Arr(1)(R, C) + Num - 1) Mod 49 + 1
      Brr(R, C) = Brr(R, C) & "," & Format(餘數, "00")
    Next Num
    Brr(R, C) = Mid(Brr(R, C), 2)
  Next C: Next R
  .[D30].Resize(Rn, 7) = Brr   '測試用
  '.[D2].Resize(Rn, 7) = Brr     '正確位置
End With: Next Sh
End Sub
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 11# ziv976688
是最後一列資料,我看錯了,修正如下
Sub 標示底色_ML089()
    Dim xD As Object, xS As Worksheet, xR As Range, SP, r
    Set xD = CreateObject("Scripting.Dictionary")
    For Each xS In Sheets(Array("準2進3", "準3進4", "準4進5", "準5進6", "準6進7", "準7進8"))    '取表格
        r = xS.[B65536].End(xlUp).Row
        For Each xR In xS.Range("A4:A" & xS.[A65536].End(xlUp).Row)    '取儲存格
            xR.Interior.ColorIndex = 0 '清底色
            'If xR > 0 And xR = xS.Range("M" & xS.[B65536].End(xlUp).Row, "S" & xS.[B65536].End(xlUp).Row) Then xR.Interior.ColorIndex = 8  '標示藍底色
            If Not xS.Range("M" & r, "S" & r).Find(xR, LookAt:=xlWhole) Is Nothing Then xR.Interior.ColorIndex = 8  '標示藍底色
        Next

        For Each xR In xS.Range("D2:J" & r - 1)    '取儲存格
            xR.Interior.ColorIndex = 0 '清底色
            For Each SP In Split(xR, ",")    '分開數字
                'If Val(SP) > 0 And Val(SP) = xS.Range("M" & xS.[B65536].End(xlUp).Row, "S" & xS.[B65536].End(xlUp).Row) Then xD(Val(SP)).Interior.ColorIndex = 8 '標示藍底色
                If Not xS.Range("M" & r, "S" & r).Find(Val(SP), LookAt:=xlWhole) Is Nothing Then xR.Interior.ColorIndex = 8: Exit For     '標示藍底色
            Next
        Next
    Next
End Sub
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 12# n7822123
測試成功
謝謝您的幫忙和指導~感恩

TOP

本帖最後由 ziv976688 於 2021-7-25 19:51 編輯

回復 13# n7822123
測試成功
謝謝您的幫忙和指導~感恩

不好意思,請教一下 :
  列8
  For Each Num In Split(Arr(2)(R, C), ",")
      餘數 = (Arr(1)(R, C) + Num - 1) Mod 49 + 1
請問 :
Num是指填入控制箱的期距數  Num = "25" 嗎?
還是只是變數 ?
謝謝您

TOP

本帖最後由 ziv976688 於 2021-7-25 20:07 編輯

回復 14# ML089
測試成功
謝謝您的幫忙和指導~感恩

請教一下 :
Module 3  餘數登錄
執行起來會卡卡的~游標一值跳
如果把DATA!VB編輯器的列47  Call 餘數登錄 點為註解~
游標就正常不跳了。
請問 :
這是什麼原因 ?
是不是我的電腦有問題 ?
標示底色_ML089_V1.rar (107.08 KB)
謝謝您

TOP

本帖最後由 singo1232001 於 2021-7-25 20:29 編輯

回復 17# ziv976688

公式程式碼化_singo1232001_v2.zip (140.41 KB)

TOP

回復 18# singo1232001
測試成功
謝謝您的幫忙和指導~感恩

TOP

本帖最後由 singo1232001 於 2021-7-25 21:34 編輯
回復  n7822123
測試成功
謝謝您的幫忙和指導~感恩

不好意思,請教一下 :
  列 ...
ziv976688 發表於 2021-7-25 19:45


不好意思,請教一下 :
  列8
  For Each Num In Split(Arr(2)(R, C), ",")
      餘數 = (Arr(1)(R, C) + Num - 1) Mod 49 + 1
請問 :
Num是指填入控制箱的期距數  Num = "25" 嗎?
還是只是變數 ?
謝謝您
'------------------------------------------
幫忙解讀一下
這段是縮寫
需要先拆分
並且先從split的基礎運用方式 先學
x=Split(Arr(2)(R, C), ",")
要先了解這段的意思
就必須先了解
Arr(2)(R, C)
又是甚麼意思
Arr(1) 跟arr(2)
你就想像成 兩個虛擬的工作表 (實際名稱 "陣列")
所以
Arr(2)(R,C)
就代表在第二張虛擬工作表的 某個儲存格因為有R列C欄值
因為在陣列中 處理速度比較快 也比較單純
依照準2進3工作表[V2]匯入當前Arr(2)虛擬工作表的位置
最終 就能取得一組字串 比如 "8,27"
位置應該是Arr(2)陣列的(0,0)

那麼我們回到
x=Split(Arr(2)(R, C), ",")
意思就是
x=Split("8,27", ",")
這是一種你給他分隔值 她就幫你依照分隔值 切分的函數 並且會個別存放
如上的意思
我將8,27 依照","符號 切分
最後我會得到
8 與27兩個值  
分別放在
x(0)  <-裡面是8
x(1)  <-裡面是27
的堶
如果你給他的字串是5,4,3,2
那麼你就會得到
x(0) <-裡面是5
x(1) <-裡面是4
x(2) <-裡面是3
x(3) <-裡面是2

如上述 如果想要取得x(1)資料
我們就可以
y=x(1)
那麼y的值就是4

接著講
迴圈分兩種
for i = 1 to 4  這代表這回圈是 1 2 3 4
另一種是
for each a In x
這概念不同的地方很簡單

假設 現在面前有40個大頭兵 他們是A班
第一種就是 你說1號 他出來1號
而且 你必須確認裡面有多少人 才不會漏報 或者多報
第二種則是 你說 A班報數
這種方式 就不用知道這班有多少人存在
也就是 就從當前的順位第一個 到最後一個 一個一個自己站出來

這樣我們就能了解第一段
  For Each Num In Split("8,27", ",")

我們要裡面的 8,27 輪流站進去Num裡面
方便我們後續使用

當8進去Num之後
      餘數 = (Arr(1)(R, C) + Num - 1) Mod 49 + 1
我們繼續執行上面這段
Arr(1)(R,C) 是工作表上M2的位置 也就是11
最後就變成
餘數 = (11+8-1) mod 49 +1
最後答案
餘數= 18+1

然後 在進行下一個 27站出來
餘數 = (11+27-1) mod 49 +1
餘數= 38
最後再把 19跟38結合一起
就會變成
19,38

TOP

        靜思自在 : 有願放在心裡,沒有身體力行,正如耕田不播種,皆是空過因緣。
返回列表 上一主題