Board logo

標題: [發問] Excel VBA 儲存格字體變色事宜(不同序頁無法變色) [打印本頁]

作者: syuan    時間: 2012-9-19 11:16     標題: Excel VBA 儲存格字體變色事宜(不同序頁無法變色)

使用軟體:Excel 2003 SP3

各位先進好
  小弟在Excel的VBA中寫了兩行程式,是關於Excel儲存格內的字體變色事宜。(用If.....Then的語法)
令小弟不解的是,這兩行程式在該檔的Sheet3執行是可行的(圖1),但在該檔的Sheet1執行卻不行!(圖2)

註:粉紅色框為程式語法。

圖1
[attach]12541[/attach]


圖2
[attach]12542[/attach]


以上,請各位先進不吝指教,祝平安順心。
作者: luhpro    時間: 2012-9-19 21:59

回復 1# syuan

單純從畫面上看起來你 Sheet3 的 A 欄有文字,
但 Sheet1 卻沒有字,
會不會是這個原因?
作者: Hsieh    時間: 2012-9-19 23:58

回復 1# syuan

檢查Sheet1的A1儲存格字型顏色設定為何?
[attach]12548[/attach]
作者: syuan    時間: 2012-9-20 15:57

回復  syuan

單純從畫面上看起來你 Sheet3 的 A 欄有文字,
但 Sheet1 卻沒有字,
會不會是這個原因?
luhpro 發表於 2012-9-19 21:59

回Luhpro

小弟依您建議,將字挪到A欄後再執行,的確就能改變字的顏色,感謝您。^^

不過小弟納悶的是,寫在儲存格裡的字是包涵在語法的("A1:AZ1000")的範圍內。照理說字就算不在A欄裡,也應該會變色才是。

但Run起來卻不會,實在讓小弟百思不得其解。

回復  syuan

檢查Sheet1的A1儲存格字型顏色設定為何?
Hsieh 發表於 2012-9-19 23:58


回Hsieh

感謝您的建議,小弟在設定Excel的顏色功能時,發現一件很特別的事。

在點選顏色後,會出現很多的顏色可以選擇,小弟在選擇黑色時,通常會直接點選"自動套色"。(如下圖虛線框處)
[attach]12561[/attach]


當選完"自動套色"時,再執行小弟所寫的那兩句語法時,卻發現字體仍然不會變色!{:3_47:}

小弟一直以為那個"自動套色"的顏色就是黑色,但在執行程式後卻無動靜!而如果顏色直接改回黑色時(如下圖虛線框處)卻又可以變色了。
[attach]12564[/attach]


小弟在想......是不是Excel有兩種黑色?{:2_30:}


註:附上小弟的檔案

[attach]12566[/attach]


各位先進如有空閒時,能否幫忙小弟看看是哪邊出問題。以上,謝謝。

祝平安順心∼∼
作者: syuan    時間: 2012-9-21 11:59

回復 2# luhpro


   
回Luhpro

小弟依您建議,將字挪到A欄後再執行,的確就能改變字的顏色,感謝您。^^

不過小弟納悶的是,寫在儲存格裡的字是包涵在語法的("A1:AZ1000")的範圍內。照理說字就算不在A欄裡,也應該會變色才是。

但Run起來卻不會,實在讓小弟百思不得其解。
作者: syuan    時間: 2012-9-21 12:01

本帖最後由 syuan 於 2012-9-21 12:03 編輯

回復 3# Hsieh


   
回Hsieh

感謝您的建議,小弟在設定Excel的顏色功能時,發現一件很特別的事。

在點選顏色後,會出現很多的顏色可以選擇,小弟在選擇黑色時,通常會直接點選"自動套色"。(如下圖虛線框處)



小弟一直以為那個"自動套色"的顏色就是黑色,但在執行程式後卻無動靜!而如果顏色直接改回黑色時(如下圖虛線框處)卻又可以變色了。




小弟在想......是不是Excel有兩種黑色?

[attach]12577[/attach]
以上為小弟的檔案。

各位先進如有空閒時,能否幫忙小弟看看是哪邊出問題。以上,謝謝。

祝平安順心∼∼
作者: luhpro    時間: 2012-9-22 04:14

本帖最後由 luhpro 於 2012-9-22 04:16 編輯
回復  luhpro
回Luhpro
小弟依您建議,將字挪到A欄後再執行,的確就能改變字的顏色,感謝您 ...
syuan 發表於 2012-9-21 11:59

