- ベストアンサー
エクセル VBAが作動しない
セルの色を変換するVBAとして、標準モジュールに以下のマクロを書き込んでいます。 Sub グレイに() Dim c As Range For Each c In Selection With c.Interior If .Color = RGB(162, 187, 220) Then .Color = RGB(190, 190, 190) End With Next End Sub エクセルに戻って、ctrl+F8で、マクロ名を選んで、実行すれば、実行されるはずなのですが、なぜかきちんと変換されません。 詳しく書くと、何度も何度も「実行」ボタンを押していると、セルの色が指定どおりグレイになるときもあるのですが、特に作動するときと作動しないときに操作の差はありません。 当然ですが、「必ず」実行して欲しいのですが、どこに問題があるのでしょうか? 教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#4です。 >それで、 >上記の「Interiorの値を取得」という意味がよくわからなかったので、とりあえ >ず作っていただいたコードをコピーして実行したところ、何の変化もなかったで >す。 動作確認した Excel のバージョンをお知らせしないで、申し訳ありませんでした。 私の方は、Excel2000 でした。質問者さんは、どのバージョンをお使いですか? 選択範囲内で処理をしている最中に、別の選択(ダミーセルに色を入れてみる) をするのが、可能なバージョンと、そうでないバージョンがある様な気がします。 それから、「Interiorの値を取得」は、自分の中では、「Interior オブジェクト の Color プロパティの値を取得」のつもりでした。省略しすぎました。 >ためにし、Range("A1").SelectのところをA1ではなく、すでに色のついている部 >分のセル名にかえたところ、そのセルが真っ黒になりました。 これは、私のバージョンでも確認できました。すみません。 >シート全体で、ある色RGB(162, 187, 220)のついているセルをグレイに変換でき >るコードがありましたら、教えてください。 終了行と終了列を設定してから使ってみてください。 (最大の値を入れるとかなり時間がかかると思います) Sub グレイに() Const endRow = 20 '終了行(最大:65536)※修正してから使って下さい※ Const endCol = 20 '終了列(最大:256) ※修正してから使って下さい※ Dim sheet As String Dim col As Long Dim i As Integer, j As Integer '--- ダミーシートのセルで、RGB の値を取得 sheet = ActiveSheet.Name Sheets.Add Range("A1").Select Selection.Interior.Color = RGB(162, 187, 220) col = Selection.Interior.Color Application.DisplayAlerts = False ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True '--- 指定した行、列まで判定 Sheets(sheet).Select For i = 1 To endRow For j = 1 To endCol If Cells(i, j).Interior.Color = col Then Cells(i, j).Select Selection.Interior.Color = RGB(190, 190, 190) End If Next j Next i Range("A1").Select 'とりあえずA1を選択 End Sub 失敗するといけないので、ファイルをコピーして、テスト用のファイルで 実行してください。(たぶんやっていますよね・・・)
その他の回答 (5)
- papayuka
- ベストアンサー率45% (1388/3066)
実際にRGBでセルに色をつけても、後で取り出すと変わっているのがTest1で分かりますね。 Sub Test1() 'A1に色を設定 Range("A1").Interior.Color = RGB(162, 187, 220) 'A1を見ると色が異なる。 MsgBox "セルの返す色: " & Range("A1").Interior.Color & vbCrLf & _ "RGBの返す色: " & RGB(162, 187, 220) End Sub やっている事は既出のアドバイスと変わりませんが、 実行時に色を変えたいセルを選ばせる方法も、、、 Sub Test2() Dim r As Range, myColor As Long On Error GoTo ER Set r = Application.InputBox _ ("色を変更したいセルを1つ選んで下さい。" & vbCrLf & _ "そのセルと同色のセルを全てグレーにします。", _ "セル選択", Type:=8) myColor = r.Interior.Color For Each r In ActiveSheet.UsedRange If r.Interior.Color = myColor Then r.Interior.Color = RGB(190, 190, 190) End If Next r ER: End Sub
お礼
メッセージボックスで、他の色の場合も指定できるので、とても便利ですね! ありがとうございました。
原因は、#2さんのおっしゃる通りだと思います。 もし、デフォルトのカラーパレットをそのまま使用しているのであれば、 カラーインデックスを使用するのが確実です。 Sub グレイに() Dim c As Range For Each c In Selection With c.Interior If .ColorIndex = 37 Then .ColorIndex = 15 End With Next End Sub ただし、カラーパレットをカスタマイズしていた場合には、上手く 行かない可能性もあります。 回避策として、ダミーのセルに、RGB(162, 187, 220)をセットして Interiorの値を取得し、その値で比較するコードを書いてみました。 Sub グレイに() Dim c As Range Dim col1 As Long Dim col2 As Long For Each c In Selection Range("A1").Select col1 = Selection.Interior.Color 'ダミーセルの色を退避 Selection.Interior.Color = RGB(162, 187, 220) col2 = Selection.Interior.Color '実際のRGB取得 Selection.Interior.Color = col1 'ダミーセルの色を元に戻す With c.Interior If .Color = col2 Then .Color = RGB(190, 190, 190) End With Next End Sub 参考になれば・・・。
補足
ご丁寧なご回答ありがとうございます。 カラーパレットがカスタマイズされているものなので、カラーインデックスで書いたみたらだめだったので、RGBにしてみたのです。 それで、 上記の「Interiorの値を取得」という意味がよくわからなかったので、とりあえず作っていただいたコードをコピーして実行したところ、何の変化もなかったです。 ためにし、Range("A1").SelectのところをA1ではなく、すでに色のついている部分のセル名にかえたところ、そのセルが真っ黒になりました。 シート全体で、ある色RGB(162, 187, 220)のついているセルをグレイに変換できるコードがありましたら、教えてください。
- popesyu
- ベストアンサー率36% (1782/4883)
色をRGB値として取得するには単純に .Color = RGB(162, 187, 220) としても取れないようです。単純にRange.Interior .ColorにはHTMLなどに用いられる16進数のカラーコードを10進数にした数字が入っています。 ですのでIFで比較しようにも「RGB(162, 187, 220)」ではなく「16764057」というような数字が返ってくると。 例えばVISIOでしたらRGB値をそのまま取得する方法があるようですが、エクセルには・・・あるのかないのか分かりませんw http://www.mster.co.jp/visiosquare/cgi-bin/visbbs/mibbs.cgi?fo=auto&mo=p&tn=0364 パレットにあろうが無かろうがこの数字は固有の数値を取りますので、1番さんの言うように予め10進数のカラーコードをとっておいて、そこから比較するという方法が手っ取り早いかと思います。
補足
ご回答ありがとうございます。10進法でのカラーコードの取得方法がわかりません・・・。よろしかったら教えてください。
- ja7awu
- ベストアンサー率62% (292/464)
RGB(162, 187, 220)とRGB(190, 190, 190)の色は、カラーパレットに存在する色ですか? 存在するなら何故インデックス番号で指定しないのですか? RGB(162, 187, 220)の色が、パレットに無ければ、If文の条件式が、Trueになることはないでしょう。
お礼
ご回答ありがとうございました。カラーインデックスの番号でコードを書いたところうまく実行されませんでした。よくみたらパレットがカスタマイズされていたので、それでRGBでやってみたのですがだめでした。
- TTak
- ベストアンサー率52% (206/389)
こんにちは RGB(162, 187, 220) が拾えてないようですね。 色づけしたセルのColorプロパティをイミディエイトウインドウなりmsg関数なりで拾ってみましょう。本当にその色になってますか? 私の環境では、 Range("A1").Color = RGB(162, 187, 220) として、セルA1に色づけした後、 ?Range("A1").interior.Color とすると 16764057 を返してきます。しかし、 ?RGB(162, 187, 220) とすると 14465954 になりました。 実際に色づけしているRGP値を再取得して、両方に対応するようなコードにしてはいかがでしょう? たとえば If .Color = 16764057 Or .Color =14465954 みたいな感じで。 すみません、なぜRGP値が異なるかという原因は調べていません。 excel2000 + win2000 で確認
補足
一番での回答、大変ありがとうございました。 しかしながら、初心者のため、 >色づけしたセルのColorプロパティをイミディエイトウインドウなりmsg関数なりで拾ってみましょう。本当にその色になってますか? というのがどのように調べるものなのかわかりませんでした。どこにRange("A1").Color = RGB(162, 187, 220)を書いたらいいものやら??
お礼
すご~~~い! できました!! ありがとうございました! みごとにグレイに変換されました。