Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
With〜Notの構文の疑問について
投稿日時: 17/05/19 12:04:12
投稿者: hisayanxp

(A)(B)を合体させたのが、(C)だと思うのですが、いまひとつ(C)の構文がピンときません。
そいうもんだと考えるしかないのでしょうか?
よろしくお願いします。
Sub test4()
    With Columns("B")
        .Hidden = Not .Hidden
    Not .Hidden = .Hidden ←こういう行が必要であれば納得できるのですが・・・。
    End With
End Sub
 
(A)
Sub test1()
    If Columns("B").Hidden = True Then Columns("B").Hidden = False
End Sub
 
(B)
Sub test2()
    If Columns("B").Hidden = False Then Columns("B").Hidden = True
End Sub
 
(C)
Sub test4()
    With Columns("B")
        .Hidden = Not .Hidden
    End With
End Sub

回答
投稿日時: 17/05/19 14:25:06
投稿者: Suzu

hisayanxp さんの引用:
(C)
Sub test4()
    With Columns("B")
        .Hidden = Not .Hidden
    End With
End Sub

 
今回の構文で引っかかっている部分は Hidden = Not Hidden
の部分ですよね。Withは関係ありません。
 
Withを書かなくとも
Columns("B").Hidden = Not Columns("B").Hidden
こういう事で、やはり、Not〜 が判らない。。。と言う話だとおもいます。
 
まず、今回参照・設定している Hidden プロパティーは、 Boolean型です。
Boolean型の取れる値は、True/False の 2種類しかありません。
 
True の裏は False、Falseの裏はTrue となります。
 
さてさて、ここで元に戻って、
構文の中にあった、Not これは、「逆」という事で
Boolean型の値の前に置くことで、Notの後のBoolean型をの値の裏と取らせる事ができます。
 
つまり、
  Columns("B").Hidden = Not Columns("B").Hidden
  B列の非表示かどうか は、 現状のB列の非表示状態の「逆」となる。って事です。

回答
投稿日時: 17/05/19 14:36:43
投稿者: hatena
投稿者のウェブサイトに移動

論理演算子 - Excel VBA http://www.239-programing.com/excel-vba/basic/basic045.html
 
Not演算子は、その値の否定です。つまり、
 
Not 値
 
この場合、値が True の場合は、False になり,
値が False の場合は、True になります。
 
(C)の式はWithを使わずに記述すると下記のようにななります。
 
Columns("B").Hidden = Not Columns("B").Hidden
 
意味としては、
Columns("B").Hidden が現在 True の場合、Not で False にして、Columns("B").Hidden(プロパティ)に代入する。
 
Columns("B").Hidden が現在 False の場合、Not で True にして、Columns("B").Hidden に代入する。
 
つまり、プロパティ設定を現状の状態の逆の状態にすることになります。
 

引用:
 Not .Hidden = .Hidden ←こういう行が必要であれば納得できるのですが・・・。

 
構文エラーになります。
 
= 演算子には、
右辺の値を左辺に代入するという代入演算子と、
左右の値が等しいという比較演算子の
2つの機能があります。記述された場所により機能が変わります。
 
If Columns("B").Hidden = True Then Columns("B").Hidden = False
                       ↑               ↑
                       比較演算子           代入演算子
Hidden がTrueなら、Hidden にFalseを代入せよ、という意味になります。
 
 Not .Hidden = .Hidden
 ----------- ↑
 論理式   代入演算子
 
論理式とは、TrueまたはFalseの値を返す式、値には代入できない。(構文エラーになる)
 
 
  .Hidden = Not .Hidden
         ↑ ------------
  代入演算子 論理式
   
HiddenプロパティにTrueまたはFalseの値を代入する。
 
 
なんか、整理できてないですか、理解できたかな?

投稿日時: 17/05/19 15:35:00
投稿者: hisayanxp

suzuさん、hatenaさん
ありがとうございました。おかげでよく理解できました。