不知道是不是版本不同的原因,
我跑你的程式並不會變色(sheet1 與 sheet3 都顯示 I can't)
似乎與你所敘述的結果不同,
這樣就無法找到問題的癥結了.

這裡嘗試提出幾個建議看是否能找到問題點:
1. 使用單步執行(按 F8 按鍵)執行至停在 If 那行,
再於即時運算視窗先 Key 一個 ? 並於其右方複製後貼上條件式的內容,
(即 ?Worksheets("sheet3").Cells.Font.Color = vbRed )
看看系統給出的條件式判斷結果為何,
---> 我看到的是 Null (雖非相同但結果接近 非真<True> )

2. 再細部一點於 ? 右方分別接上條件判斷式中 = 左邊 與 右邊 的內容,
看看系統告訴我們兩邊的運算結果各是什麼?
(即 ?Worksheets("sheet3").Cells.Font.Color 與 ?vbRed )
---> 我看到的是 Null 與 255

3. 我們也可以確認單一儲存格的文字顏色代碼是多少,
例 : ?Worksheets("sheet3").[A1].Font.Color
你可以試試看分別將兩個儲存格設成 黑色 與 自動 再測看看是否系統會顯示不同色碼.
---> 我看到的都是 0
其實在你提供的圖片上就可以看出來,
"自動" 那個選項的左方有個方格它的顏色就有告訴你目前 "自動" 所對應的顏色就是黑色的.

4. 不論是 .Range("A1:AZ1000") 還是 .cells 都是在表示 "多個儲存格",
它並不適合用於 If 指令的判斷上,
因為其中的各個儲存格可以分別有不同的顏色,
這將導致判斷式的結果為無法確認結果(Null).
要對多個儲存格作判斷式的處理,
應該在其外先套用 For Each  與 Next 以表示依序對其內所有的儲存格作判斷與處理.
建議程式碼如下 :
  1.     Worksheets("sheet3").Activate
  2.     Dim a As Range
  3.    
  4.     For Each a In Worksheets("sheet3").[B2].CurrentRegion
  5.       If a.Font.Color = vbRed Then a.Font.Color = vbBlack
  6.     Next
複製代碼

作者: syuan    時間: 2012-9-24 12:33

回復 7# luhpro


感謝luhpro大的解說,小弟先去試看看您說的那幾項。{:3_52:}

註:原來if語法不適合用在這種情況啊,我還真不知道....=="
作者: syuan    時間: 2012-10-26 17:31

回復 7# luhpro


    回luhpro 大

小弟試了您建議的1、2、3、4項的方式後,的確出現如您所說的現象。

真是萬分感謝∼∼

另外,小弟近日發現了range有個叫usedrange屬性,它可以去抓取使用中的儲存格範圍。

小弟試了一下這個屬性,它可以選取儲存格的所有範圍。

不過小弟在語法中加了一個Instr的語法,打算讓程式依條件來讓儲存格內的字變色,

但不管如何改,它就是只會變數字的顏色而已,無法選到其他儲存格內的字(如下圖1)

(圖1)   原本要讓儲存格內的dos字串變紅色,但程式卻讓儲存格內的數字1變紅色(Instr(1.......)
[attach]12900[/attach]

(圖2)  將語法修改後也是改到儲存格內的數字4  (小弟改為Instr(4.......)
[attach]12901[/attach]

從以上的結果看來,它似乎是針對數字在變更,而不是依字串在變更......=="

這讓小弟覺得很困惑,不知是不是小弟的語法有錯。

望各位先進不吝指教,謝謝。

祝週末愉快!
作者: GBKEE    時間: 2012-10-26 17:48

回復 9# syuan
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim A As Range
  4.     For Each A In Sheets("Sheet1").UsedRange
  5.         If InStr(A, "DOS") Then A.Font.Color = vbRed
  6.     Next
  7. End Sub
複製代碼

作者: syuan    時間: 2012-10-26 18:48

回復 10# GBKEE


    感謝GBKEE大

小弟依您提供的語法來修改小弟的語法後,已能成功變更字的顏色(如下圖){:3_59:}

[attach]12903[/attach]

不過小弟發現就算儲存格的字改為DOSXXX 後,仍然能成功變色。

也就是說這個寫法僅搜查符合DOS開頭的字串就變色,而如果DOS字串後有加別的字就忽略。

不知小弟這樣的想法是否正確?
作者: GBKEE    時間: 2012-10-26 21:12

回復 11# syuan
沒錯的.
LIKE 也可比對字串
  1. 四式 分別 執行看看  
  2.     If A   LIKE  "DOS" Then A.Font.Color = vbRed
  3.     If A   LIKE  "DOS*" Then A.Font.Color = vbRed
  4.     If A   LIKE  "*DOS" Then A.Font.Color = vbRed
  5.     If A   LIKE  "*DOS*" Then A.Font.Color = vbRed
複製代碼

作者: syuan    時間: 2012-10-29 17:08

回復 12# GBKEE

回覆GBKEE大

  小弟試了您提供的方式,但儲存格內的字串並無變色(如下圖)

    [attach]12936[/attach]

小弟有查了LIKE的說明,發現它似乎是用來對照字串用的(如下圖)

[attach]12937[/attach]

以上,謝謝!
作者: GBKEE    時間: 2012-10-29 18:19

回復 13# syuan
看你的圖片:  程式碼不完整
  1.     Option Explicit
  2. Sub Ex()
  3.     Dim A As Range
  4.     For Each A In Sheets("Sheet1").UsedRange.Range("C:C")
  5.         If InStr(A, "DOS*") Then A.Font.Color = vbRed
  6.     Next
  7. End Sub
複製代碼

作者: syuan    時間: 2012-10-31 13:20

回復 14# GBKEE


感謝GBKEE大
那個INSTR的語法,小弟已有依您提供的方式試出。
現小弟正試著將這個語法來帶入自己正在研究的小程式中。
作者: EddieLiang    時間: 2016-4-1 13:55

回復  syuan
試試看
GBKEE 發表於 2012-10-26 17:48



感謝大大無私分享,非常受用!
For Each A In Sheets("Sheet1").UsedRange

Each
USeRange
這兩個用法小弟愚昧懇請大大解說!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)