• ベストアンサー

Excel 文字色の扱い

お世話になります。 此方に上げられている質問 http://oshiete.coneco.net/qa8046829.html をみて 添付図1面のようにデータがある時に 各セルの1文字づつの文字色を拾うにはどうしたら良いか… と、想い 試しに添付 2面のように組んでみたのですが、 フォントカラーの取り出しにはobject型が要るとのこと VBAにお叱りを受けました。 これて駄目なのですか? 違うやり方では1文字づつのフォントカラーを見ることが出来るのですか? ご教示をお願い致します。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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次元の座標をどのように一次元的に表現するか、 目的に応じて対処は変わると思います。 実践がイメージできたら試してみても面白そうですね。 以上です。

Nouble
質問者

お礼

有り難うございます、 学ばせて頂きました。 と、いうことはですね、 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を付けられれば 忘れなくなると思うのですが、 言い訳にしかならないですよね、 汗

関連するQ&A