ここから本文です

エクセルVBAについてなのですが、たとえばC2から始まる表を配列として VDATAに格...

jon********さん

2019/3/222:04:43

エクセルVBAについてなのですが、たとえばC2から始まる表を配列として
VDATAに格納して、一部の範囲を色塗りしたい場合、次のモジュールの

ようにCellsを用いると意図しない位置が塗られてしまいます。
どうしたらいいですか?

Sub 色塗り()
Dim VDATA As Variant

With Range("C2").CurrentRegion
VDATA = .Value
.Range(.Cells(1, 0), .Cells(1, 4)).Interior.Color = vbYellow
'ここに↑エラーが生じます。

End With

End Sub

宜しくお願いいたします。

閲覧数:
66
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

kik********さん

2019/3/312:50:30

> .Cells(1, 0)

この使い方、相対なら間違いじゃありません

Debug.Print Range("C2").Cells(1, 0).Address(False, False)

とすると、B2 が表示されますね?

エラーになるのは、
> Range("C2").CurrentRegion
.Cells(1, 1) は、その範囲の左上を指しますが、
左に1列いったとこ・・・ .Cells(1, 0)
もし、求めた範囲が、A 列も含んでいてたら A 列の左は無いので・・・エラーに

以下を標準モジュールに記述し、Samp1 を実行してみると・・・
エラーにはならないかと・・・
★ 行を有効にして再度 Samp1 を実行してみると・・・エラーに

CurrentRegion で求まる範囲を確かめられたらと


Option Explicit

Public Sub Samp1()
   With Worksheets.Add
'      .Range("A1:B1").Value = "A" ' ★
      .Range("C2:G5").Value = 1
      With .Range("C2").CurrentRegion
         Debug.Print .Address(False, False)
         Debug.Print .Cells(1, 0).Address(False, False)
         Debug.Print .Cells(1, 4).Address(False, False)
         .Range(.Cells(1, 0), .Cells(1, 4)).Interior.Color = vbRed
         Excel.Range(.Cells(1, 0), .Cells(1, 4)).Interior.Color = vbYellow
      End With
   End With
End Sub



以下は、CurrentRegion で求めた範囲の2列目で、
1行目を除いた範囲に色付け

やっていることは、2列目で、1行ずらした範囲と交わる部分・・・・


Public Sub Samp2()
   With Worksheets.Add
      .Range("C2:G5").Value = 1
      With .Range("C2").CurrentRegion
         With .Columns(2)
            Intersect(.Cells, .Offset(1)).Interior.Color = vbYellow
         End With
      End With
   End With
End Sub

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

tra********さん

2019/3/222:51:05

>.Cells(1, 0)
列番号が0というのはダメですね。
このコード自体に、「配列としてVDATAに格納して」という操作はなんの影響もないです。

あと
>With Range("C2").CurrentRegion
>・・・ .Cells(1, 4)
は、
C2を左上角としたCurrentRegionの1行目4列目のセル位置を示します。
なので、シートのセル位置でいうとF2セルの事になります。

こんなコードを実行してみてください。

With Range("C2").CurrentRegion
MsgBox .Cells(1, 1).Address(False, False)
MsgBox .Cells(1, 4).Address(False, False)
MsgBox .Range("C1").Address(False, False)
End With

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる