アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル2000です。
ワークシート上に配置したオブジェクトのVisibleのTrue Falseについては、test01の方法で切り替えることが出来ます。
では、Test02でIfで判定している、xlOn xlOff の切替についても同様にNOTを使って簡単に記述することはできないでしょうか?xlOn xlOff はTrue False ではないから無理なのでしょうか?

Sub test01()
Dim o As Object
For Each o In ActiveSheet.Buttons
o.Visible = Not o.Visible
Next o
End Sub

Sub test02()
Dim o As Object
For Each o In ActiveSheet.CheckBoxes
If o.Value = xlOn Then
o.Value = xlOff
Else
o.Value = xlOn
End If
Next o
End Sub

A 回答 (5件)

こんばんは。



あまり、難しく考えなくても、単に、こういうことではありませんか?
これも、ビット演算のひとつでしょうね。

 For Each o In ActiveSheet.CheckBoxes
  o.Value = -Not (xlOff - o.Value)
 Next o
    • good
    • 0
この回答へのお礼

-Not (xlOff - o.Value) !!!!

こんな式、はじめて見ました!
ありがとうございました。

でも、確かにうまく行きましたが・・・・。????
xlOn が1で、xlOffがなぜか -4146なのは存じていましたが、計算につかえるんですね。
でもxlOff-xlOffなら、0ですけど、xlOff-xlOnの場合は -4147 ですよね?
それを-Not?
不可思議です・・・。

お礼日時:2007/02/21 09:36

こんばんは。



>VBAではTRUEはマイナス1なのですね?!
そうなのです。

ワークシートと仕様が違うので気をつけないといけませんね。ワークシート側のTRUE は、0 以外なので、それは、C言語と同じことになります。また、Win32APIも、TRUE(全部大文字) は、「0 」以外となりますので、Not(False) ということになります。

なお、Excelの DEC2BIN()関数は、16ビットは計算できないので、VBAでユーザー定義関数を作るか、Vector で、そういうソフトを手に入れるか、筆算で答えを出すかぐらいしかありません。

筆算で出す方法


16

    余
2 16    16/2
2  8 0   8/2
2  4 0   4/2
2  2 0   2/2
2  1 1   1/2 
------------
  1000
となります。
    • good
    • 0
この回答へのお礼

有難うございました。

VBAでは、TRUE=-1、FALSE=0
∴TRUE+TRUE=-2

ワークシートでは、TRUE<>0、FALSE=0
ただし、ワークシート上でTRUEを計算に使うときは1になる。
∴TRUE+TRUE=2

勉強になりました。

お礼日時:2007/02/23 10:47

こんばんは。



まだ、私は、この方面は、初歩の初歩なもので、間違いがありましたら、お許しください。

>それならば、Falseが0だとすると
>Not Falseは -(0+1) =1でTrueになるのならばなんとか理解はできます。(Not 0がTrueを返さないのは理解できませんが)
>しかし、Trueが1だとすると
>Not Trueは -(1+1) =-2で、これがなぜFalseを返すのでしょうか?


まず、以下は、8ビットの計算

False =0, True = -1 (Byte型 =255)

        2進     10進
-----------------------------------
False    00000000     0
Not(False)  11111111    -1
反転
-----------------------------------
True    11111111     -1
Not(True)  00000000     0
反転
------------------------------------

3    00000011
Not(3)  11111100   =-4
------------------------------------
10    00001010
Not(10) 11110101  =-11
------------------------------------

ということになるはずです。

10進の計算ですると、

 Not(False) は、Not(0) = -1 .... -(0 +1)
 Not(True) は、Not(-1) =0 ..... -(-1 + 1)
 Not(3) =-4 ................. -(3 + 1)
 Not(10) =-11 ............... -(10 + 1)


-Not(xlOff - xlOn)
-Not(xlOff - xlOff)


こちらは、ご覧のとおり16ビットにします。

なお(-[マイナス負数])にするということは、各ビットを反転させて、右端の桁に、1を加えて作ることです。

例:
xlOff - xlOn 

  xlOff   11101111 11001110
- xlOn    00000000 00000001
-----------------------------------
        11101111 11001101

Not(xlOff - xlOn)
        00010000 00110010 反転
-----------------------------------

