返回列表 上一主題 發帖

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

回復 18# GBKEE
GBKEE超大:您好!
抱歉!小弟說的太囉嗦了,讓您誤解了~重新說明如下:
請教:
以貴#13的程式碼,如果要再增加~
1.『搜尋在R7(=90期),R7-T3(=81期),R7-T3*2(=72期)三個期數同時有一個(含)以上的交集值(=07,39);並分別將其標示4,45,8號底色』~
應該怎麼再增寫?
2.程式執行結束後,滑鼠停留在A1,請問要怎麼增寫?

以上敬請惠予賜教!謝謝您!

TOP

本帖最後由 Airman 於 2015-11-23 10:24 編輯

回復 20# GBKEE
GBKEE超大:
不好意思,有點誤差~但不好說明,小弟盡力就是~
07,39只是舉例符合範例中之期數的交集數字,~所以交集數字是依據有數字的T欄之對應R欄期數而變化。

因此~小弟將列12改為:
For Each E In Array(.Range("R" & b.Row).Value, .Range("R" & b.Row) - .[T3], .Range("R" & b.Row) - .[T3] * 2) '期別的迴圈
程式就中斷了。

請教:
x_No = Array(7, 39)和"期別的迴圈"或其它相關的程式碼應如何再修正?
敬請賜正!謝謝您:lol

PS:交集的數字範圍:01~49。可能有1個,可能有2個,....最多7個。

TOP

回復 22# GBKEE
  就如附檔中的列19~列33
