2012-09-28 82 views

回答

28

沒有,這些值是不相等的:&HC0FF是-16129,而&HC0FF&是49407.

VBA是一種相當古老的語言,默認情況下使用16位整數。在這個時代,你幾乎總是想要longs而不是整數,但你必須爲他們問VBA。

&HC0FF是一種構造,它從十六進制定義了一個16位常量。由於該值中的符號位在解釋爲16位值時設置(開,負),因此轉換爲-16129。我們可能會認爲這很糟糕,但這不是一個錯誤!當使用-16129(作爲有符號整數)時,以32位形式,1傳播到整個前16位,結果藍色值爲255.

你真正想要的是32位十六進制常數:&HC0FF&。 最後的額外&告訴VBA,這是一個長常量,而不是int。以32位解釋,這是一個正值,所以給出了您要查找的十進制等值。

總之,要求長的十六進制常量與尾隨&。另外,當使用十進制常量時,例如在表達式16000 * 16000中,這會溢出16位算術,這種VBA趨向於16位的傾向也會咬我們。所以,有時候也需要在十進制常量上使用尾隨&(或者先分配一個)。

+0

太棒了!正是我在找什麼。 –

+0

令人驚歎的答案。 我看到了負面的差異,但不知道爲什麼它會發生,直到我看到你的答案。非常豐富! – danielpiestrak

4

顏色代碼通常由三個值組成,紅色,綠色,藍色。您的Hexcode缺少三者之一,而且excel使用FF自動填充它。所以你的顏色C0FF被轉換成FFC0FF。

這裏是一個Exampleprogram,所以你可以看到它的實際操作,創建一個新的工作表並執行它。

' C0FF will be changed to be FFC0FF 
Range("A1").Interior.Color = &HC0FF 
Range("A1").Select 
ActiveCell.FormulaR1C1 = Range("A1").Interior.Color 
Range("A2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

' 49407 is actually 00C0FF 
Range("B1").Interior.Color = 49407 
Range("B1").Select 
ActiveCell.FormulaR1C1 = Range("B1").Interior.Color 
Range("B2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

' Use RGB to have better control over your results 
' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red 
Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0) 
Range("C1").Select 
ActiveCell.FormulaR1C1 = Range("C1").Interior.Color 
Range("C2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

編輯:增加了第三個例子來說明切換顏色的建議在不同的答案。

+0

這清除了很多。謝謝!我已經切換到分別指定RGB值,但我想知道是否有可能讓excel直接將它讀作'00C0FF'? –

6

我相信Gimp和Johannes的答案都錯過了關鍵問題。

計算機屏幕上的顏色是通過指定您需要多少紅色,藍色和綠色來定義的。對於三種顏色中的每一種,您指定一個介於0和255之間的數字。這三個數字通常通過連接三個單獨的數字來指定爲單個數字。使用Html,您可以指定一種顏色爲#RRGGBB,其中RR,GG和BB是十六進制數字,或者您可以將RRBBGG替換爲十進制等效值。用Excel的順序是顛倒的,所以& HBBGGRR或十進制等效。

49407是00C0FF的十進制等效其用於Excel意味着藍= 0,綠色= 192和紅色= 255

但是& HC0FF或& H00C0FF是-16129或藍= 255,綠色= 192和紅= 255.這似乎是H轉換中的一個缺陷。我找不到反正越來越C0FF轉化爲49407.

如果您堅持使用& H換算,我能提供的最好的是:

Range("A1:A5").Interior.color = &H01C0FF 

這是藍= 1,綠色= 192和紅= 255,我不能告訴從藍色= 0,綠色= 192和紅色= 255

的差異,但我會建議:

Range("A1:A5").Interior.color = RGB(255,192,0) 

因爲RGB功能總是返回一個正數,你不必擔心Excel的反序。

+0

很好的答案,謝謝,這讓我瘋狂! – Sergio

+0

是的,你不能跳過前面的0 ......關於int大小的答案很酷,但這非常實用,答案爲 –

4

這將轉換你必須到辦公室使用的RGB顏色的RGB龍十六進制格式的顏色:

Function HexToLongRGB(sHexVal As String) As Long 
    Dim lRed As Long 
    Dim lGreen As Long 
    Dim lBlue As Long 

    lRed = CLng("&H" & Left$(sHexVal, 2)) 
    lGreen = CLng("&H" & Mid$(sHexVal, 3, 2)) 
    lBlue = CLng("&H" & Right$(sHexVal, 2)) 

    HexToLongRGB = RGB(lRed, lGreen, lBlue) 

End Function 
+0

+1,也允許從f.ex複製十六進制值。 Photoshop或一個顏色選擇器直接進入數據庫表。 –