- ベストアンサー
Excel 文字色の扱い
お世話になります。 此方に上げられている質問 http://oshiete.coneco.net/qa8046829.html をみて 添付図1面のようにデータがある時に 各セルの1文字づつの文字色を拾うにはどうしたら良いか… と、想い 試しに添付 2面のように組んでみたのですが、 フォントカラーの取り出しにはobject型が要るとのこと VBAにお叱りを受けました。 これて駄目なのですか? 違うやり方では1文字づつのフォントカラーを見ることが出来るのですか? ご教示をお願い致します。
- みんなの回答 (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次元の座標をどのように一次元的に表現するか、 目的に応じて対処は変わると思います。 実践がイメージできたら試してみても面白そうですね。 以上です。
お礼
有り難うございます、 学ばせて頂きました。 と、いうことはですね、 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を付けられれば 忘れなくなると思うのですが、 言い訳にしかならないですよね、 汗