« 2009年12月 | トップページ | 2010年2月 »

2010年1月

2010年1月31日 (日)

HTMLのTableをVBAで作る 3

記事「HTMLのTableをVBAで作る」では
セルの「塗りつぶし」を
記事「HTMLのTableをVBAで作る 2」では
セルの「塗りつぶし」と「大きさ」をTableにしました。

次は、セル内の文字も付け加えます。

<TD>と</TD>の間に
Cells(i, j)を付け足すだけです。

せっかくなので
ASCII文字セットを1から255まで書き出して
それをTableにします。

見やすいように
見出しの行を少し濃い背景色にして
3行目、5行目、7行目のような
奇数行を薄い背景色にします。

ASCII文字セットは
Chr関数を使って書き出します。

For文を使って
Chr関数に1から255までの数字を入れて行きます。
途中
最初に1回だけ見出しを作るための
最初を判別するIf thenステートメントがあり

ElseIfで
奇数行に薄い背景色をつけるために
3以上の奇数を判別します。
具体的には

(i +2)行目が奇数行である
(i + 2) が奇数
(i + 2) を 2 で割った余りが1

で判別します。

コードはこちらです。

ASCII文字コードのHTMLのTable生成するコード:

Sub macro100131a()
    Dim i, j As Integer
    Sheets.Add
    For i = 0 To 255
        If i = 0 Then
            '見出しを作る
            Range("A1") = "番号"
            Range("B1") = "文字"
            Range("A1:B1").Interior.ColorIndex = 42
        ElseIf (i + 2) Mod 2 = 1 Then
            '奇数行
            'toA1は過去記事参照してください
            Range(toA1("R" & i + 2 & "C1:R" & i + 2 & "C2")).Interior.ColorIndex = 34
        End If
        Cells(i + 2, 1) = i
        Cells(i + 2, 2) = Chr(i)
    Next i
   
'---ここからTable生成---
    Dim MyHTML As String
    '生成したHTMLを入れる
   
    Dim MyHexColor As String
    '長整数型を16進数に変換した文字列を入れる
    Dim TWidth, THeight As Integer
    'Tableの幅と高さを入れる
    Dim AddTWidth As String
   
    MyHTML = "<TABLE><TBODY>"
    For i = 1 To 257
        'i行の始まり
        '高さ設定
        THeight = Int(Cells(i, 1).RowHeight * 100 / 75)
        MyHTML = MyHTML & "<TR height=" & THeight & ">"
        For j = 1 To 2
            'i行j列について
            '幅設定、1行目のみ
            If i = 1 Then
                TWidth = Int(Cells(i, j).ColumnWidth * 100 / 11.8)
                AddTWidth = " width=" & TWidth
            End If
            MyHexColor = LngtoHexColor(Cells(i, j).Interior.Color)
            MyHTML = MyHTML & "<TD bgcolor=" & _
                Chr(34) & MyHexColor & Chr(34) & AddTWidth & ">" & _
                Cells(i, j) & "</TD>"
            AddTWidth = "" 'AddTWidthをなしにする
        Next j
        MyHTML = MyHTML & "</TR>"
    Next i
    MyHTML = MyHTML & "</TBODY></TABLE>"
   
    '生成したHTMLを適当なセルに書き出す
    Cells(258, 1) = MyHTML
End Sub

実行後のExcelのシートの状態
画像は14行目までしかないですが
実際は257行まであります。
Pic20100131a

下が生成されたTableのHTMLソースです。

生成されたTableのHTMLソース:

<TABLE><TBODY><TR height=18><TD bgcolor="#33CCCC" width=71>番号</TD><TD bgcolor="#33CCCC" width=71>文字</TD></TR><TR height=18><TD bgcolor="#FFFFFF">0</TD><TD bgcolor="#FFFFFF"></TD></TR><TR height=18><TD bgcolor="#CCFFFF">1</TD><TD bgcolor="#CCFFFF"></TD></TR><TR height=18><TD bgcolor="#FFFFFF">2</TD><TD bgcolor="#FFFFFF"></TD></TR><TR height=18><TD bgcolor="#CCFFFF">3</TD><TD bgcolor="#CCFFFF"></TD></TR><TR height=18><TD bgcolor="#FFFFFF">4</TD><TD bgcolor="#FFFFFF"></TD></TR><TR height=18><TD bgcolor="#CCFFFF">5</TD>

中略

<TD bgcolor="#CCFFFF"></TD></TR><TR height=18><TD bgcolor="#FFFFFF">254</TD><TD bgcolor="#FFFFFF"></TD></TR><TR height=18><TD bgcolor="#CCFFFF">255</TD><TD bgcolor="#CCFFFF"></TD></TR></TBODY></TABLE>

これをHTMLに埋め込んだものが↓です。

