Vrácení čísla ColorIndex (VBa) Vyřešeno

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

WikisRuleZz
Level 1
Level 1
Příspěvky: 76
Registrován: leden 11
Bydliště: Pardubice
Pohlaví: Muž
Stav:
Offline

Vrácení čísla ColorIndex (VBa)

Příspěvekod WikisRuleZz » 26 led 2011 14:57

Dobrý den,

narazil jsem na problém s vrácením čísla ColorIndex. (Office 2007)

Při použití

Function BarvaIndex(CellToPickColorFrom As Range) As Integer
BarvaIndex = CellToPickColorFrom.Interior.ColorIndex
End Function

se mi vrátí číslo colorindex ale když si navolím nějaké vlastní barvy tak mi u dvou odlišných odstínů, třeba zelená, vrátí to samé číslo. Až tak velký problém by to nebyl kdybych s tím dál nepočítal.

Nevíte co s tím, nebo proč to dělá?
"V případě hrubé nedbalosti hlavního počítače vedoucí k ohrožení posádky jsou všechny lodě Jupiterské důlní společnosti povinny mít záložní počítač, který nahradí počítač hlavní." Červený trpaslík.

Reklama
Uživatelský avatar
Poki
Level 2
Level 2
Příspěvky: 237
Registrován: prosinec 09
Pohlaví: Muž
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod Poki » 26 led 2011 16:02

Problem je v tom ColorIndex - ten totiz umi jen 56 zakladnich barev Excelu. Je lepsi pouzivat .Color, kde uz je tech barev nepreberne

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod navstevnik » 26 led 2011 16:36

Ve VBA vlastnost ColorIndex zaokrouhluje index na nejblizsi index zakladnich barev.
Pro ilustraci si spust proceduru:

Kód: Vybrat vše

Sub ColorBunka()
  Dim R As Integer, G As Integer, B As Integer
  Dim i As Long, Bunka As Range

  Set Bunka = ActiveSheet.Range("a1")
  With Bunka
    .Offset(0, 1).Value = "Color"
    .Offset(0, 2).Value = "ColorIndex"
    .Offset(0, 3).Value = "R"
    .Offset(0, 4).Value = "G"
    .Offset(0, 5).Value = "B"
  End With
  i = 1
  For R = 0 To 255 Step 16
    For G = 0 To 255 Step 16
      For B = 0 To 255 Step 16
        With Bunka
          .Offset(i, 0).Interior.Color = RGB(R, G, B)
          .Offset(i, 1).Value = .Offset(i, 0).Interior.Color
          .Offset(i, 2).Value = .Offset(i, 0).Interior.ColorIndex
          .Offset(i, 3).Value = R
          .Offset(i, 4).Value = G
          .Offset(i, 5).Value = B
          .Offset(0, 7).Value = i
        End With
        i = i + 1
      Next B
    Next G
  Next R
End Sub

WikisRuleZz
Level 1
Level 1
Příspěvky: 76
Registrován: leden 11
Bydliště: Pardubice
Pohlaví: Muž
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod WikisRuleZz » 26 led 2011 20:21

Ahaa, takže colorindex nepracuje v RGB režimu? Chápu to dobře. Proto moje teorie, že právě každý odstín má svůj vlastní colorindex je špatná.

Zkusím to s .Color. Děkuji za ochotu.
"V případě hrubé nedbalosti hlavního počítače vedoucí k ohrožení posádky jsou všechny lodě Jupiterské důlní společnosti povinny mít záložní počítač, který nahradí počítač hlavní." Červený trpaslík.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod navstevnik » 26 led 2011 21:16

VBA - vlastnost Range - ColorIndex:
Read - zaokrouhli (zkoriguje) index na index odpovidajici nastavenym zakladnim barvam (0 - 56)
Write - pouze indexy zakladnich barev (0 - 56).

Vlastnost Color v celem rozsahu RGB od veze Excel 2007 (u starsich verzi byly barvy korigovany na zakladni barvy; barvy v celem rozsahu bylo mozno vlozit pouze do objektu)

WikisRuleZz
Level 1
Level 1
Příspěvky: 76
Registrován: leden 11
Bydliště: Pardubice
Pohlaví: Muž
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod WikisRuleZz » 27 led 2011 09:35

Teď jsem tedy trošku vyveden z míry. Tedy pokud chci používat colorindex pak dostanu jen základních 56 barev? Jde o to, že já pak následně pomocí ColorIndex provádím další úlohy.

Dostanu nebo nedostanu z colorindex právě jedno číslo právě k jednomu odstínu barvy?
"V případě hrubé nedbalosti hlavního počítače vedoucí k ohrožení posádky jsou všechny lodě Jupiterské důlní společnosti povinny mít záložní počítač, který nahradí počítač hlavní." Červený trpaslík.

Uživatelský avatar
Poki
Level 2
Level 2
Příspěvky: 237
Registrován: prosinec 09
Pohlaví: Muž
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod Poki » 27 led 2011 09:39

Podle meho z ColorIndex dostanes vzdy jen 56 barev...

Jsem ani netusil, ze Color je v celem RGB az od 2007, diky Navstevniku.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)  Vyřešeno

Příspěvekod navstevnik » 27 led 2011 10:24

