- ベストアンサー
マクロ
シート上のCommandButton1を押すと、a2:d3までのセル内に赤字があれば、ユーザーフォーム1が起動する、セル内の赤字が緑になる 上記のようなマクロは可能でしょうか? マクロ初心者ですので、サンプルコードがあれば助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> マクロの記録でフォントカラーを確認して、記述してみましたがうまくいきません。 確認不足でした。 IfでColorがマイナスの時にうまくいかないとは思っていませんでした。 If mRng.Font.Color = -16776961 Then を If mRng.Font.Color = CLng("&H00" & Right(Hex(-16776961), 6)) Then に変更してみてください。
その他の回答 (4)
- kkkkkm
- ベストアンサー率66% (1734/2604)
No.2で色の値にたいして計算のような事をしていますが、赤が「-16776961」でしたらvbRedでいけると思います。 ただ、赤ではなく別の色にしたい場合、たとえば緑であれば赤にしたいとなった時に、緑が「-11489280」だった場合はvbGreendでは対応できないので、あえて実際の色をマクロで取得してもらって計算するようにしています。 標準の緑を選択したセルの色の設定で「その他の色」「ユーザー設定」で見ると緑に青が少し入った色になっていると思います。 なので、純粋な緑(緑だけ255)で比較すると一致しないという結果になり、基本的な色定数などでは比較できないので、現状は赤ですが一応計算をするようなコードにしています。
- imogasi
- ベストアンサー率27% (4737/17069)
質問者のやりたいことが、具体的に質問の文章に説明されていないので答えにくい。 想像してやって見たが、余り普通に行われそうなパターンでなく、自信ない。 特に>a2:d3までのセル内に赤字があれば、ユーザーフォーム1が起動する、はどういう段階でこれを 判断するのか、想像しにくい。 Private Sub CommandButton1_Click() For Each cl In Worksheets("Sheet1").Range("a2:D3") MsgBox cl.Address If cl.Font.ColorIndex = 3 Then MsgBox "AA" cl.Font.ColorIndex = 4 UserForm1.Show End If Next End Sub 上記でMsgboxの行は確認用なので、(本番的な段階では)削除する。 ーー >マクロ初心者です、が謙遜でなければ、ユーザー相手のGUIとして、コントロール部品などを使う勉強は、(良く飛びつきやすいが)後にすべきではないか? 特に(使う人が他人も居る場合)「シートに!」コマンドボタンを張り付けるのは、使う側で、戸惑うのではないか?クリックするやその意味や結果が予想できなくて困るし、誤ってクリックすると大事になる場合もある。 VBE画面で「SUBーユーザーフォームの実行」で実行する、で考えるべきではないか? ーー (A)シートにコントロール部品を張り付ける (B)ユーザーフォームにコントロール部品を張り付ける。 そしてその、ユーザーフォームをShowする あると思うが、(B)を考えるのが良いのではないか? 回答説明なども相当変わる。 >サンプルコードがあれば助かります。 コードを作ってほしい、というのはあからさまに言わないのが普通か? 言わなくても回答に書いている場合がほとんど。 それより、どういう場合にコントロール部品やユーザーフォームを使うのが良いか、日ごろから 考えておくべきと思う。対話型(ケースを選ばせるなど)で処理しなければならない、時もあるが、INPUTBOXの応答利用程度で済む場合も多いのではないか。
- kkkkkm
- ベストアンサー率66% (1734/2604)
No.2の追加です。 マクロの記録で取得した値だけに限りますが、以下のようなやりかたもあるかとは思います。 If mRng.Font.Color = -16776961 Then を If mRng.Font.Color = -16776961 - CLng(&HFF000000) Then 以下のような場合は、同じ色(A1が赤)でも一致とは認識しません。 mFColor = Range("A1").Font.Color For Each mRng In Range("A2:D3") If mRng.Font.Color = mFColor - CLng(&HFF000000) Then
- kkkkkm
- ベストアンサー率66% (1734/2604)
vbRedとvbGreenはマクロの記録で実際に文字色を変更して.Colorで取得した数値にしてください。 Private Sub CommandButton1_Click() Dim mRng As Range For Each mRng In Range("A2:D3") If mRng.Font.Color = vbRed Then mRng.Font.Color = vbGreen ユーザーフォーム1.Show Exit For End If Next End Sub
補足
kkkkmさま ありがとうございます。 Private Sub CommandButton1_Click() Dim mRng As Range For Each mRng In Range("A2:D3") If mRng.Font.Color = -16776961 Then mRng.Font.Color = -11489280 ユーザーフォーム1.Show Exit For End If Next end sub マクロの記録でフォントカラーを確認して、記述してみましたがうまくいきません。 どこか間違えているでしょうか?
お礼
大変分かりやすく、ありがとうございました!