番号 文字
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 !
34 "
35 #
36 $
37 %
38 &
39
40 (
41 )
42 *
43 +
44 ,
45 -
46 .
47 /
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
58 :
59 ;
60 <
61 =
62 >
63 ?
64 @
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 I
74 J
75 K
76 L
77 M
78 N
79 O
80 P
81 Q
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z
91 [
92 \
93 ]
94 ^
95 _
96 `
97 a
98 b
99 c
100 d
101 e
102 f
103 g
104 h
105 i
106 j
107 k
108 l
109 m
110 n
111 o
112 p
113 q
114 r
115 s
116 t
117 u
118 v
119 w
120 x
121 y
122 z
123 {
124 |
125 }
126 ~
127 
128 €
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191 ソ
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

ながっ

しかも、27行目までで
Excelのセルから「メモ帳」にコピペした際に
文字化け?が発生してます。

(と書いたものの
Web上のブログを見たら
文字化け?がなくなってました。
なくなった原因は不明ですが
ローカルな環境では
文字化け?発生してました。
エンコードの関係かな?)

Tableにする題材の選択を
失敗しました。

とはいえ
これだけ手で打ち込んだら
大変でしょうね~

なお、正確なASCII文字コードの表は
VBAヘルプにあります。

| | コメント (0) | トラックバック (0)

2010年1月29日 (金)

HTMLのTableをVBAで作る 2

記事「HTMLのTableをVBAで作る」では
セルの「塗りつぶし」だけをTableにしましたが
次は
セルの大きさもTableに反映させたいと思います。

HTMLのTableタグの大きさの指定の単位は
ピクセル…

一方、
セルの大きさは

ColumnWidth
RowHeight

で取得できる。

単位はポイントですが
その大きさが
イマイチよくわからない。
(セルの高さ・幅を設定しようとした人には
わかってもらえると思います。)

場当たり的に

幅    11.8ポイント:100ピクセル
高さ   75ポイント:100ピクセル

を使ってポイントをピクセルに変換する。
記事「セルの縦と横の比」参照

まずは手動でお絵かき。
「塗りつぶし」とセルの大きさを変える。

Pic20100129a

このようになりました。
3行4列使ってます。

これをTableにします。
コードはこちらです。
既出コードを
少し いじっただけです。

HTMLのTable生成(色と大きさ)のコード:

Sub macro100129a()
    Dim i, j As Integer
    'それぞれ行と列に対応
   
    Dim MyHTML As String
    '生成したHTMLを入れる
   
    Dim MyHexColor As String
    '長整数型を16進数に変換した文字列を入れる
    Dim TWidth, THeight As Integer
    'Tableの幅と高さを入れる
    Dim AddTWidth As String
   
    MyHTML = "<TABLE><TBODY>"
    For i = 1 To 3
        'i行の始まり
        '高さ設定
        THeight = Int(Cells(i, 1).RowHeight * 100 / 75)
        MyHTML = MyHTML & "<TR height = " & THeight & ">"
        For j = 1 To 4
            'i行j列について
            '幅設定、1行目のみ
            If i = 1 Then
                TWidth = Int(Cells(i, j).ColumnWidth * 100 / 11.8)
                AddTWidth = " width = " & TWidth
            End If
            MyHexColor = LngtoHexColor(Cells(i, j).Interior.Color)
            MyHTML = MyHTML & "<TD bgcolor=" & _
                Chr(34) & MyHexColor & Chr(34) & AddTWidth & "></TD>"
            AddTWidth = "" 'AddTWidthをなしにする
        Next j
        MyHTML = MyHTML & "</TR>"
    Next i
    MyHTML = MyHTML & "</TBODY></TABLE>"
   
    '生成したHTMLを適当なセルに書き出す
    Cells(4, 1) = MyHTML
End Sub

これが、
生成されたTableのHTMLソースです。

生成されたTableのHTMLソース:

<TABLE><TBODY><TR height = 119><TD bgcolor="#00FF00" width = 122></TD><TD bgcolor="#000000" width = 5></TD><TD bgcolor="#003366" width = 47></TD><TD bgcolor="#99CCFF" width = 93></TD></TR><TR height = 8><TD bgcolor="#993300"></TD><TD bgcolor="#FF0000"></TD><TD bgcolor="#C0C0C0"></TD><TD bgcolor="#333399"></TD></TR><TR height = 72><TD bgcolor="#008000"></TD><TD bgcolor="#FFFFFF"></TD><TD bgcolor="#FF9900"></TD><TD bgcolor="#FFCC00"></TD></TR></TBODY></TABLE>

これをHTMLに埋め込んだものが
これ↓

Excelのセルの高さと幅の設定には
苦労しますが
こちらは、思ったよりも
あっさりうまく行きました。

| | コメント (0) | トラックバック (0)

2010年1月27日 (水)

HTMLのTableをVBAで作る

色の表示形式の変換1、2、3で作った
色の表示形式を変換する
Functionプロシージャを利用して
HTMLのTableを作って
遊んでみたいと思います。

まずは
Excelの「塗りつぶし」のカラーパレットで
色を選んで
手動で
セルを適当に塗りつぶしていきます。
Pic20100127a

こんな感じで塗りつぶす。
Pic20100127b

上の例は5行6列あります。
これに対応したTableを作ります。

セルの「塗りつぶし」の長整数型の色を

Cells(i, j).Interior.Color

で取得します。

それから、
色の表示形式の変換3で紹介した
FunctionプロシージャのLngtoHexColorを使って
16進数に変換する。

LngtoHexColor(Cells(i, j).Interior.Color)

この16進数に変換した色の値を
TDタグのbgcolorの属性に使います。

コードはこちら

セルからTableを生成するコード:

Sub macro100127a()
    Dim i, j As Integer
    'それぞれ行と列に対応
   
    Dim MyHTML As String
    '生成したHTMLを入れる
   
    Dim MyHexColor As String
    '長整数型を16進数に変換した文字列を入れる
   
    MyHTML = "<TABLE height=400 width=400><TBODY>"
    For i = 1 To 5
        'i行の始まり
        MyHTML = MyHTML & "<TR>"
        For j = 1 To 6
            'i行j列について
            MyHexColor = LngtoHexColor(Cells(i, j).Interior.Color)
            MyHTML = MyHTML & "<TD bgcolor=" & _
                Chr(34) & MyHexColor & Chr(34) & "></TD>"
        Next j
        MyHTML = MyHTML & "</TR>"
    Next i
    MyHTML = MyHTML & "</TBODY></TABLE>"
   
    '生成したHTMLを適当なセルに書き出す
    Cells(6, 1) = MyHTML
End Sub

生成されたTable:

<TABLE height=400 width=400><TBODY><TR><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#00FF00"></TD><TD bgcolor="#008000"></TD><TD bgcolor="#008000"></TD></TR><TR><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#00FF00"></TD><TD bgcolor="#808000"></TD><TD bgcolor="#008000"></TD></TR><TR><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#FF6600"></TD><TD bgcolor="#00FF00"></TD><TD bgcolor="#808000"></TD><TD bgcolor="#008000"></TD></TR><TR><TD bgcolor="#3366FF"></TD><TD bgcolor="#3366FF"></TD><TD bgcolor="#3366FF"></TD><TD bgcolor="#969696"></TD><TD bgcolor="#3366FF"></TD><TD bgcolor="#3366FF"></TD></TR><TR><TD bgcolor="#FFFF00"></TD><TD bgcolor="#FFFF00"></TD><TD bgcolor="#CC99FF"></TD><TD bgcolor="#FF00FF"></TD><TD bgcolor="#CC99FF"></TD><TD bgcolor="#CC99FF"></TD></TR></TBODY></TABLE>

生成されたTableを
ブラウザで表示したのが
これです↓

上の画像と比べてみてください。

| | コメント (0) | トラックバック (0)

2010年1月26日 (火)

井領 邦弘 (著):株解析チャートから自動発注ロボットまで!Excel VBAで極

1.株価情報を
インターネットのサイトから
Excelに取り込む。

2.その情報を
テクニカル分析する。

3.分析した2つの指標を比較して
売買サインを出す。

4.出されたサインに基づいて
Internet Explorerを操作して
発注しよう。

大まかにこの様な流れの内容でした。

まず、1.について
Yahooなどが提供している
株価情報をWebクエリを使って
Excelに取り込むVBAについてです。

ご存知の方もたくさんいると思いますが
Webクエリの存在自体を知らなかったので
役立ちました。

2.は代表的なテクニカル分析を
ワークシート関数を多用しながら
グラフにしていきます。

与えられたチャートを見ているだけよりは
断然理解が深まると思います。
一目均衡表の雲まで
Excelのグラフでできるんですね。

3.は、2で作った指標の大小を比較して
サインを出します。

4.は3でのサインに基づいて
自動売買しよう!
というコンセプトで
Internet Explorerを
VBAで操作する方法が解説されてます。

が、
さわりだけで
実用性はないです。

しかし、
Internet ExplorerをVBAで操作できることを
知らなかったので
内容はおもしろかったです。

この本の内容を発展させて
Excelで自動売買ロボットを作って
バーチャルFXで遊んでみましたが
うふふっ
楽しいですよ。
勝つにはもっと工夫が必要ですが…

| | コメント (0) | トラックバック (0)

2010年1月25日 (月)

色の表示形式の変換 3

色の表示形式のまとめです。

色の表示形式

長整数型(Long)
RGB
16進数

以上3つをそれぞれ変換してみる。
今回は、16進数と長整数型の変換について

・16進数 => 長整数型

まず16進数をRGBに変換してから
RGB関数で長整数型に変換する。
つまり
16進数 (=> RGB) => 長整数型

16進数をRGBに変換する方法については
こちらの記事を参照してください。
色の表示形式の変換 2

RGBを長整数型に変換する方法については
こちらの記事を参照してください。
色の表示形式の変換 1

16進数 => 長整数型コード:

Sub macro100125a()
'16進数 => 長整数型

    Dim StrHexColor As String
    On Error GoTo ErrHandle
    StrHexColor = InputBox("色の表示形式変換:16進数 => 長整数型" _
        & Chr(10) & "#以下を入力してください。")
    On Error GoTo 0

    MsgBox "#" & StrHexColor & " = " & _
        HexColortoLng(StrHexColor)
   
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Function HexColortoLng(StrHexColor As String)
    If Len(StrHexColor) <> 6 Then
        GoTo ErrHandle
    Else
        Dim i As Integer
        For i = 1 To 6
            If Val("&H" & Mid(StrHexColor, i, 1)) = 0 And _
                Mid(StrHexColor, i, 1) <> 0 Then
                GoTo ErrHandle
            End If
        Next i
    End If
       
    Dim r, g, b As Variant
    r = Val("&H" & Left(StrHexColor, 2))
    g = Val("&H" & Mid(StrHexColor, 3, 2))
    b = Val("&H" & Right(StrHexColor, 2))
    HexColortoLng = RGB(r, g, b)
Exit Function
ErrHandle:
    HexColortoLng = "適切な値を入力してください。"
End Function

入力は
Pic20100125a

結果例は
Pic20100125b

適切でない値を入力すると
Pic20100125c

結果は
Pic20100125d

適切である値の判断条件は

入力された値が6文字
かつ
各1文字が0からFまでの値であること

にしました。

・長整数型 => 16進数

上と同様RGBを経由する。
つまり
長整数型(Long) (=> RGB) => 16進数

前述2つの記事を参照してください。

長整数型 => 16進数コード:

Sub macro100125b()
'長整数型 => 16進数

    Dim LngColor As Long
    On Error GoTo ErrHandle
    LngColor = InputBox("色の表示形式変換:長整数型 => 16進数" _
        & Chr(10) & "長整数型を入力してください。")
    On Error GoTo 0
   
    MsgBox LngtoHexColor(LngColor)
   
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Function LngtoHexColor(LngColor As Long)

    Dim r, g, b As Integer
    For r = 0 To 255
        For g = 0 To 255
            For b = 0 To 255
                If LngColor = RGB(r, g, b) Then
                    LngtoHexColor = RGBtoHexColor(Int(r), Int(g), Int(b))
                    Exit Function
                End If
            Next b
        Next g
    Next r
    LngtoHexColor = "求められませんでした。"
End Function

入力は
Pic20100125e

結果例は
Pic20100125f

xt/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 

| | コメント (0) | トラックバック (0)

2010年1月24日 (日)

色の表示形式の変換 2

色の表示形式

長整数型(Long)
RGB
16進数

以上3つをそれぞれ変換してみる。
今回は、RGBと16進数の変換について

・RGB => 16進数

RGB関数の各引数のRed, Green, Blueの値を
16進数に変換する
それにはHex関数を使う。

16進数に変換した後に
1桁だった場合
0を変換後の値に付け加える。

つまり、0から16までの10進数は
16進数では0からFまでの
1桁になるので
左に0を加えて2桁で表すようにする。

RGB => 16進数コード:

Sub macro100124a()
'RGB => 16進数
    Dim r, g, b As String
    On Error GoTo ErrHandle
    r = InputBox("色の表示形式変換:RGB => 16進数" _
        & Chr(10) & "Redの値を入力してください。")
    g = InputBox("色の表示形式変換:RGB => 16進数" _
        & Chr(10) & "Greenの値を入力してください。")
    b = InputBox("色の表示形式変換:RGB => 16進数" _
        & Chr(10) & "Blueの値を入力してください。")
    If r <> "" And b <> "" And g <> "" Then
        If Int(r) > -1 And Int(r) < 256 Then
            If Int(g) > -1 And Int(g) < 256 Then
                If Int(b) > -1 And Int(b) < 256 Then
                    MsgBox "RGB(" & Int(r) & ", " & _
                        Int(g) & ", " & Int(b) & ") = " & _
                        RGBtoHexColor(Int(r), Int(g), Int(b))
                    Exit Sub
                End If
            End If
        End If
    End If
    On Error GoTo 0
    MsgBox "0から255までの数字を入力してください。" & _
        Chr(10) & "終了します。"
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Function RGBtoHexColor(r As Integer, g As Integer, b As Integer)
    Dim StrHex As String
    If r < 16 Then
        StrHex = "#" & StrHex & "0" & Hex(r)
    Else
        StrHex = "#" & StrHex & Hex(r)
    End If
    If g < 16 Then
        StrHex = StrHex & "0" & Hex(g)
    Else
        StrHex = StrHex & Hex(g)
    End If
    If b < 16 Then
        StrHex = StrHex & "0" & Hex(b)
    Else
        StrHex = StrHex & Hex(b)
    End If
    RGBtoHexColor = StrHex
End Function

入力は
Pic20100124a
Pic20100124b
Pic20100124c

結果例は
Pic20100124d

・16進数 => RGB

16進数から10進数に変換する
そういった関数がないようなので
違うもので代用する。
VBAヘルプのHex関数を参照します。

適切な範囲の数値の前に &H を付けて記述すると、値を直接 16 進数で記述することができます

これは実質的に
16進数から10進数へ変換する関数のように
使うことができそうです。

例えば

&HF = 15
&HA = 10
&HFF = 255

数字と同様にダブルクォーテーションで囲まない。

さらに文字列に含まれる数値を
適切なデータ型に変換する関数

Val関数

を使う。
詳細はVBAヘルプで

16進数 => RGBコード:

Sub macro100124b()
'16進数 => RGB

    Dim StrHexColor As String
    On Error GoTo ErrHandle
    StrHexColor = InputBox("色の表示形式変換:16進数 => RGB" _
        & Chr(10) & "#以下を入力してください。")
    On Error GoTo 0
   
    MsgBox "#" & StrHexColor & " = " & _
        HexColortoRGB(StrHexColor)
   
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Function HexColortoRGB(StrHexColor)
    If Len(StrHexColor) <> 6 Then
        GoTo ErrHandle
    Else
        Dim i As Integer
        For i = 1 To 6
            If Val("&H" & Mid(StrHexColor, i, 1)) = 0 And _
                Mid(StrHexColor, i, 1) <> 0 Then
                GoTo ErrHandle
            End If
        Next i
    End If
       
    Dim r, g, b As Variant
    r = Val("&H" & Left(StrHexColor, 2))
    g = Val("&H" & Mid(StrHexColor, 3, 2))
    b = Val("&H" & Right(StrHexColor, 2))
    HexColortoRGB = "RGB( " & r & ", " & g & ", " & b & " )"
Exit Function
ErrHandle:
    HexColortoRGB = "適切な値を入力してください。"
End Function

入力は
Pic20100124e

結果例は
Pic20100124f

| | コメント (0) | トラックバック (0)

2010年1月23日 (土)

色の表示形式の変換 1

色の表示形式

長整数型(Long)
RGB
16進数

以上3つをそれぞれ変換してみる。
今回は、RGB と 長整数型(Long)

・RGB => 長整数型(Long)

おなじみRGB関数を使う。

RGB => 長整数型(Long)コード:

Sub macro100123a()
'RGB => 長整数型(Long)
'わざわざInputする必要もないですが…
    Dim r, g, b As String
    r = InputBox("色の表示形式変換:RGB => 長整数型(Long)" _
        & Chr(10) & "Redの値を入力してください。")
    g = InputBox("色の表示形式変換:RGB => 長整数型(Long)" _
        & Chr(10) & "Greenの値を入力してください。")
    b = InputBox("色の表示形式変換:RGB => 長整数型(Long)" _
        & Chr(10) & "Blueの値を入力してください。")
    On Error GoTo ErrHandle
    If r <> "" And b <> "" And g <> "" Then
        If Int(r) > -1 And Int(r) < 256 Then
            If Int(g) > -1 And Int(g) < 256 Then
                If Int(b) > -1 And Int(b) < 256 Then
                    MsgBox "RGB(" & Int(r) & ", " & _
                        Int(g) & ", " & Int(b) & ") = " & RGB(r, g, b)
                    Exit Sub
                End If
            End If
        End If
    End If
    On Error GoTo 0
    MsgBox "0から255までの数字を入力してください。" & _
        Chr(10) & "終了します。"
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub

入力は
Pic20100123a_2
Pic20100123b
Pic20100123c

結果例は
Pic20100123d

簡単なエラートラップ付いてます。
0から255以外の数字を入力すると

Pic20100123e

小数はInt関数を使う時に四捨五入されます。

数字以外を入力すると
Pic20100123f

・長整数型(Long) => RGB

RGB関数の各引数の
Red, Green, Blueを
1から255まで順に確かめていく。

長整数型(Long) => RGBコード:

Sub macro100123b()
'長整数型(Long) => RGB

    Dim LngColor As Long
    On Error GoTo ErrHandle
    LngColor = InputBox("色の表示形式変換:長整数型(Long) => RGB" & _
        Chr(10) & "長整数型(Long)を入力してください。")
    MsgBox LngColor & " = " & StrRGB(LngColor)
    On Error GoTo 0
Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Function StrRGB(LngColor As Long)
'長整数型(Long) => RGB

    Dim r, g, b As Integer
    For r = 0 To 255
        For g = 0 To 255
            For b = 0 To 255
                If LngColor = RGB(r, g, b) Then
                    StrRGB = "RGB(" & r & ", " & g & ", " & b & ")"
                    Exit Function
                End If
            Next b
        Next g
    Next r
    StrRGB = "RGBを求められませんでした。"
End Function

入力は
Pic20100123g

結果は
Pic20100123h

エラートラップは前のやつと同等です。
小数はLong型に入れられるときに
まるめられるようです。

| | コメント (0) | トラックバック (0)

2010年1月20日 (水)

ダブルクォーテーションをシングルクォーテーションに置換する

ダブルクォーテーションを
シングルクォーテーションに置換したい場面は
どういう時でしょうか?

例えば…
HTMLでリンクを作るにはこういうタグを使います。

<A href="https://yumem.cocolog-nifty.com/blog/">やむえむのExcel VBAメモ</A>

Aタグの属性(href)のところに
ダブルクォーテーションを使います。

これをJavaScriptで表示しようと
そのままdocument.write()の()の中に入れるとこうなります。

document.write("<A href="https://yumem.cocolog-nifty.com/blog/">やむえむのExcel VBAメモ</A>");

しかしこれではうまくいきません。
ダブルクォーテーションの中に
ダブルクォーテーションが入ってしまっているからです。

このような時
JavaScriptの文字列の中の
HTMLのタグの属性に使われている
ダブルクォーテーションを
シングルクォーテーションに替えて扱います。

ここで、ダブルクォーテーションを
シングルクォーテーションに置換する必要が生じます。

置換にはReplace メソッドを使います。
What:=の方が置換前の文字
Replacement:=の方が置換後の文字です。

詳しい説明はVBAヘルプを見てください。

コードはこちら

「"」を「'」に置換するコード:

Sub macro100120a()
'ダブルクォーテーションを
'シングルクォーテーションに置換

    Range("A1").Replace _
        What:=Chr(34), Replacement:="'"
       
End Sub

プロシージャ実行前のセルA1
Pic20100120a

結果は
Pic20100120b

Chr関数は過去記事を参照して下さい。

この例のように1行くらいではメリットは
あまりありません。

しかし、既存のたくさんのHTMLを
JavaScriptで使いたい時など
手間のかかる単純作業を
VBAがサッとやってくれると
楽です。

| | コメント (0) | トラックバック (0)

2010年1月19日 (火)

センター試験数学のプログラム問題をVBAで

センター試験…
今はもう遠いむかしですね~

高校生の時
数学の教師にセンター入試のプログラムのことを
聞いたことがあったのですが
全く教えてもらえませんでした。

こんなもんも教えられないで
よくあの人たちは数学教師を
やっていられたなーと思います。
世の中 結構 甘いですね。

さて、今回のプログラム問題のテーマは
三角形の3辺の長さの関係についてでした。

つまり、
三角形で一番長い辺は
その他の2辺を足したものより小さい。
というやつです。

センター入試のプログラム問題は
最初にネタバレしてしまえば
すごい簡単なんですけど
徐々にネタバレっていうのが
常套手段です。
親切な誘導でもあります。

詳しい問題は2010年1月18日の新聞で確認してください。

問題:a + b + c = N なる自然数a、b、c の組の総数を求める。
ただしa <= b <= c

この条件より
aのとり得る値は

1 <= a <= Int(N/3)

bのとり得る値は

a <= b <= Int((N - a)/2)

とわかります。
a, b が決まれば c はただ1つです。
なので b がいくつあるかが
この問題の山場ですね~
問題番号でいうと「エ」の問題。

例えば
1<= b <= 4 の自然数は
1, 2, 3, 4 の4つです。
式で出そうとすると
4 - 1 + 1 = 4
この「+1」のところを忘れがちです。

上述の b のとり得る値より

b = Int((N - a)/2) - a + 1

になります。
これが問題「エ」の答えですね。

さて、VBAで実行できるように
最初のプログラムを書き直します。
INPUTは、InputBox
Printは、MsgBoxで代用してます。

センター試験2010 プログラムの問題のコード:

Sub macro100119a()
'センター試験2010 プログラムの問題
    Dim N, X, A As Integer
    N = InputBox("自然数Nを入力してください")
    X = 0
    For A = 1 To Int(N / 3)
        X = X + Int((N - A) / 2) - A + 1
    Next A
    MsgBox "N=" & N & "のとき、総数は" & X & "通りである"
End Sub

Nを入力します
Pic20100119a

結果は
Pic20100119b

次は行番号131-137の所です。

自然数Nを三角形の三辺の長さとなり得る三つの自然数a, b, c (a <= b <= c)の和として表 す方法をすべて列挙し、その総和を求める。

の箇所ですが
ようするに
自然数a, b, c (a <= b <= c) に
a + b > c という条件が増えるということです。

この条件が
三角形で一番長い辺は
その他の2辺を足したものより小さい。
にあたります。

コードはこちら
今度は表示する回数が多いので
PRINT を Debug.Printで代用して
イミディエイト ウィンドウに表示させてみました。

イミディエイト ウィンドウは
「表示」-「イミディエイト ウィンドウ」
で表示できます。

センター試験2010 プログラムの問題のコード2:

Sub macro100119b()
'センター試験2010 プログラムの問題
    Dim N, X, A, B, C As Integer
    N = InputBox("自然数Nを入力してください")
    X = 0
    For A = 1 To Int(N / 3)
        For B = A To Int((N - A) / 2)
            C = N - A - B
            If C < A + B Then
                Debug.Print "(" & A & ", " & B & ", " & C & ")"
                X = X + 1
            End If
        Next B
    Next A
    Debug.Print "N=" & N & "のとき、総数は" & X & "通りである"
End Sub

結果は
Pic20100119c

正直に言うと
存在は知っていたものの
イミディエイト ウィンドウを使ったことなかったですが
MsgBoxより断然便利。

今までMsgBoxにかなり時間を無駄にしました。
不覚でした。

| | コメント (0) | トラックバック (0)

2010年1月18日 (月)

マルチコアとVBA

今使っているパソコンが
シングルコアかマルチコアかは
タスク マネージャでわかります。

タスクマネージャは
「ファイル名を指定して実行」で
taskmgr.exe
と入力してOKを押して実行できます。

タスクマネージャの「パフォーマンス」のところ
「CPU使用率の履歴」の枠を見てください。

シングルコアは
Pic20100118a

ダブルコアは
Pic20100118b

クアッドコアはここが4つになっています。

長く時間のかかるプロシージャを実行してみると
シングルコアの場合
CPU使用率が100%くらいになります。
Pic20100118c

一方、ダブルコアの方は
CPU使用率は50%くらいです。
Pic20100118d

なぜかといって調べてみると
どうもExcel2000がマルチコアに対応していない
らしいのです。

いろいろ検索して
こんなページを見つけました。
パソコン雑誌:DOS/V POWER REPORTのWebページです。

2007 Office systemはマルチコア CPUで使え!

なるほど、
ここを読むと
マルチコアに対応しているOfficeのバージョンは
2007からで
それ以前のバージョンは
マルチコアのパソコンで使っても
CPUを使い切れないみたいです。

そーかー
このマルチコアのパソコンも
Office2007にすれば
もっと速くなるんだー

と思った方、待ってください。
私はこれで失敗しました…

何日もかかるプロシージャを実行していた私は
この情報でOffice2007に飛びつきました
(OEM版ですが、あはは)

届いて早速使ってみました。
遅いです(泣)
タスクマネージャで見てみると
確かにCPUはフルに使えているようなんですが
遅いです(泣)

なじぇーと思ってまた検索…
こんなんでましたけど~
msdnのページです。

Excel 2007 における パフォーマンスの改善

VBAのユーザー定義関数は

常にメイン スレッドで動作し、何個のプロセッサまたはスレッドが使用されていても、一度に 1 つずつしか実行できません。

とあります。

FunctionプロシージャとSubプロシージャの違いは
値を返すか返さないかで
中でやってることは自分でプログラムしたものなので
結局、自分で作ったプロシージャは
マルチコアのパソコンで
Excel2007で実行しても速くならない。

こう、私は理解しましたが(知識不足で確信できません)
もちろん、マルチスレッド計算以前の
VBAマクロを速くする工夫あってのことです。

それにしても
同じ「何日もかかるプロシージャ」を
同じパソコンを用いて
Excel2007とExcel2000の両方で実行したところ
Excel2007の方が遅くてビックリです。
同じくらいなら納得できますが…

最終的にOffice2007はお蔵入りに…

このmsdnのページはExcel2007でなくても
参考になります。

特に、
今までプロシージャの速度を測るのに
Time 関数を使っていたので
MICROTIMER() 関数は重宝しそうです。

| | コメント (0) | トラックバック (0)

2010年1月17日 (日)

Excel VBAでセル内での改行

手動でセルを選択、アクティブにして
セルに入力する時に、
セル内で改行したいと思って
{Enter}を押す。
すると、セル内で改行できずに
下のセルに移動してしまいます。

手動の入力でセル内で改行する時は

Alt + {Enter}

で改行します。

Excel VBAでセルの値を設定する時
セル内で改行するには、
MsgBoxやInputBoxでの改行と同じく
Chr(10)を使います。

セル内で改行するコード:

Sub macro100117a()
'セル内での改行
    Cells(1, 1) = "改行前" & Chr(10) & "改行後"
End Sub

結果は
Pic20100117a

ワークシート関数にもChr関数と同じような
CHAR関数があります。

="改行前" & CHAR(10) & "改行後"

とセルに手動で入力してみる。

計算結果のダイアログでは
改行されているようですが
Pic20100117b

セルの表示ではこのように
Pic20100117c

改行されませんでした。

また、

セルを下に移動するときは {Enter}
セルを右に移動する時は {Tab}

を使います。
なのでセル内で{Tab}を使おうとすると
右に移動してしまいます。

そこで{Enter}と同様に
Chr関数を使ってセル内に{Tab}を入れてみる。

セル内に{Tab}を入れるコード:

Sub macro100117b()
'セル内でのタブ
    Cells(1, 1) = "改行前" & Chr(10) _
        & Chr(9) & "改行後タブ"
End Sub

結果は
Pic20100117d

この例では{Tab}は使えませんでした。

セル内で{Tab}を使いたい時は
スペースで代用するのがよさそうです。

| | コメント (0) | トラックバック (0)

2010年1月15日 (金)

セルの高さと幅の設定

セルの縦と横の比 の記事のときに
セルの大きさを思い通りに決めることは
案外難しかったのですが
今回はその続き…

まずは
マイクロソフトサポートオンラインでお勉強。
「Excel で列の幅が決定されるしくみについて」

とりあえず

現在の標準フォント
サイズ
標準の列幅(標準フォントの半角 8.38 文字)
標準の行の高さ

について調べます。

標準フォント,サイズ,列幅,行の高さ表示コード:

Sub macro100115a()
'標準フォントとサイズ
    Sheets.Add
    Dim i, j As Integer
    i = 2
    j = 2
    Cells(i, j) = "StandardFont"
    Cells(i, j + 1) = Application.StandardFont
    i = i + 1
    Cells(i, j) = "StandardFontSize"
    Cells(i, j + 1) = Application.StandardFontSize
    Cells(i, j + 2) = "ポイント単位"
    i = i + 2
   
    Cells(i, j) = "RowHeight"
    Cells(i, j + 1) = Range("A1").RowHeight
    Cells(i, j + 2) = "ポイント単位"
    i = i + 1
    Cells(i, j) = "Height"
    Cells(i, j + 1) = Range("A1").Height
    Cells(i, j + 2) = "ポイント単位"
    i = i + 2

    Cells(i, j) = "ColumnWidth"
    Cells(i, j + 1) = Range("A1").ColumnWidth
    Cells(i, j + 2) = "1文字単位"
    i = i + 1
    Cells(i, j) = "Width"
    Cells(i, j + 1) = Range("A1").Width
    Cells(i, j + 2) = "ポイント単位"
    Columns("B:D").EntireColumn.AutoFit
   
End Sub

結果は

Pic20100115a

ここでは、ColumnWidthの単位を
勝手に「文字単位」と言うことにします。

もしかして
ColumnWidth ではなく
Widthの 方を使ったほうが
単位が同じポイントなので
縦と横の比率がわかりやすいのでは?
と考えて width の方を使って
セルの列幅を変更してみる。

Width プロパティで列幅変更コード:

Sub macro100115b()
'Width プロパティで列幅変更

    Range("A1").RowHeight = 20
    Range("A1").Width = 20
   
End Sub

結果は

Pic20100115b

Pic20100115c

ダメです。
確かにVBAヘルプの Height プロパティの頁には
「Range オブジェクトの場合は、値の取得のみ可能」
とあったが
Width プロパティの方にはなかったはず…

仕方ないので
また、比率を使います。
今回は手動なしでやりたいです。

列幅、行高さ共にポイント単位で指定します。
最初のコードの結果である
ClumnWidth と Width の比
8.38 : 54 をマクロで取得します。
シートを挿入して変更をしていない状態で

S_ColumnWidth = Range("A1").ColumnWidth
S_Width = Range("A1").Width

これを使って
ポイント単位で指定した列幅を
文字単位にします。

L(指定した列幅)* S_ColumnWidth / S_Width

が変換式です。
試しに1辺50ポイントの正方形にしてみる。

1辺50ポイント(=L )の正方形にしてみるコード:

Sub macro100115c()
    '標準の行の高さ、列幅を取得
    Sheets.Add
    Dim S_ColumnWidth, S_Width As Single
    S_ColumnWidth = Range("A1").ColumnWidth
    S_Width = Range("A1").Width
   
    '1辺の長さをLで指定
    Dim L As Integer
    L = 50
    Range("A1").RowHeight = L
    Range("A1").ColumnWidth = L * S_ColumnWidth / S_Width
    Dim i, j As Integer
    i = 2
    j = 2
    Cells(i, j) = "StandardFont"
    Cells(i, j + 1) = Application.StandardFont
    i = i + 1
    Cells(i, j) = "StandardFontSize"
    Cells(i, j + 1) = Application.StandardFontSize
    Cells(i, j + 2) = "ポイント単位"
    i = i + 2
   
    Cells(i, j) = "RowHeight"
    Cells(i, j + 1) = Range("A1").RowHeight
    Cells(i, j + 2) = "ポイント単位"
    i = i + 1
    Cells(i, j) = "Height"
    Cells(i, j + 1) = Range("A1").Height
    Cells(i, j + 2) = "ポイント単位"
    i = i + 2

    Cells(i, j) = "ColumnWidth"
    Cells(i, j + 1) = Range("A1").ColumnWidth
    Cells(i, j + 2) = "1文字単位"
    i = i + 1
    Cells(i, j) = "Width"
    Cells(i, j + 1) = Range("A1").Width
    Cells(i, j + 2) = "ポイント単位"
    Columns("B:D").EntireColumn.AutoFit
       
End Sub

結果は

Pic20100115d

わかりません!

計算で出したWidthの0.25の差は
まだ理解できる気がしますが
RowHeightとHeightの差はなぜ?
つづく…

| | コメント (0) | トラックバック (0)

2010年1月14日 (木)

VBA サンプル マクロを検索

マイクロソフトサポートオンラインの
サンプル マクロを探すキーワードは

マイクロソフトは提供プログラミング言語の使用方法の一例としてのみ

がいいようです。

マイクロソフトサポートオンライン内を
このキーワードを検索すると
検索結果は2030件(2010.01.14 現在)
件数は検索ごとに多少増減するようです。

これを関連製品:で絞り込んだ結果

Excel 2000 440件
Excel 487件
Excel 2002 72件
Excel 97 97件

機械翻訳が気持ち悪いので
マイクロソフトサポートオンラインの右上にある
「国を選択する」で米国に変更して
キーワード

Microsoft provides programming examples for illustration only

で検索…
おっと、こちらは検索結果16000件
(検索結果は検索するごとに多少増減)

Show Me: で絞込むと

Excel 2000 3140件
Excel 3230件
Excel 2002 761件
Excel 97 441件

検索結果の件数だけ見ると
英語のリソースの方が
8倍くらいあります。

パソコンが使えるか使えないかが
情報格差になっている昨今ですが

既に、英語が使えるか使えないかが
情報格差になっていると
実感しますね~

| | コメント (0) | トラックバック (0)

2010年1月13日 (水)

任意の整数から任意の整数までの乱数

乱数を発生させるにはRnd関数を使います。
Rnd関数は0 以上、1 未満の範囲の値を返す。
試しに表示させてみる。

Rnd関数試しコード:

Sub macro100113a()
'乱数を発生させる

    MsgBox Rnd
   
End Sub

結果の例は

Pic20100113a

こんな乱数発生してます。

まず、1から6までの整数乱数を発生させてみる。
Rnd関数が返す乱数は

0 <= Rnd < 1 より
0 * 6 <= Rnd * 6 < 1 * 6
0 <= Rnd * 6 < 6

つまりRnd関数に6をかけると
0以上6より小さい
単精度浮動小数点数型 (Single) を返す。

これを整数型に変換すると

0, 1, 2, 3, 4, 5

のどれかの値を返すことになる。
整数への変換はInt関数を使う

Int(6 * Rnd)

今は、1から6までの整数がほしいから
さらに1を足す。

Int((6 * Rnd) + 1)

これを使ったコードはこちら

1から6までの乱数整数を発生させるコード:

Sub macro100113b()
'1から6までの乱数整数を発生させる

    Dim MyValue As Integer
   
    MyValue = Int((6 * Rnd) + 1)
    MsgBox MyValue
   
End Sub

結果の例は

Pic20100113b

次に
任意の整数から任意の整数までの
乱数整数を発生させる。

これには
上述の1から6までの整数乱数を発生させるために使った

Int((6 * Rnd) + 1)

の6と1の部分を変えるだけ。

例えば、14から23までの整数乱数がほしかったら

Int(((23 - 14) * Rnd) + 14)
Int((9 * Rnd) + 14)

にします。

Function プロシージャを作ってみました。
コードと使用例はこちら

Function プロシージャMyRndと使用例のコード:

Function MyRnd(a As Integer, x As Integer) As Integer
'条件:a < x

    MyRnd = Int(((x - a) * Rnd) + a)
   
End Function
Sub macro100113c()
'MyRnd関数に使用例
'14から23までの整数乱数を返す

    MsgBox MyRnd(14, 23)
   
End Sub

| | コメント (0) | トラックバック (0)

2010年1月12日 (火)

セルの縦と横の比

意外に難しいのが
セルの高さと幅の変更

私はExcelでセルを使って描画する目的で
セルの高さと幅を1:1にしたいと思ったのです。
VBAヘルプでそれらしい

ColumnWidth
RowHeight

を見つけたので
次のようなコードで試す。

とりあえずセルの高さ幅を変更するコード:

Sub macro100111a()
'セルA1の高さ・幅を変更
   
    Range("A1").RowHeight = 10
    Range("A1").ColumnWidth = 10
   
End Sub

結果は
Pic20100111a

明らかに1:1ではない。
なぜ???
単位は何?

VBAヘルプによると、
ColumnWidth プロパティ:
列幅の単位は、標準スタイルの 1 文字分の幅に相当
プロポーショナル フォントでは、
数字の 0 の幅が列幅の単位になるそうです。

RowHeight プロパティ
ポイント単位のようです。

標準スタイルの 1 文字分の幅?
プロポーショナル フォント?
そもそもポイントってどんな単位?

ちょっと?が多すぎて混乱します。

調べ物が多そうなので
まずは、終わり良ければすべて良し的
ドロクサイ手法を考えます。

手動で行の高さ・列の幅を変更する時
このようにピクセル単位が表示されます。

Pic20100111b

Pic20100111c

これを使います。
高さ・幅を100x100ピクセルにしたら
目分量的に1:1のようなので
この高さ75:幅11.88の比率を利用します。

つまり、
例えば高さをHにしたい時
幅W = 11.88 * H / 75 です。
これを利用したコードはこちら。

とりあえずセルの高さ幅を変更するコード2:

Sub macro100111b()
'セルA1の高さ・幅を1:1に変更
'ドロクサイ手法
   
    Cells.RowHeight = 40
    Cells.ColumnWidth = 11.88 * Cells.RowHeight / 75
   
End Sub

結果:
Pic20100111d

見た目には1:1になったかと思われます。

ということで
疑問点は多数かつ
ドロクサイ手法ではありますが
まあまあ目的は達成されたかと…

| | コメント (0) | トラックバック (0)

2010年1月11日 (月)

Chr関数に使いそうなASCIIコードの表

Chr関数に使いそうなASCIIコードの表
文字・制御文字Chr関数
" Chr(34)
スペース Chr(32)
Tab Chr(9)
ライン フィード Chr(10)
キャリッジ リターン Chr(13)
バックスペース Chr(8)

使い方は、
Chr関数の方を文字列に&で加える。
例えば、

"今から改行します。" & Chr(10) & "改行しました。"

ライン フィード、キャリッジ リターンについては
こちらの記事をご参考に
→改行って改行と言わないのねVBAでは

| | コメント (0) | トラックバック (0)

2010年1月10日 (日)

改行って改行と言わないのねVBAでは

VBAヘルプ「Chr関数」頁より

ASCII コード 0 ~ 31 の範囲の文字は表示できません。この中には次に示す制御文字が含まれています。これらを利用すると MsgBox 関数や InputBox 関数などを使ってメッセージを表示するときに、文字列の中にタブや改行を含めることができます。

Chr(9)タブ

Chr(10)ライン フィード文字

Chr(13)キャリッジ リターン

を読んで結局「改行」のこと書いてないの?
と思いました。
ASCII コード をVBAヘルプで見ても
「改行」の文字は見当たらないし…
もしや?と思って

ライン フィード文字
キャリッジ リターン

をインターネットで検索。(文明の利器です。)
やはりそうでしたか。
Wikiの「改行コード」の頁にありました。
ライン フィード文字は「改行」ということでよさそうですが、
キャリッジ リターンはMsgBoxで使うとどうなるんでしょうか?
ソース:改行コード-Wikipedia

やってみました。

ライン フィード文字とキャリッジ リターン

Sub macro100110a()
'ライン フィード文字と
'キャリッジ リターン

    Dim moji As String
    moji = "ライン フィード文字を使います。" & _
        Chr(10) & _
        "使った後です。"
    MsgBox moji
    moji = "次は、キャリッジ リターンを使います。" & _
        Chr(10) & _
        "使った後です。"
    MsgBox moji
   
End Sub

結果:

Pic20100110a

Pic20100110b

両方とも普通に改行できているようで
上記のコードの使用では違いはないようです。

| | コメント (0) | トラックバック (1)

2010年1月 9日 (土)

”(ダブルクォーテーション)を文字列に入れる

Excel VBAでHTMLソースコードを生成しようとしたところ
”(ダブルクォーテーション)を文字列に入れる必要が発生。

VBAでは、文字列はダブルクォーテーションで挟みます。

なので、ダブルクォーテーションを文字列に入れようと
ダブルクォーテーションをダブルクォーテーションではさんだら
”””ってな風になって
おかしなことになるよね。
っと思いながらもやってみたら
やはりダメ。

何でもとりあえず確かめたい性格ですので…

VBAヘルプで

「ダブルクォーテーション」「二重引用符」

と検索しても出てきません。
しょうがないから「文字」
などと広範囲な検索して地道に読む。。

で、Chr関数を発見。

なるなる、これを使うとMsgBoxで改行もできるのね。

使い方は

Chr(charcode)
charcodeに通常、ASCII コード の 0 ~ 255 の範囲の値を指定する。

ダブルクォーテーションのASCII コード は34なので
Chr(34)を&でつなげて使います。

”を文字列に含めるコード:

Sub macro100109a()
'ダブルクォーテーションを文字列に含める

    Dim moji As String
    moji = Chr(34) & _
        "ダブルクォーテーションで囲む" & _
        Chr(34)
    MsgBox moji
   
End Sub

結果:
Pic20100109a

| | コメント (0) | トラックバック (0)

2010年1月 7日 (木)

Excelで表示できる色はいったい何色?

さて
VBAにおいてRGB関数で色を指定する
の時に、とりあえず256x256x256通りの色の表示を見ました。
実際には256x256x256色も表示できないことを
見て実感しました。
では一体Excelでは何色表示できるのか
自力で調べてみます。

RGB関数は長整数型 (Long)です。
Msgboxで表示させてみるとわかります。

MsgBox RGB(0, 0, 0)

また、セルの塗りつぶしの色は、

MsgBox ActiveCell.Interior.Color

でわかります。

両方とも長整数型 (Long)なので
これを利用して
Excelでは何色表示できるのか調べます。

最初に

実際に表示される色(以下、表示色)
RGB関数の引数Red, Green, Blue
RGB関数の長整数型 (Long)
表示色のLong

の4つの関係を見てみます。
以下のコードをコピペし実行すると
次のようになります。
関係を見るだけなので
ここでは一部の組み合わせしか表示していません。

4つの関係を見るコード:

Sub Macro100107b()
'RGB関数のRed, Green, Blueと
'そのLong型と
'実際に表示される色の長整数型 (Long)の関係を見る
    Dim r, g, b As Integer
    Dim i As Long
    Cells.Delete
    Cells(1, 1) = "色の表示"
    Cells(1, 2) = "RGB"
    Cells(1, 3) = "RGBLong"
    Cells(1, 4) = "表示色Long"
    i = 2
   
    Application.ScreenUpdating = False
    For r = 0 To 1
        For g = 0 To 100
            For b = 0 To 255
                Cells(i, 1).Interior.Color = RGB(r, g, b)
                Cells(i, 2) = "(" & r & ", " & g & ", " & b & ")"
                Cells(i, 3) = RGB(r, g, b)
                Cells(i, 4) = Cells(i, 1).Interior.Color
                i = i + 1
            Next b
        Next g
    Next r
    Application.ScreenUpdating = True
   
End Sub

結果:
Pic20100107a

上図のようにRed, Green, Blueの組み合わせと
それにともないRGB関数のLongの値も違うのに
同じ黒の表示色になっているものがあります。
表示色が同じなら、表示色のLongも同じです。

ここで、ある1つの表示色のLongと
RGB関数Longの値が同じものが1つだけあると予想できます。

そこで
表示色Long = RGB関数Long
のものだけを残して表示してみる。
以下のコードを実行すると
次のようになります。

表示色Long = RGB関数Longのコード:

Sub Macro100107c()
'RGB関数Long=表示色Long の条件に
'当てはまるもののみ残す
'参考用に16進数表示も

    Dim r, g, b As Integer
    Dim i As Long
    Dim StrHex As String
   
    Cells.Delete
    Cells(1, 1) = "色の表示"
    Cells(1, 2) = "RGB"
    Cells(1, 3) = "RGBLong"
    Cells(1, 4) = "表示色Long"
    Cells(1, 5) = "16進数表示"
    i = 2
   
    Application.ScreenUpdating = False
    For r = 0 To 255
        For g = 0 To 255
            For b = 0 To 255
                Cells(i, 1).Interior.Color = RGB(r, g, b)
                If Cells(i, 1).Interior.Color = RGB(r, g, b) Then
                    Cells(i, 2) = "(" & r & ", " & g & ", " & b & ")"
                    Cells(i, 3) = RGB(r, g, b)
                    Cells(i, 4) = Cells(i, 1).Interior.Color
                    If r < 16 Then
                        StrHex = "#" & StrHex & "0" & Hex(r)
                    Else
                        StrHex = "#" & StrHex & Hex(r)
                    End If
                    If g < 16 Then
                        StrHex = StrHex & "0" & Hex(g)
                    Else
                        StrHex = StrHex & Hex(g)
                    End If
                    If b < 16 Then
                        StrHex = StrHex & "0" & Hex(b)
                    Else
                        StrHex = StrHex & Hex(b)
                    End If
                    Cells(i, 5) = StrHex
                    StrHex = ""
                    Application.ScreenUpdating = True
                    Application.ScreenUpdating = False
                    i = i + 1
                End If
            Next b
        Next g
    Next r
    Application.ScreenUpdating = True
End Sub

結果:
Pic20100107b
Pic20100107c

一回一回セルを塗りつぶしてますので時間がかかります。

なんと46色しか残ってません。
色鉛筆の種類にしてみたら多いかも知れないですけど
ディスプレイで46色は少なすぎる。
何かが間違っているんでしょうね~

課題が残ります。

ここでの結果を見ると
51, 102, 128, 153, 204 , …
と似通った数値ですが
よく見るとそれらの数値のすべての組み合わせが
残っているわけではないようです。
試しに上の結果にはないRGB(0, 51, 51)の表示色、そのLongと
RGB関数Longの値を見てみます。

次のコードは
RGB(0, 51, 51)の表示色のLongと
RGB関数Longの値が同じものがあれば
そのセルを選択して示します。

表示色Long = RGB関数Longのコード:

Sub Macro100107d()
'Macro100107cを実行したSheetの1行目に
'1行挿入してから
'Macro100107cを実行したSheetで実行してください。

    Dim r, g, b As Integer
    r = 0
    g = 51
    b = 51
    Cells(2, 1).Interior.Color = RGB(r, g, b)
    Cells(2, 2) = "(" & r & ", " & g & ", " & b & ")"
    Cells(2, 3) = RGB(r, g, b)
    Cells(2, 4) = Cells(2, 1).Interior.Color
   
    Dim i, EndRow As Long
    EndRow = Range("D2").End(xlDown).Row
    For i = 3 To EndRow
        If Cells(2, 4) = Cells(i, 4) Then
            Cells(i, 4).Select
            MsgBox "同じ数値があります"
        End If
    Next i
End Sub

結果:
Pic20100107d

RGB(0, 51, 102)と同じ表示色のようです。
r, g, bの値をそれぞれ替えるといろいろ試せます。

以上、自力で何にも情報を探さないで調べた結果
Excelで表示できる色は46色???でした。

| | コメント (0) | トラックバック (0)

2010年1月 6日 (水)

Excel2000をオフラインでアップデート

いまだにExcel2000を使っている人が
どれだけいるのかわかりませんが…

Excel2000をオフラインでアップデートする方法
Excel2000をハードディスクからアップデートする方法
Excel2000をダウンロードしてアップデートする方法

いろいろ表現できますが(何が正しいかわかりません)
こんな感じのことです。

Excel2000のアップデートといっても
実質的にOffice2000のアップデートについてです。

Office 2000 Service Pack 3 (SP-3)のダウンロードは
ダウンロードの詳細 : Office 2000 アップデート: Service Pack 3 (SP-3) から

詳しい説明はそのページをよく読んでください。
読んでもチンプンカンプンですが、
SP-3をインストールする前にSR-1がインストールされている必要があるようです。

メモ Office 2000 SP-3 をインストールする前に、Office 2000 Service Release 1 (SR-1) アップデート をインストールしてください。

のように、さりげなく書いてあります。
必須事項ならもっと上のほうにデカデカと書いてほしいです。
これを発見するのにいろいろウロウロしました。
こちらはオフラインでも実行できました。

ちなみにExcel2000のバージョンの確認方法は、

[ヘルプ]-[バージョン情報]

から確認できます。
バージョンがSR-1ではない人はSR-1をインストールする必要があります。

Office 2000 Service Release 1 (SR-1) アップデート のページは
SP-3のダウンロードページから次のページに行き着きます。

ダウンロードの詳細 : Office 2000 Service Release 1 (SR-1)

しかし、ここからダウンロードできるファイルでは
オフラインでアップデートできません。

当たり前です。
ちゃんとこのように

この更新プログラムは、お使いのコンピュータにインストールされている Office 2000 を Web 上から適用します。複数のコンピュータに更新プログラムを適用する必要があり、SR-1 をハード ディスクにダウンロードする場合は、Office 2000 SR-1 管理者アップデート (ファイル名 : O2ksr1adl.exe) をダウンロードしてください。

さりげなく下のほうに書いてあります。
探してみてください。

それにしても
Microsoftのサイトは事柄が箇条書き的過ぎ、
文脈がなさ過ぎで
いつも、頭が方向性を失って
ぐるぐるします。

はい、こちらが「SR-1のオフラインでもアップデートできるファイル」のダウンロードページです。
Microsoft Office Office 2000/97 最新情報

下から2番目に目的のものがあります。MSさんによれば、

Office 2000 SR-1 管理者アップデート (ファイル名 : O2ksr1adl.exe) をダウンロードしてください。

とのことです。

| | コメント (1) | トラックバック (0)

2010年1月 4日 (月)

VBAにおいてRGB関数で色を指定する

RGB関数を使うとき

RGB(red, green, blue)のred, green, blueのそれぞれに
0から255までの整数を指定します。

理論的には256*256*256=16777216通り指定できますが
実際にはそれだけの種類で表示されません。

経験的にそのことはわかっていたのです。
が、いまいち頭がすっきりしないので、
すべての組み合わせの表示を
実際に見てみようと思ったわけです。

仕組みはいたって単純。

あるredの値で、行方向にgreenを、列方向にblueを
0から255まで変化させて
セルの内部の色を指定するだけ。
コード内ではred, green,blueはそれぞれr, g, b

red軸で変化するカラーパレット

Sub Macro100104a()
'カラーパレット
'r軸で変化
    Dim ColorTable As String
    Dim MyR, MyC As Integer
    Dim r, g, b As Integer
   
    Range(toA1("R2C1:R257")).Delete
    Range(toA1("R2C1:R257")).ColumnWidth = 3 / 4
    Range(toA1("R2C1:R257")).RowHeight = 21.75 / 3
    For r = 0 To 255 Step 8
        Cells(1, 1) = "R=" & r
        Application.ScreenUpdating = False
        For g = 0 To 255
            For b = 0 To 255
                Cells(g + 2, b + 1).Interior.Color = RGB(r, g, b)
            Next b
        Next g
        Application.ScreenUpdating = True
    Next r
End Sub

上記のコードを実行するとこのように

Pic20100104a

この画像は静止画ですが実際にはアニメのように動きます。
全体を見るにはExcelの表示倍率を25%程度にしてください。

意外にも、私ごのみの
パウル・クレーやカンディンスキー風の
抽象絵画的な動画になりました
左上から右下にかけて無彩色が動いていくのが
わかります。
色の勢力図といったところでしょうか。

いや、色の群雄割拠?

色の戦国時代?

色の「信長の野望」!?

ある時点で色がパッと塗り変わるところなんか
「信長の野望」で侵略成功したときを思い出します。

せっかくなので、
green軸、blue軸で変化するコードも作りました。

green軸で変化するカラーパレット

Sub Macro100104b()
'カラーパレット
'g軸で変化
    Dim ColorTable As String
    Dim MyR, MyC As Integer
    Dim r, g, b As Integer
    Range(toA1("R2C1:R257")).Delete
    Range(toA1("R2C1:R257")).ColumnWidth = 3 / 4
    Range(toA1("R2C1:R257")).RowHeight = 21.75 / 3
    For g = 0 To 255 Step 8
        Cells(1, 1) = "R=" & r
        Application.ScreenUpdating = False
        For r = 0 To 255
            For b = 0 To 255
                Cells(r + 2, b + 1).Interior.Color = RGB(r, g, b)
            Next b
        Next r
        Application.ScreenUpdating = True
    Next g
End Sub

green軸表示例:

Pic20100104b

blue軸で変化するカラーパレット

Sub Macro100104c()
'カラーパレット
'b軸で変化
    Dim ColorTable As String
    Dim MyR, MyC As Integer
    Dim r, g, b As Integer
   
    Range(toA1("R2C1:R257")).Delete
    Range(toA1("R2C1:R257")).ColumnWidth = 3 / 4
    Range(toA1("R2C1:R257")).RowHeight = 21.75 / 3
    For b = 0 To 255 Step 8
        Cells(1, 1) = "R=" & r
        Application.ScreenUpdating = False
        For r = 0 To 255
            For g = 0 To 255
                Cells(r + 2, g + 1).Interior.Color = RGB(r, g, b)
            Next g
        Next r
        Application.ScreenUpdating = True
    Next b
End Sub

blue軸表示例:

Pic20100104c

いや~楽しいですね。
この抽象感!!
RGB関数でまだまだ遊べそうです。

| | コメント (0) | トラックバック (0)

« 2009年12月 | トップページ | 2010年2月 »