-Not(xlOff - xlOn) 負数で反転
        11101111 11001101 Not(xlOff - xlOn)を反転
        00000000 00000001 1を足す
------------------------------------
        11101111 11001110  =-4146

===============================================

xlOff - xlOff

  xlOff   11101111 11001110
- xlOff   11101111 11001110
-----------------------------------
        00000000 00000000

Not(xlOff - xlOff)
        11111111 11111111  反転 =-1
-----------------------------------

-Not(xlOff - xlOff)  負数で反転
        00000000 00000000  Not(xlOff - xlOff)を反転
        00000000 00000001  1を足す
-----------------------------------
        00000000 00000001  =1

このような計算をしているのだと思っています。
少し、書いていて、疲れました(^^;
    • good
    • 0
この回答へのお礼

お手数をおかけいたし申し訳ありませんでした。
ちょっと難しすぎてわたしにはお手上げです。

わたしはこれまで、エクセルではTRUEは1、FALSEは0と理解してきましたが、VBAではTRUEはマイナス1なのですね?!

お礼日時:2007/02/22 16:22

こんにちは。

Wendy02です。

最近、新しい言語の勉強をし始めたもので、まだ、本当に、私もよく分かっているわけではないです。

>それを-Not? 不可思議です・・・。

これは、ビット演算ですよね。

同様のプロパティ値は、値は違っていても、単にバイアスが掛かっているだけだと思ったのです。だから、merlionXXさんの思いつきは、間違っていなかったと思います。ただ、これは、VB系の中では、あまり活かされることはないような気がします。

True が、-1 なら、Not(True) は、1 を足して、正負を逆に(反転)する、ということだ思いました。本来は、ビットで見なければならないのですが、ビット数が多いので、途中で分からなくなってしまいました(^^;。

ところで、ちょっと、今回の件とは直接は関係がないけれども、以下は、Excel VBAの基礎的な問題のひとつです。#1の中で、気になりました。

VBE を通さず、見て分かりますか?意外に知らない問題なのです。もし、ご存知でしたら、お見捨ていただいて結構です。

Sub Test1()
Dim i As Integer
Dim ret As Variant
 i = 0
 ret = IIf(i <> 0, 10 / i, "エラー")
End Sub

1. 0
2. 1
3. "エラー"
4. 10
5. そのどちらでもない

それから、VBE に、実際に通してみてください。その理由を、想像してみてください。
    • good
    • 0
この回答へのお礼

すみません、Not FalseがTrue、Not TrueがFalseを返すのは存じておりましたが、VBAでNotは何を返すのでしょうか?

たとえば、
Not 0が-1
Not 1が-2
Not 3が-4
Not 10が-11
どうも -(対象+1) という計算をしているように思えます。

となると、
-Not (xlOff - xlOn) は
-(-((-4146-1)+1))で、-4146=xlOff、
-Not (xlOff - xlOff) は
-(-((-4146-(-4146))+1))で、1=xlOnになるのだと思うのです。

それならば、Falseが0だとすると
Not Falseは -(0+1) =1でTrueになるのならばなんとか理解はできます。(Not 0がTrueを返さないのは理解できませんが)
しかし、Trueが1だとすると
Not Trueは -(1+1) =-2で、これがなぜFalseを返すのでしょうか?

それから、#3でのIIFの例は、通常のIf Then else だと、最初のIf条件に適うとelseの指示はスルーするけど、IIFではTrueもFalseも両方計算されるから要注意というアドバイスですね。だから例では0で除算という実行時エラーになるのだと思いました。気をつけなきゃいけないですね、有難うございました。

お礼日時:2007/02/21 13:59

Booleanでないので、Notで反転、と簡単にはいかないですね。

同じようなユーザ定義関数

Function MyNot(N as Integer) as Integer
 If N = xlOn Then
  MyNot = xlOff
 else
  MyNot = xlOn
 End If
End Function

を作っておいて、
o.Value = MyNot(o.Value)

とするか、あるいはIIFを使って、
o.Value = IIF(o.Value = xlOn, xlOff, xlOn)

とするとか。
    • good
    • 0
この回答へのお礼

> Booleanでないので、Notで反転、と簡単にはいかないですね

やはりそうですよねぇ。
虫のいいことを考えましたが・・・・・。

IIF関数で逃げることにします。有難うございました。

お礼日時:2007/02/20 17:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています