Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2748 / 13646 ツリー ←次へ | 前へ→

【66222】RGB値を高速で変換したーい 16才♀ 10/8/10(火) 22:20 質問[未読]
【66223】Re:RGB値を高速で変換したーい kanabun 10/8/10(火) 22:54 発言[未読]
【66224】Re:RGB値を高速で変換したーい 16才♀ 10/8/10(火) 23:01 発言[未読]
【66225】Re:RGB値を高速で変換したーい Abyss 10/8/11(水) 0:11 発言[未読]
【66226】Re:RGB値を高速で変換したーい 16才♀ 10/8/11(水) 1:12 発言[未読]
【66243】Re:RGB値を高速で変換したーい 16才♀ 10/8/11(水) 20:20 回答[未読]
【66244】Re:RGB値を高速で変換したーい ichinose 10/8/11(水) 22:06 発言[未読]
【66246】Re:RGB値を高速で変換したーい 16才♀ 10/8/11(水) 22:54 お礼[未読]

【66222】RGB値を高速で変換したーい
質問  16才♀  - 10/8/10(火) 22:20 -

引用なし
パスワード
   RGB値のRとBを入れ替えなきゃならない時が多々あるのでこうしてるのですが

d = 色データ
a = d Mod 256
b = (d Mod 65536) \ 256
c = d \ 65536
d = (a * 65536) + (b * 256) + c

8ビット入れ替えるのにすっごい無駄なことしてる気が。。。><
何かいい方法があれば教えてください!

【66223】Re:RGB値を高速で変換したーい
発言  kanabun  - 10/8/10(火) 22:54 -

引用なし
パスワード
   ▼16才♀ さん:
>RGB値のRとBを入れ替えなきゃならない時が多々あるのでこうしてるのですが

コードの長さはあまり変わらないけど、文字列操作で、

Sub Try1()
 Dim d As Long
 Dim sR As String * 2
 Dim sRGB As String * 9
 
 d = &HFF& '色データ
 sRGB = Right$("00000000" & Hex$(d), 8) & "&"
 sR = Mid$(sRGB, 7)
 Mid$(sRGB, 7) = Mid$(sRGB, 3, 2)
 Mid$(sRGB, 3) = sR
 d = Val("&h" & sRGB)
End Sub

【66224】Re:RGB値を高速で変換したーい
発言  16才♀  - 10/8/10(火) 23:01 -

引用なし
パスワード
   ▼kanabun さん:
>▼16才♀ さん:
>>RGB値のRとBを入れ替えなきゃならない時が多々あるのでこうしてるのですが
>
>コードの長さはあまり変わらないけど、文字列操作で、
>
>Sub Try1()
> Dim d As Long
> Dim sR As String * 2
> Dim sRGB As String * 9
> 
> d = &HFF& '色データ
> sRGB = Right$("00000000" & Hex$(d), 8) & "&"
> sR = Mid$(sRGB, 7)
> Mid$(sRGB, 7) = Mid$(sRGB, 3, 2)
> Mid$(sRGB, 3) = sR
> d = Val("&h" & sRGB)
>End Sub

これはいいですね!
16進数にして文字列にして入れ替えればよかったんですね!
ありがとうございますっ

【66225】Re:RGB値を高速で変換したーい
発言  Abyss  - 10/8/11(水) 0:11 -

引用なし
パスワード
   ビット演算が簡単かと思いますが?

 Dim i As Long
 i = &HABCDEF
 i = i And &HFFFFFF& '念のため
 i = (i \ &H10000&) + (i And &HFF00&) + (i And &HFF&) * &H10000&
 Debug.Print Hex$(i)

【66226】Re:RGB値を高速で変換したーい
発言  16才♀  - 10/8/11(水) 1:12 -

引用なし
パスワード
   ▼Abyss さん:
>ビット演算が簡単かと思いますが?
>
> Dim i As Long
> i = &HABCDEF
> i = i And &HFFFFFF& '念のため
> i = (i \ &H10000&) + (i And &HFF00&) + (i And &HFF&) * &H10000&
> Debug.Print Hex$(i)


これもいいですね!
だいぶ計算が減りました
ありがとうございますっっ

【66243】Re:RGB値を高速で変換したーい
回答  16才♀  - 10/8/11(水) 20:20 -

引用なし
パスワード
   すいません自己解決しました。。
直接メモリ移動させて演算なしで変換することに成功しました!


Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Sub aaa()
Dim a As Long, b(2) As Byte, c
a = 1500000
MoveMemory VarPtr(b(0)), VarPtr(a), 3
c = b(0)
b(0) = b(2)
b(2) = c
MoveMemory VarPtr(a), VarPtr(b(0)), 3
MsgBox a
End Sub

【66244】Re:RGB値を高速で変換したーい
発言  ichinose  - 10/8/11(水) 22:06 -

引用なし
パスワード
   ▼16才♀ さん:
こんばんは。

Option Explicit
Type rgbB
  rgb_b(1 To 4) As Byte
End Type
Type tlong
  ll As Long
End Type
Sub test()
  Dim b As rgbB
  Dim a As tlong
  Dim c As Byte
  a.ll = 1500000
  LSet b = a
  With b
   c = .rgb_b(1)
   .rgb_b(1) = .rgb_b(3)
   .rgb_b(3) = c
  End With
  LSet a = b
  MsgBox a.ll
End Sub

こんな方法もあるようですよ!!

でも、これ普通に算術計算したほうが良いのでは?

【66246】Re:RGB値を高速で変換したーい
お礼  16才♀  - 10/8/11(水) 22:54 -

引用なし
パスワード
   ▼ichinose さん:
>▼16才♀ さん:
>こんばんは。
>
>Option Explicit
>Type rgbB
>  rgb_b(1 To 4) As Byte
>End Type
>Type tlong
>  ll As Long
>End Type
>Sub test()
>  Dim b As rgbB
>  Dim a As tlong
>  Dim c As Byte
>  a.ll = 1500000
>  LSet b = a
>  With b
>   c = .rgb_b(1)
>   .rgb_b(1) = .rgb_b(3)
>   .rgb_b(3) = c
>  End With
>  LSet a = b
>  MsgBox a.ll
>End Sub
>
>こんな方法もあるようですよ!!
>
>でも、これ普通に算術計算したほうが良いのでは?


構造体でこんなことできるんですね!
API使うより軽いですっっ
ありがとうございます

2748 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free