- ベストアンサー
ExcelVBA .Interiorについての質問
- ExcelVBAの.Interiorに関しての質問です。Rangeの範囲に対してColorIndexやPatternを設定することができますが、値が1つしか表示されない理由は何でしょうか。
- また、xlSolidなどの定数の実際の値は何に対応しているのでしょうか。さらに、範囲をwithで指定する際に1つ上の階層に移動する方法があるのかも教えてください。
- 以上の質問について、どうぞよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
今日は。 > Range(Cells(3, 列), Cells(10, 列)).Interior.ColorIndex > も、 > Range(Cells(3, 列), Cells(10, 列)).Interior.Pattern > も、 > ウオッチウインドウで > 見た限り、では > 値が、1つしか > 出ません > 此って… ? 設定の話なのか、取得の話なのか、解りませんが、 設定については後述します。とりあえず取得については 指定したセル範囲が 単一セル なら → 設定されたプロパティ値 複数セル なら 取得したいプロパティ値がすべてのセルで共通なら、 → 共通で設定されたプロパティ値 取得したいプロパティ値が複数混在する場合なら、 → Null値 です。 > xlSolid等の > 定数、ですが > 実際の、値は > 何が、当てられて > いる > の、ですか? Excel > Constants > xlSolid Const xlSolid = 1 値は 1 です。 [セルの書式設定] > [塗りつぶし] > [パターンの種類] → [(左上の真っ白なボタン)]を選択 という手順で設定した場合と同じです。 Excelクラスの.Patternプロパティの設定値には 独自のEnumが用意されていません。 Excel.Constants には クラス混在で様々なEnumが定義されていますので、 Excelクラスの.Patternプロパティに使われるものだけ 抜き出すと、以下。 xlSolid 1 xlGray75 -4126 xlGray50 -4125 xlGray25 -4124 xlGray16 17 xlGray8 18 xlHorizontal -4128 xlVertical -4166 xlDown -4121 xlUp -4162 xlChecker 9 xlSemiGray75 10 xlLightHorizontal 11 xlLightVertical 12 xlLightDown 13 xlLightUp 14 xlGrid 15 xlCrissCross 16 (以上[パターンの種類]配置順) xlNone -4142 組込み定数の値を確かめる方法としては イミディエイトウィンドウに ? xlSolid とタイプ、またはコピペして、 その行にキャレット(カーソル)がある状態で Enter(実行)キーを押す。 直下に結果が表示され ? xlSolid 1 と表示されます。 (数値の場合は必ず符号用のスペースが先頭に付きます) 組込み定数のクラスを確かめる方法としては F2キーでオブジェクトブラウザを表示 [検索窓に]xlSolid[検索ボタン] [検索結果]上段[ライブラリ][クラス][メンバー]の中から 探しているメンバー xlSolid を選択 [検索結果]中段[クラス]['Constants'メンバー]の中に 探しているメンバー xlSolid が表示されていることを確認 [検索結果]下段に表示された Const xlSolid = 1 Excel.Constants のメンバー を見て、定数値と型(TypeやEnum)、クラス階層を確認 という手順になります。 必要な場合は、検索語のメンバーが選択された状態で、 そのままF1キーを押してヘルプを参照することも出来ますが、 xlSolid 等の組込み定数には ヘルプ用のIDが登録されていない場合が多いので、 この場合ヘルプは表示されません。 仕方がないので、コードペインに戻ってVBAヘルプを表示させてから、 xlSolid を検索してみると、 「Excel 開発者用リファレンス CellFormat.Interior プロパティ」 へのリンクが表示されるので、覗いてみると、 xlSolid 使用例を見ることができます。 こうした手順を普段から実践していると 時に期待以上の情報を得ることもできますし、覚えが早くなります。 トレースの仕方ですが、私がよくやるmethodですが いよいよ判らなくなった時には、急がば廻れのひと手間で、 仮の変数を (型を知らないのですからVariantやObjectで)宣言しておいて、 Set obj = range.Interior vRtn = range.Interior.Pattern のような仮の記述を適所に挿入しておいて、 F8キー ステップモード実行や ブレークポイントを設定してから、F5キー 実行などして、 ローカルウィンドウの値をチェックするようにすると、 全体の手間数が減らせて、トレースが楽になり、 やる気が失せたりし難くなりますので、お勧めです。 ウォッチウィンドウを設定する手間とさほど変わらず、 必要な時だけチェックすれば済みますし、 特にオブジェクト型を扱う場合は、階層ツリーを開かなければ、 実行に与える影響もより少なく済むようですし。 セルの書式を監視するのなら、どちらでもいいかも、ですが、 イミディエイトで済ますか、ローカルに表示できるようにするか、 簡単な場合と、難しい場合、私なら、ウォッチはあまり使わないです。 ウォッチウィンドウでは、直接プロパティ値を書き換え変更しながら、 色々試験したい時とかは、寧ろ便利ですね。私も偶には使います。 > もう1つ > with ~ > て > Dosの、フォルダーの > ように > 1つ上の~~ > て、指定 > 出来ないのですか? 一応、構文としては、 range.Interior.Parent で、親オブジェクトであるRange型を参照可能ですが、 コード内で一旦は取得しているオブジェクトに対して .Parent プロパティを使う必要がある例は数少ないです。 大概は設計がうまくいってないことが殆どです。 教科書的な解答としては、 コーディングで工夫の余地があるのではないですか? といった感じになると思います。 最後にご提示の記述についてですが、 (Q9338764の"ネタ"由来ですね。) どうやら、 プロパティを配列で扱おうと実験されている ようにお見受けしたのですが、 Get でも Let でも(Set でも) 配列を扱うプロパティは、まず無い、 と思っていて下さい。 Rangeオブジェクトだと、配列を設定・取得可能なのは、 .Value .Formula .FormulaLocal .FormulaR1C1 パっと思い付くのはこれ位ですが、 寧ろ、例外中の例外、なのです。 いづれも、セルの値(数式値)に関するプロパティ に限定されていますね。 冒頭に紹介したNull値を返すケース、これって、 配列として扱うことは出来ませんよ、的なメッセージとして Excelではあまり使われないNull値を態々返してくれているのだと 私は思っています。 最初と最後のご質問を合わせた話ですが、 ひとつめのEvaluateメソッドは、return(1 To 5, 1 To 1)の 配列は採れています(数値が71-89の場合、2になってしまいますが)。 一応、ひとつめの例では右辺は配列になっています。 でも、配列を受け付けないプロパティですから、 Range("A1:A5").Interior.ColorIndex = [{1;2;3;4;5}] は実行時エラー'13'になりますし、 Range("A1:A5").Interior.ColorIndex = [{1,2,3,4,5}] でも同じ「型が一致しません」と叱られるだけです。 すみませんが、ふたつめのEvaluateは、 .PatternやxlSolidなどのVBA側のパラメータを Excelに問い合わせようとしているは何故?とか、 作意を理解するのに至りませんでした。 総体的な方向づけとして、 オブジェクト参照を最適化しようとお考えになった その感覚は正しいものだと思います。 アドバイスとしては、 For ループで回そうとする以上は、オブジェクトアクセスが スッキリしないのも仕方ないというか 限界があるのは仕方のないような気もします。 For Each ループを使えば、ご質問のオブジェクト参照については よりスッキリするのではないでしょうか。 或いは、For ループで回すなら、 実際には、ソースの内容が示している仕様を見る限りでは、 処理 色36|他共通 処理 色34| 処理しない の3通りの分岐が必要十分な例なのですから、 36, 34, 0 を変数に収める判別部分と、変数が0かどうか判別しての プロパティ設定処理部分と、2段に分けるように書けば、 親オブジェクトにリアクセスする必要もないですし 共通・類似の処理を2度書くこともな無くせます。 行数は増えますけれどね。 尚、ご提示の記述では、処理しないケースの表現を どう書くのかな?とは思います。 まぁでも、私見としてはですが、 求める結果が得られているのなら (得られるように誤りを正せるなら) Q9338764のソースは、解り易い、という点で 不慣れな方にとっては一定の価値があると、私は思います。 自分なら書き直して提示しようとは考えないかも、です。 左様なら
お礼
〉設定については後述します。とりあえず取得については 要するには 〉指定したセル範囲が 〉 単一セル、複数セル、 〉 に、関わらず 〉 取得したいプロパティ値がすべてのセルで共通なら、 〉 → 其の、プロパティー値 〉 取得したいプロパティ値が複数混在する場合なら、 〉 → Null値 〉です。 有難うございます > xlSolid等の > 定数、ですが > 実際の、値は > 何が、当てられて > いる > の、ですか? 〉 Excel > Constants > xlSolid 〉 Const xlSolid = 1 〉値は 1 です。 有難うございます 組込み定数の値を確かめる方法としては イミディエイトウィンドウに ? xlSolid (中略) 1 〉組込み定数のクラスを確かめる方法としては 〉 (中略)オブジェクトブラウザ(中略) 〉 [検索窓に]xlSolid[検索ボタン] 〉 (中略)から 〉 探しているメンバー xlSolid を選択 〉 [検索結果]中段[クラス]['Constants'メンバー]の中に 〉 探しているメンバー xlSolid が表示されていることを確認 〉 [検索結果]下段に表示された 〉 Const xlSolid = 1 〉 Excel.Constants のメンバー 〉 を見て、定数値と型(TypeやEnum)、クラス階層を確認 〉という手順になります。 有難うございます 〉検索語のメンバーが選択された状態で、 〉そのままF1キーを押してヘルプを参照することも出来ますが、 〉(中略)組込み定数には 〉ヘルプ用のIDが登録されていない場合が多いので、 〉この場合ヘルプは表示されません。 〉仕方がないので、コードペインに戻ってVBAヘルプを表示させてから、 〉xlSolid を検索してみると、 〉「Excel 開発者用リファレンス 〉CellFormat.Interior プロパティ」 〉へのリンクが表示されるので、覗いてみると、 〉xlSolid 使用例を見ることができます。 〉こうした手順を普段から実践していると 〉時に期待以上の情報を得ることもできますし、覚えが早くなります。 有難うございます トレースの仕方ですが、 (中略) 仮の変数を (型を知らないのですからVariantやObjectで)宣言しておいて、 Set obj = range.Interior vRtn = range.Interior.Pattern のような仮の記述を適所に挿入しておいて、 F8キー ステップモード実行や ブレークポイントを設定してから、F5キー 実行などして、 ローカルウィンドウの値をチェックするようにすると、 全体の手間数が減らせて、トレースが楽になり、 やる気が失せたりし難くなりますので、お勧めです。 有難うございます > もう1つ > with ~ > て > Dosの、フォルダーの > ように > 1つ上の~~ > て、指定 > 出来ないのですか? 〉一応、構文としては、 〉 range.Interior.Parent 〉で、親オブジェクトであるRange型を参照可能です 有難うございます では、例えば With ActiveSheet.Range("A1").Interior let .ColorIndex = 2.0 - (.Parent.value >= 90) * 34 End With と、できる訳 ですね 〉最後にご提示の記述についてですが、 〉(Q9338764の"ネタ"由来ですね。) 済みません 手元の、環境では QNo.が見れないもので https://sp.okwave.jp/qa/q9338764.html の、事 ですよね? 〉Get でも Let でも(Set でも) 〉配列を扱うプロパティは、まず無い、 〉と思っていて下さい。 残念です 〉Rangeオブジェクトだと、配列を設定・取得可能なのは、 〉 .Value .Formula .FormulaLocal .FormulaR1C1 〉パっと思い付くのはこれ位ですが、 〉寧ろ、例外中の例外、なのです。 残念です でも、ふと [ ] で、受けると どうなるのか いっそ 興味が、わきます 〉ふたつめのEvaluateは、 〉.PatternやxlSolidなどのVBA側のパラメータを 〉Excelに問い合わせようとしているは何故?とか、 〉作意を理解するのに至りませんでした。 定義値の、扱いが 解って、なかった が、故の お粗末で 見苦しくて、済みません 〉総体的な方向づけとして、 〉オブジェクト参照を最適化しようとお考えになった 〉その感覚は正しいものだと思います。 有難うございます 〉ご提示の記述では、処理しないケースの表現を 〉どう書くのかな?とは思います。 大凡 バックカラーは、白です よね 調べたら 値は、2でした まあ、勝手に 白と、決めつける のは とても、正当 とは、言えませんが 仮に、2と しました