Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6635 / 13646 ツリー ←次へ | 前へ→

【44115】作成したマクロの問題点が分かりません tap 06/11/4(土) 19:02 質問[未読]
【44116】Re:作成したマクロの問題点が分かりません ichinose 06/11/4(土) 19:17 発言[未読]
【44117】Re:作成したマクロの問題点が分かりません... ichinose 06/11/4(土) 19:41 発言[未読]
【44119】Re:作成したマクロの問題点が分かりません... tap 06/11/4(土) 19:59 お礼[未読]
【44124】Re:作成したマクロの問題点が分かりません... ichinose 06/11/5(日) 9:19 発言[未読]
【44132】Re:作成したマクロの問題点が分かりません... tap 06/11/5(日) 11:42 お礼[未読]
【44118】Re:作成したマクロの問題点が分かりません tap 06/11/4(土) 19:42 お礼[未読]

【44115】作成したマクロの問題点が分かりません
質問  tap  - 06/11/4(土) 19:02 -

引用なし
パスワード
   ソフトバンククリエイティブの『やさしくわかるExcel 関数・マクロ』
h00p://isbn.sbcr.jp/2659X
という本を読みながらマクロを学習している者です。

この本の275ページにある演習問題の01について分からないことがあります。

問題は、
「セルA1に入力されている文字が白色でなければ白色に変え、白色なら黒色に変えるマクロを作りなさい」
というもので、
条件として、
「セルA1には何かのデータが入力されているものとする。」
となっています。

上記サイトからダウンロードした模範解答のマクロでは、
セルA1に「見えますか?」と入力されていて、
プロシージャは以下のようになっています。
Sub セルA1の文字が白色でなければ白色に白色なら黒色に()
If Range("A1").Font.ColorIndex <> 2 Then
  Range("A1").Font.ColorIndex = 2
Else
    Range("A1").Font.ColorIndex = 1
End If
End Sub

しかし、私は以下のように作りました。
Sub 文字色変更()
  a = Range("A1").Font.ColorIndex
  Select Case a
    Case a = 2
      Range("A1").Font.ColorIndex = 1
    Case Else
      Range("A1").Font.ColorIndex = 2
  End Select
End Sub

そうしたところ、模範解答のマクロは実行するたびに、セルA1に入力されている「見えますか?」の文字の色が黒→白→黒→白→...と交互に変わるのですが、私が作成したマクロでは、黒→白→白→白→...となってしまい、いったん白になった文字の色が黒に変わりません。
このマクロのどこに問題があって、白→黒に変わらないのでしょうか。

ExcelはOffice XP PersonalのExcel 2002 SP3を使用しています。

よろしくお願いします。

【44116】Re:作成したマクロの問題点が分かりません
発言  ichinose  - 06/11/4(土) 19:17 -

引用なし
パスワード
   ▼tap さん:
こんばんは。

>ソフトバンククリエイティブの『やさしくわかるExcel 関数・マクロ』
>h00p://isbn.sbcr.jp/2659X
>という本を読みながらマクロを学習している者です。
>
>この本の275ページにある演習問題の01について分からないことがあります。
>
>問題は、
>「セルA1に入力されている文字が白色でなければ白色に変え、白色なら黒色に変えるマクロを作りなさい」
>というもので、
>条件として、
>「セルA1には何かのデータが入力されているものとする。」
>となっています。
>
>上記サイトからダウンロードした模範解答のマクロでは、
>セルA1に「見えますか?」と入力されていて、
>プロシージャは以下のようになっています。
>Sub セルA1の文字が白色でなければ白色に白色なら黒色に()
>If Range("A1").Font.ColorIndex <> 2 Then
>  Range("A1").Font.ColorIndex = 2
>Else
>    Range("A1").Font.ColorIndex = 1
>End If
>End Sub
>
>しかし、私は以下のように作りました。
>Sub 文字色変更()
>  a = Range("A1").Font.ColorIndex
>  Select Case a
    Case 2 'に訂正してください
>      Range("A1").Font.ColorIndex = 1
>    Case Else
>      Range("A1").Font.ColorIndex = 2
>  End Select
>End Sub

【44117】Re:作成したマクロの問題点が分かりませ...
発言  ichinose  - 06/11/4(土) 19:41 -

引用なし
パスワード
   >>Sub 文字色変更()
>>  a = Range("A1").Font.ColorIndex
>>  Select Case a
     Case a=2
>>      Range("A1").Font.ColorIndex = 1
>>    Case Else
>>      Range("A1").Font.ColorIndex = 2
>>  End Select
>>End Sub
これ、上記のコードでもエラーにはなりませんよね?
つまり、文法的には間違っていません!!
(意図された動作をしないだけで・・・)
これをIf文で置き換えると
Sub main()
  a = Range("A1").Font.ColorIndex
  If a = a = 2 Then
    Range("A1").Font.ColorIndex = 1
  Else
    Range("A1").Font.ColorIndex = 2
    End If
End Sub

二つコードは同じ動作をします。
つまり、tap さんが意図していない動作をしますが、
途中でコードが止まるようなエラーにはなりません。

正しく動作するコードと上記二つのコードをよく見比べて
そして一行一行検証してみてください。
そうするとこの問題でふたつのことを覚えることができますから・・・。

【44118】Re:作成したマクロの問題点が分かりません
お礼  tap  - 06/11/4(土) 19:42 -

引用なし
パスワード
   ▼ichinose さん:
>    Case 2 'に訂正してください

ichinoseさん、ありがとうございます。
Caseの文の書き方を私が間違えていたのですね。
今度はうまくいきました。

【44119】Re:作成したマクロの問題点が分かりませ...
お礼  tap  - 06/11/4(土) 19:59 -

引用なし
パスワード
   ichinoseさん、ありがとうございます。
Select文のほうの
Case a = 2
のa = 2の部分と、
If a = a = 2
のa = a = 2の部分がいずれもaに2を入れるという代入になっていて、その結果がFalse(偽)となることが分かりました。
だから、そこの条件は常に当てはまらず、Elseのほうが実行されてしまうということですね。
だから実行結果は常に白になる、ということですね。

【44124】Re:作成したマクロの問題点が分かりませ...
発言  ichinose  - 06/11/5(日) 9:19 -

引用なし
パスワード
   ▼tap さん:
おはようございます。

>Select文のほうの
>Case a = 2
>のa = 2の部分と、
>If a = a = 2
>のa = a = 2の部分がいずれもaに2を入れるという代入になっていて、その結果がFalse(偽)となることが分かりました。

>aに2を入れるという代入になっていて

ではありませんよ!!

これは、「a=2」 という式を評価した結果と変数aをさらに評価する
という意味です。


a=2 という式の結果はこれが正しければTrue、そうでなければFalseと
評価されます。

この結果と変数aを比較します。

その結果、真であれば真の処理 偽であれば、偽の処理をします。

代入という処理はされていませんよ!!

>だから、そこの条件は常に当てはまらず、Elseのほうが実行されてしまうということですね。

これは、そういうことです。


ちょっとややこしですよね!!

【44132】Re:作成したマクロの問題点が分かりませ...
お礼  tap  - 06/11/5(日) 11:42 -

引用なし
パスワード
   ▼ichinose さん:
>これは、「a=2」 という式を評価した結果と変数aをさらに評価する
>という意味です。

ichinoseさん、ご指摘ありがとうございます。
大変勉強になります。

6635 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free