For i = 10 To 16
   For j = 10 To 16
    For k = 10 To 16
           If .Cells(.Range("R" & b.Row) + 6, i) = .Cells(.Range("R" & b.Row) - .[T3] + 6, j Then
           If .Cells(.Range("R" & b.Row) + 6, i) = .Cells(.Range("R" & b.Row) - .[T3] * 2 + 6, k) Then
           If .Cells(.Range("R" & b.Row) - .[T3] + 6, j) = .Cells(.Range("R" & b.Row) - .[T3] * 2 + 6, k) Then
              .Cells(.Range("R" & b.Row) + 6, i).Interior.ColorIndex = 4
              .Cells(.Range("R" & b.Row) - .[T3] + 6, j).Interior.ColorIndex = 45
              .Cells(.Range("R" & b.Row) - .[T3] * 2 + 6, k).Interior.ColorIndex = 8
           End If
           End If
           End If

簡單的說:就是將上述程式碼的需求化為貴程式碼~然後將上述的程式碼移除即可。

可能是因為貴程式碼少了類似#11的程式碼~
Application.Goto .Range("T7:T" & .[R7].End(xlDown).Row)

For Each b In Selection
If b <> "" Then
...
Next b
所以(.Range("R" & b.Row) 套不進去貴程式中之"期別的迴圈"~
小弟VBA初學,只是猜測可能的原因~不敢就此妄斷

以上 謹供參考!謝謝您!

TOP

回復 24# 准提部林
准大:
測試OK了~感恩
小弟以為要改為Offset,弄了老半天,就是跑不出結果

#15可否請您再次指導~謝謝您

TOP

本帖最後由 Airman 於 2015-11-24 01:44 編輯

回復 27# 准提部林
准大:
感謝您的賜教!多學習了另種程式寫法。感恩:lol

"程式碼自己寫的,自己看得懂"
小弟可能是在"認知上"有誤解了~超版大都已經看得懂貴語法~
因為自己覺得小弟寫的是最粗淺一條一條逐條敘述的語法,而且有範例,以為大家應該都看得懂,所以沒有再加註~
這一點經您一說,對超版大深覺抱歉!在此特向超版大謹致歉意:L

其實這次會想簡化程式碼,起因是想儘量少用迴圈,除了提升執行效率也減少變數得使用,再者是拜讀您簡化的語法後,覺得很接近A知識長的寫法~
且更簡扼易懂,然後又拜讀超版大的語法,又更簡呃,所以才又將交集值語法提出簡化需求~
給二位先進添麻煩,深感不安,敬請涵諒!

TOP

本帖最後由 Airman 於 2015-11-24 03:07 編輯

回復 22# GBKEE
超版大:
抱歉!小弟覺得自己寫的是最粗淺一條一條逐條敘述的語法,而且有範例,所以沒有再加註~不察之處,敬請涵量:L

小弟有將貴程式嘗試添修~
        Sheets(1).Range("J7", "P" & Sheets(2).[R6] + 5).Copy .[J7]

        'Set Rng = .Range("T7:T" & .[R7].End(xlDown).Row)        
       Application.Goto .Range("T7:T" & .[R7].End(xlDown).Row)        
        For Each b In Selection
        
         If b <> "" Then        
        E = Array(.Range("R" & b.Row).Value, .Range("R" & b.Row) - .[T3], .Range("R" & b.Row) - .[T3] * 2) '期別的陣列

            For Each x In x_No   '比對數字的迴圈             .
              ......
             ......
         End If
       Next b

但因不知 x_No = Array(7, 39)等交集數字的相關語法要怎麼改?所以只這樣添加~程式會中斷在For Each x In x_No

交集數字取得的邏輯︰
當T欄有顯示數字的儲存格,且當其在R欄的對應期數(即.Range("R" & b.Row))及該R欄的對應期數-T$3(即.Range("R" & b.Row)-T$3)及該R欄的對應期數-T$3*2(即.Range("R" & b.Row)-T$3*2)等3個期數同時都有相同數字,則該相同數字即為3個期數的交集值。

本題需求說明:
當T欄有顯示數字的儲存格,且當其在R欄的對應期數(即.Range("R" & b.Row))及該R欄的對應期數-T$3(即.Range("R" & b.Row)-T$3)及該R欄的對應期數-T$3*2(即.Range("R" & b.Row)-T$3*2)~
等3個期數有一個(含)以上的交集值時,則交集值的儲存格標示4,45,8底色。
EX︰範例中的T96有顯示數字,且其對應R欄的期數(90)及該R欄的對應期數-T$3(90-9=81)及該R欄的對應期數-T$3*2(90-9*2=72)~
等3個期數有一個(含)以上的交集值(07,39)時,則J96,P96標示4號底色;K87,M87標示45號底色;J78,K78標示8號底色。

以上 謹供參考!謝謝您!

TEST_2-G.rar (62.14 KB)

TOP

回復 26# 准提部林
准大:您好!
不好意思,恕小弟執著,還是希望您能賜教如11#的寫法~
因為11#的貴語法,同欄與不限同欄的區分~只要多加一列程式碼~
f y > 1 Then If R(y).Column <> R(y-1).Column Then U = 1: Exit For
非常簡捷便利。

懇請您撥冗惠予賜教為禱~感恩 

小弟以貴程式依樣畫葫蘆~嘗試做個範例:
TEST_2-准.rar (63.13 KB)
謹供參考!謝謝您!

TOP

本帖最後由 Airman 於 2015-11-24 10:01 編輯

回復 31# GBKEE
GBKEE超版大:您好!
不好意思,您還將程式碼全加註解~辛苦您了!感恩

非常接近了!只剩下交集值的定義有誤差~
先假設ARR=.Range("R" & b.Row),.Range("R" & b.Row)-T$3, .Range("R" & b.Row)-T$3*2三個期數的範圍,以利說明。

目前貴程式是依據x_No = Array(m, n)是預設之固定的搜尋值~
即當m填入07,n填入39,則將在ARR有顯示07或39的儲存格各標示底色(不需要3個期數同時都有);
又如當m填入01,n填入49,則將在ARR有顯示01或49的儲存格各標示底色(不需要3個期數同時都有);....其餘以此類推。

本體需求的交集值是浮動的(即非預設的)~
即是依據ARR的3個期數是否同時都有相同數字來決定︰如果3個期數都有相同的數字時,則該相同數字即為交集值~
EX1_即當ARR的交集值為01(即必須3個期數同時都有01)時,則3個期數顯示01的儲存格各標示底色;
EX2_即當ARR的交集值為07,39(即必須3個期數同時都有07,39)時,則3個期數顯示07,39的儲存格各標示底色;
EX3_當ARR的交集值為08,20,40(即必須3個期數同時都有08,20,40)時,則3個期數顯示08,20,40的儲存格各標示底色;
EX4_當ARR都沒有交集值(即3個期數沒有同時都有相同的數字)時,則3個期數的儲存格都為無底色。..... 其餘以此類推。

以上 謹供參考!謝謝您!

TOP

回復 33# 准提部林
准大:
呵~呵~還是您的解說既簡且清~小弟承教了~希望小弟下次的說明能更精準

原是想程式碼同一式體,既然您說沒有特別益處~小弟就不再執著了。

謝謝您的耐心回覆與說明~感恩

TOP

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

回復 35# GBKEE
GBKEE超版大:您好!
不好意思~只剩標示底色的問題了~
假設:A區=.Range("R" & b.Row);B區=.Range("R" & b.Row)-T$3;C區=.Range("R" & b.Row)-T$3*2;
則3區的共有數字,依分區分別標示4號,45號,8號底色~即A區標示4號底色;B區標示45號底色;C區標示8號底色 ~
EX_1:
C區(72):         07        10        13        20        21        39        18

B區(81):        01        07        13        39        42        45        12

A區(90):        07        12        17        28        40        41        49

EX_2:
C區(72):         07        09        11        20        21        39        12

B區(81):        01        07        13        39        42        45        10

A區(90):        07        12        17        28        40        13        39

EX_3:
C區(72):         07        09        13        20        21        39        12

B區(81):        01        07        13        39        42        45        12

A區(90):        07        10        17        28        40        13        39


EX_4:
C區(72):         07        09        13        20        21        39        12

B區(81):        01        07        13        39        42        45        12

  A區(90):        07        12        17        28        40        13        39

.....其餘以此類推

以上 謹供參考!謝謝您!

TOP

        靜思自在 : 欣賞別人就是莊嚴自己。
返回列表 上一主題