To WikisRuleZz:
Muj strucny nahled na problem:
Trocha historie: Dos zacinal s 8 barvami, pod Win pribyly dalsi a v dobe MSEx 2000??-2003 bylo pouzito 56 zakladnich barev, vlastnost Color vracela jejich ciselne dekadicke vyjadreni (kombinace 8-mi bitoveho vyjadreni RGB - poskytuje cca >16 mil barev, ovsem bylo pouzito jen 56 kombinaci, ktere bylo mozno v nastaveni napr. Excelu upravit dle potreby a na tyto nejblizsi barvy bylo jakekoliv zadani Color (pozadi, fontu, ohraniceni,..) konvertovano.
Protoze ciselne vyjadreni dekadickym cislem zrejme nebylo prakticke, byla vyvojari pouzita vlastnost ColorIndex prirazujici temto definovanym barvam indexy 1 - 56.
MSEx 2007 umoznuje jiz pouzit pro pozadi, font, ohraniceni,.. cely rozsah barev &H000000 - &HFFFFFF. A v tomto okamziku prirazeni indexu kazde barve ztraci smysl - indexy by byly totozne s ciselnym vyjadrenim barvy a bylo by jich cca >16 mil., takze nejspis vyvojari ponechali rozsah indexu 1-56 a jeho hodnota jen vyjadruje jakousi "prumernou", nejblizsi barvu.
Lze si to overit spustenim drive uvedene procedury Sub ColorBunka() v Excelu 2000 - nikoliv pod 2007 jako starsi verze souboru! (jsou zobrazeny a ciselne vyjadreny jen zakladni barvy) a v Excelu 2007 (jsou zobrazeny zadane barvy, Color vraci jejich skutecnou hodnotu, ale ColorIndex konvertovanou hodnotu v rozsahu 1 - 56 - v urcitem rozsahu barev se nemeni).
Nize uvedena procedura zobrazi zakladni barvy (vzakladnim nastaveni Excelu), indexy, cislo barvy, slozky RGB (prezentoval J Cihar):

Kód: Vybrat vše

Option Explicit

Sub palette()
'57 colors, 0 to 56; 0 - bez barvy
  Application.ScreenUpdating = False
Dim i As Long
Dim str0 As String

  Cells(1, 16) = "Barva Ind"
  Cells(1, 17) = "Barva Ind"
  Cells(1, 18) = "Color BGR"
  Cells(1, 19) = "Hex RGB"
  Cells(1, 20) = "Èervená"
  Cells(1, 20).Font.Color = RGB(255, 0, 0)
  Cells(1, 21) = "Zelená"
  Cells(1, 21).Font.Color = RGB(0, 255, 0)
  Cells(1, 22) = "Modrá"
  Cells(1, 22).Font.Color = RGB(0, 0, 255)
  Range("p1:v1").Select
  With Selection
    .Font.Bold = True
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlBottom
  End With
 
  For i = 0 To 56
    Cells(i + 2, 16).Interior.ColorIndex = i
    Cells(i + 2, 16).Value = "[Barva " & i & "]"
    Cells(i + 2, 17).Font.ColorIndex = i
    Cells(i + 2, 17).Value = "[Barva " & i & "]"
    Cells(i + 2, 18) = Cells(i + 2, 16).Interior.Color
    str0 = Right("000000" & Hex(Cells(i + 2, 16).Interior.Color), 6) ' B*#FFFF+G*#FF+R hex
    Cells(i + 2, 19) = "#" & Right(str0, 2) & Mid(str0, 3, 2) & Left(str0, 2) ' RGB hex
    Cells(i + 2, 20).Value = Hex2dec(Right(str0, 2)) ' R
    Cells(i + 2, 21).Value = Hex2dec(Mid(str0, 3, 2)) ' G
    Cells(i + 2, 22).Value = Hex2dec(Left(str0, 2))  ' B
  Next i
    Application.ScreenUpdating = True
 
End Sub
Function Hex2dec(hexNum As String)
Dim i As Long
Dim Tmp As Long
Dim Tmp1 As Long
Dim c

   Tmp = 0
   For i = 1 To Len(hexNum)
      c = Mid(hexNum, i, 1)
      Tmp1 = Asc(c) - 48
      If (c >= Chr(65) And c <= Chr(70)) Then Tmp1 = Tmp1 - 7
      Tmp = Tmp * 16 + Tmp1
   Next i
   Hex2dec = Tmp
End Function

Takze pouziti vlastnosti ColorIndex umoznuje pracovat pouze s 56 zakladnimi barvami.

WikisRuleZz
Level 1
Level 1
Příspěvky: 76
Registrován: leden 11
Bydliště: Pardubice
Pohlaví: Muž
Stav:
Offline

Re: Vrácení čísla ColorIndex (VBa)

Příspěvekod WikisRuleZz » 27 led 2011 10:40

Ano. Již jsem to pochopil. Vycházel jsem ze svých znalostí RGB. ColorBuňka jsem pouštěl a pochopil, jen jsem se pak do toho trošku zamotal. Děkuji za odpověď a ochotu.
"V případě hrubé nedbalosti hlavního počítače vedoucí k ohrožení posádky jsou všechny lodě Jupiterské důlní společnosti povinny mít záložní počítač, který nahradí počítač hlavní." Červený trpaslík.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů