ページ 11

VBAのセルの色変更

Posted: 2015年11月13日(金) 21:35
by 夢幻ノ月夜
ループでB2~J10の値を取得し、その値+2の色をそのセルの背景色にしたいのですが、
エラー1004が出て動きません
どこが悪いのでしょうか?

コード:

Sub ChangeColor()
Dim V As Variant
Dim i As Long
Dim j As Long

For i = 1 To 10
    For j = 1 To 10
        V = Cells(i, j)
        Worksheets("問1").Range("ij").Interior.ColorIndex = 2 + V
    Next
Next

End Sub

Re: VBAのセルの色変更

Posted: 2015年11月13日(金) 22:12
by box
夢幻ノ月夜 さんが書きました:

コード:

        Worksheets("問1").Range("ij").Interior.ColorIndex = 2 + V
Range("ij")
という書き方は認められていないように思います。
Cells(i, j)
にしてみるとか。

Re: VBAのセルの色変更

Posted: 2015年11月13日(金) 22:17
by 夢幻ノ月夜
box さんが書きました:
夢幻ノ月夜 さんが書きました:

コード:

        Worksheets("問1").Range("ij").Interior.ColorIndex = 2 + V
Range("ij")
という書き方は認められていないように思います。
Cells(i, j)
にしてみるとか。
Cells(i,j)ってセルのアドレス返してくれるんですか?

Re: VBAのセルの色変更

Posted: 2015年11月14日(土) 00:14
by YuO
夢幻ノ月夜 さんが書きました:

コード:

        Worksheets("問1").Range("ij").Interior.ColorIndex = 2 + V
"ij"という表記では,変数iおよび変数jの値は利用されないことは理解されていますか。
変数iおよび変数jの値を文字列として扱うならば,

コード:

Trim(CStr(i)) & Trim(CStr(j))
のように,文字列化して連結する必要があります。
ただし,Workspace.Range プロパティの第1引数は,
  • A1形式のセル参照文字列
  • A1:A1形式のセル範囲参照文字列
  • A:A形式のセル範囲参照文字列 (列全体)
  • 1:1形式のセル範囲参照文字列 (行全体)
  • ローカルに定義した名前 ([数式]タブ - [定義された名前]の項目で定義された物)
  • 上記を,で区切った組み合わせ
のみが許されます。
なので,先のように文字列化しても,"11"のようになるだけなので,許されない文字列になります。
box さんが書きました:Range("ij")
という書き方は認められていないように思います。
認められてはいるけれど,"ij"というローカルに定義した名前を参照することになります。
"ij"が定義されていなければ,当然エラーです。
夢幻ノ月夜 さんが書きました:Cells(i,j)ってセルのアドレス返してくれるんですか?
Worksheet.Cells プロパティは,対象となるWorksheet全てを表すRange オブジェクトを返します。
そして,Rangeオブジェクトの既定のプロパティはItem プロパティであるため,

コード:

sheet.Cells(row, column)

コード:

sheet.Cells.Item(row, column)
として扱われます。

MSDNにあるように,Itemプロパティは,Range内のrow行目,column列目のセルを参照するRangeオブジェクトを返しますから,ワークシート全体からrow行column列目のRangeを取得することが出来ます。


……というか……
夢幻ノ月夜 さんが書きました:

コード:

        V = Cells(i, j)
        Worksheets("問1").Range("ij").Interior.ColorIndex = 2 + V
[/quote]
Vの取得にCellsプロパティ (対象オブジェクトを省略しているのでActiveSheet.Cells) を使っていますよね。
Vの型がVariantであるところや2 + Vのように使われているところをみると,Cells(i, j)がどういう型かを意識していないように思えますが,
Cells(i, j)はRange型で,2 + Vではおそらく2 + CInt(V.Value)のように扱われているはずです。
[offtopic]そもそも,Worksheets("問1").Range("ij")はVではだめなのか,という疑問もありますが……[/offtopic]