痔になりやすい生活習慣とは?

お世話になります。
此方に上げられている質問
http://oshiete.coneco.net/qa8046829.html
をみて
添付図1面のようにデータがある時に
各セルの1文字づつの文字色を拾うにはどうしたら良いか…

と、想い 試しに添付 2面のように組んでみたのですが、
フォントカラーの取り出しにはobject型が要るとのこと
VBAにお叱りを受けました。

これて駄目なのですか?
違うやり方では1文字づつのフォントカラーを見ることが出来るのですか?

ご教示をお願い致します。

「Excel 文字色の扱い」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは。



> フォントカラーの取り出しにはobject型が要るとのこと
> VBAにお叱りを受けました。

問題点は、
  Dim col(5, 3) As Object
この部分と
  ... = Mid(r2, counter, 1).Font.ColorIndex
この部分です。
Object型の変数に戻り値Long型の値を代入しようとしていますが、
既定のプロパティを持たないObject型の変数への代入では、
Set obj = ...Setステートメントを省略している時点で実行時エラーです。

一文字ずつ(Charactersオブジェクト)のColorIndexを
配列に格納するなら、ColorIndexはVariant型ですから
  Dim col(5, 3)
もしくは
  Dim col(5, 3) As Long
でも差支えないでしょう。


Mid(r2, counter, 1)は、Mid関数ですね。
r2.Value(Rangeオブジェクトのプロパティ省略形からの既定のプロパティはValue)
戻り値の文字列をMid関数で抜きだしているだけですから、これは文字列値ですね。
文字列値が.Fontや.ColorIndexを持つはずありませんから、
ここでもエラーになります。

... = r2.Characters(counter, 1).Font.ColorIndex

直接的な回答としては、以上の二点となります。


気になるポイントとして
> Dim col(5, 3)
このディメンションですが、
 col(0, any)
 col(any, 0)
などに特別な使い方があるのでなければ、
  Dim col(1 To 5, 1 To 3)
または
  Dim col(3 To 7, 1 To 3)
ですね。


それから、
やっぱりオブジェクト型の配列変数に格納したい、という話だと
以下のような扱い方はあるかな?と思います。
ただし、Charactersオブジェクトはコレクションを持たない
珍しいオブジェクトのひとつですので、念の為。


Option Explicit
  Dim mobjChr() As Characters

Sub SetChr()
  ReDim mobjChr(3 To 7, 1 To 3)
  Dim r As Range
  Dim sTemp As String
  Dim dnLength As Long
  Dim i As Long
  For Each r In Sheets("Sheet1").Range("B3:B72")
    sTemp = r.Value
    dnLength = Len(sTemp)
    If dnLength > UBound(mobjChr, 2) Then
      ReDim Preserve mobjChr(3 To 7, 1 To dnLength)
    End If
    For i = 1 To dnLength
      Set mobjChr(r.Row, i) = r.Characters(i, 1)
    Next i
  Next
End Sub

Sub IntChr()
  Erase mobjChr
End Sub

Sub PlayChr()
  Dim oChr
  For Each oChr In mobjChr
    oChr.Font.ColorIndex = Int(55 * Rnd()) + 1
  Next
End Sub


オブジェクト型の配列変数ではなくてCollectionオブジェクトに格納したい
という発想もあるかも知れませんが、
その場合、2次元の座標をどのように一次元的に表現するか、
目的に応じて対処は変わると思います。
実践がイメージできたら試してみても面白そうですね。

以上です。
    • good
    • 0
この回答へのお礼

有り難うございます、
学ばせて頂きました。

と、いうことはですね、

Dim col(1 to 5, 1 to 3) As Variant
又は、
Dim col(1 to 5, 1 to 3)
などとしておいて
set col(TEMPVAL, COUNTER) = r2.Characters(counter, 1).Font.ColorIndex
(object渡し)

とするか

Dim col(1 to 5, 1 to 3) As long
又は、
Dim col(1 to 5, 1 to 3) As Variant
又は、
Dim col(1 to 5, 1 to 3)
としておいての
col(TEMPVAL, COUNTER) = r2.Characters(counter, 1).Font.ColorIndex
(index値「数値」渡し)

ならいける
と、いうことですね?


ところで、
SET
ご指摘の通りよく入れ忘れるのですよね、
反省します。

その他でもダミーでSETを付けられれば
忘れなくなると思うのですが、
言い訳にしかならないですよね、 汗

お礼日時:2013/04/19 22:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング