• ベストアンサー

エクセル 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で、マクロ名を選んで、実行すれば、実行されるはずなのですが、なぜかきちんと変換されません。 詳しく書くと、何度も何度も「実行」ボタンを押していると、セルの色が指定どおりグレイになるときもあるのですが、特に作動するときと作動しないときに操作の差はありません。 当然ですが、「必ず」実行して欲しいのですが、どこに問題があるのでしょうか? 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#7198
noname#7198
回答No.5

#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 失敗するといけないので、ファイルをコピーして、テスト用のファイルで 実行してください。(たぶんやっていますよね・・・)

satochan1228
質問者

お礼

すご~~~い! できました!! ありがとうございました! みごとにグレイに変換されました。

その他の回答 (5)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

実際に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

satochan1228
質問者

お礼

メッセージボックスで、他の色の場合も指定できるので、とても便利ですね! ありがとうございました。

noname#7198
noname#7198
回答No.4

原因は、#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 参考になれば・・・。

satochan1228
質問者

補足

ご丁寧なご回答ありがとうございます。 カラーパレットがカスタマイズされているものなので、カラーインデックスで書いたみたらだめだったので、RGBにしてみたのです。 それで、 上記の「Interiorの値を取得」という意味がよくわからなかったので、とりあえず作っていただいたコードをコピーして実行したところ、何の変化もなかったです。 ためにし、Range("A1").SelectのところをA1ではなく、すでに色のついている部分のセル名にかえたところ、そのセルが真っ黒になりました。 シート全体で、ある色RGB(162, 187, 220)のついているセルをグレイに変換できるコードがありましたら、教えてください。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.3

色を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進数のカラーコードをとっておいて、そこから比較するという方法が手っ取り早いかと思います。

satochan1228
質問者

補足

ご回答ありがとうございます。10進法でのカラーコードの取得方法がわかりません・・・。よろしかったら教えてください。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

RGB(162, 187, 220)とRGB(190, 190, 190)の色は、カラーパレットに存在する色ですか? 存在するなら何故インデックス番号で指定しないのですか? RGB(162, 187, 220)の色が、パレットに無ければ、If文の条件式が、Trueになることはないでしょう。

satochan1228
質問者

お礼

ご回答ありがとうございました。カラーインデックスの番号でコードを書いたところうまく実行されませんでした。よくみたらパレットがカスタマイズされていたので、それでRGBでやってみたのですがだめでした。

  • TTak
  • ベストアンサー率52% (206/389)
回答No.1

こんにちは 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 で確認

satochan1228
質問者

補足

一番での回答、大変ありがとうございました。 しかしながら、初心者のため、 >色づけしたセルのColorプロパティをイミディエイトウインドウなりmsg関数なりで拾ってみましょう。本当にその色になってますか? というのがどのように調べるものなのかわかりませんでした。どこにRange("A1").Color = RGB(162, 187, 220)を書いたらいいものやら??

関連するQ&A

  • excel VBA 緑色の付いたセルをすべてコピー

    お世話になります。excel2007です。 緑色の付いたセルをすべてコピーするマクロを作成したいのですが・・・ マクロの記憶の実行 検索(ctrl + F) ⇒ オプションでセルを緑 ⇒ すべて検索 ⇒ 検索結果をすべて選択(ctrl + A) ⇒ 検索を閉じる ⇒ コピー(ctrl + C) マクロの記憶の終了 エクセル上ではしっかりコピーできています。 VBAは以下の通りでした Sub 緑色のセルをすべてコピー() ' 緑色のセルをすべてコピー Macro    With Application.FindFormat.Interior     .PatternColorIndex = xlAutomatic     .Color = 5287936     .TintAndShade = 0     .PatternTintAndShade = 0    End With    Selection.Copy End Sub このマクロを実行しても、現在選択されているセルを コピーしてしまいます(緑色を検索してくれないです)。 どのようにVBAを編集すればよろしいのでしょうか??

  • VBAエラー

    お世話になります。早速ですが、、、 Sub ●() Selection.FormulaR1C1 = "●" With Selection.Font .Name = "MS Pゴシック" .Size = 11 .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End Sub これは、自動記録でのマクロですが、実行されるセル以外の保護と、 併せてシート保護を掛けた状態で実行すると下記エラーが出ます。 実行時エラー '1004': 『 Font クラスの Name プロパティを設定できません。』 エラーの終了ボタンを押すことで何もなかったかのように治まりますが、実行のたびにエラー出力します。 但し、この自動マクロは、エクセル2000上で作成したもので、2000上で実行するとエラーは出ませんが、 2002上で実行すると発生します。何が悪いのでしょうか?

  • EXCEL VBA でマクロが作動するシートとしないシートがある。

    右クリックのショートカットメニューに作成したマクロを追加しました。その追加マクロを実行しても右クリックのショートカットに追加されないシートがあります。同じbookでもその他のシートでは、右クリックのショートカットメニューに追加されているものもあります。 なぜでしょうか? できないのは、右クリックのショートカットの表示です。目的の動作(下記の場合は、フォントの色を変える)は、どのシートでも作動します。 ちなみにプロシージャーは次のように書いています。PERSONAL.XLSに登録してあります。 宜しくお願いします。 'セルの右クリックショートカットメニューを作成 Sub 色々右クリック() 赤みぎクリック 黒みぎクリック 青みぎクリック End Sub Sub 赤みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "赤" .OnAction = "赤フォント" .BeginGroup = False End With End Sub Sub 赤フォント() Selection.Font.ColorIndex = 3 End Sub Sub 黒みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "黒" .OnAction = "黒フォント" .BeginGroup = False End With End Sub Sub 黒フォント() Selection.Font.ColorIndex = 1 End Sub Sub 青みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "青" .OnAction = "青フォント" .BeginGroup = False End With End Sub Sub 青フォント() Selection.Font.ColorIndex = 5 End Sub Sub Reset_RightClick() Dim rightBar As CommandBar Application.CommandBars("cell").Reset End Sub

  • Excel VBA で 一括書式設定(セル内の一部のみ)

    こんにちは。教えてください。 1つのセル内に、 あいうえお1か き! くけこ2 さしすせそ3たち。 つてと45.67? というように、いくつかのセル内改行を含み、文字数がばらばらのデータが入っています。そういうセルが、一行にいくつも並んでいます(途中に空白もあります)。 それらの1行目(上記の例で言うと、「あいうえお1か」)のみ、フォント赤色の書式設定を、マクロで行いたいのです。 そこで、以下のマクロを実行すると、選択セルがひとつだけのときは問題ないのですが、複数のセルを選択すると実行時エラー(型が一致しません)が出てしまいます。 Sub 一行目赤() With Selection.Characters(Start:=1, Length:=InStr(Selection.Value, Chr(10)) - 1).Font .ColorIndex = 3 End With End Sub 選択セルのすべてに対し、一括で書式設定できるようにするにはどうしたらよいでしょうか?ご回答よろしくお願いいたします。

  • VBA セルの色を変更する

    VBA(エクセル2007使用)で、セルの背景色を変更する場合についての質問です。 マクロを実行する度に、セルの背景色を変更するマクロを作成しました。 オレンジ→水色→緑→灰色→無色  という風に変わっていくところまでは できたのですが、これだとマクロを実行するのにセルの状態が無色か、指定した カラーコードで塗りつぶされていないと実行できません。 下記、コードの一番最初の Case で ”背景色がどんな色の場合でも”という条件に したいのですが、どのように記載したらわからずにいます。。。 ---------------------------- Sub 色チェンジ() n0 = ActiveCell.Interior.ColorIndex Select Case n0 Case xlNone   ’ここを”どんな色の場合でも、、、という条件にしたいです。。” Selection.Interior.ColorIndex = 40 Case 40 Selection.Interior.ColorIndex = 34 Case 34 Selection.Interior.ColorIndex = 35 Case 35 Selection.Interior.ColorIndex = 15 Case 15 Selection.Interior.ColorIndex = xlNone End Select End Sub -----------------------------------

  • Excel2007でのVBAについて

    Excel2007でのVBAについて お世話になります。稚拙な質問になると思いますがよろしくお願いします。 VBやマクロにつきましてはまったくの初心者なのですが、 「セルをランダム色で塗る」というコードを自分なりに考え、 ボタンに付着させてみました。以下の通りです。 With Selection.Interior .Pattern = xlSolid .Color = RGB((255 * Rnd), (255 * Rnd), (255 * Rnd)) .PatternTintAndShade = 0 End With しかしボタンを押し実行してみますと、塗りつぶしはされるのですが、 Excelを起動してから最初の実行は必ず同じ色になります(小倉色のような)。 ポチポチとクリックしていっても、ランダムにはならず 毎回同じ順番で色が変化していきます。 1,600万色の中からランダム色で塗りつぶされないのは、何が問題でしょうか? ご指摘と、解決の方法をご教示お願いいたします。

  • Excel VBA で 一括書式設定(選択セルのみ)

    おはようございます。教えてください。 結合されたセル内に、 あいうえお1か き?! くけこ2 さしすせそ3たち。 つてとな45.67 というように、いくつかのセル内改行を含み、文字数がばらばらのデータが入っています。 それらの1行目(上記の例で言うと、「あいうえお1か」)のみフォント緑色、2行目はフォント青色、3行目以降はフォント黒色の書式設定を、選択セルすべてに対し、マクロで行いたいのです。 1行目だけなら以下のマクロでできたのですが、2行目以降の参照の仕方がわかりません。 Sub 一行目緑() For Each c In Selection With c.Characters(Start:=1, Length:=InStr(c.Value, Chr(10)) - 1).Font .ColorIndex = 10 End With Next End Sub ご回答よろしくお願いいたします。

  • エクセルVBA 作動させる度に罫線の種類を変える

    エクセル(2007) VBAで、マクロを作動させる度に選択した範囲の 罫線を変更したく、下記のようなマクロを組みましたが1種類の線しか書けません。。。 どのように修正すればよいか教えて頂きたいです。 何卒宜しくお願い致します。 ----------------------------------- Sub 罫線チェンジ() Select Case ActiveCell.Borders.LineStyle Case xlContinuous Selection.Borders.LineStyle = xlHairline Case xlHairline Selection.Borders.LineStyle = xlDot Case xlDot Selection.Borders.LineStyle = xlDouble Case xlDouble Selection.Borders.LineStyle = xlNone Case Else Selection.Borders.LineStyle = xlContinuous End Select End Sub -----------------------------------

  • エクセルのマクロ

    縦方向に連続したセルを選択状態にした時に、選択セルを基点として右横方向に連続してデータが入力されているセルを罫線で囲う、という処理をマクロで実行したいのですが。 例えば、以下の図で黒丸がデータ入力セルであるとすると、C1~C4を選択状態にして実行すると、C1~D1とC2~F2とC4が罫線で囲われます。  AB CD EFG 1○●●●○○○ 2●●●●●●○ 3○○○○○○○ 4●●●○○○○ 以下のマクロを実行すると、上図の3行目と4行目のところがかなり余計に罫線が引かれてしまいます。どう修正すればいいでしょうか? Sub test1()  yc = Selection.Rows.count  aa = ActiveCell.Address  For y = 0 To yc - 1  ActiveCell.Offset(y, 0).Select  Range(ActiveCell, ActiveCell.End _       (xlToRight)).Select        With Selection.Borders(xlEdgeLeft)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeTop)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeBottom)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    With Selection.Borders(xlEdgeRight)       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic    End With    Range(aa).Select   Next y End Sub

  • エクセル。マクロの記録で出来たVBAを書き直したい。

    エクセル2000(OSはWindows2000)でマクロの記録を行いました。 四角形を出してA1セルにリンクさせフォント等の設定をしたものです。 Sub Macro5() ActiveSheet.Shapes.AddShape(msoShapeRectangle, 200#, 100#, 140#, 80#). _ Select ExecuteExcel4Macro "FORMULA(""=R1C1"")" With Selection.Font .Name = "Century Gothic" .FontStyle = "太字" .Size = 72 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoFalse End Sub これを、実際には四角形をセレクトしないで実行させたいのです。 With ActiveSheet.Shapes.AddShape~ End With といった形になるのでしょうが、どうもうまく出来ません。 ご教示いただければ幸いです。

専門家に質問してみよう