We will be migrating from Ask to Discourse on the first week of August, read the details here

質問する
0

IF Not ~ or Not ~.

質問日 2020-10-24 09:21:13 +0200

Dagiri のGravatar画像

updated 2020-11-03 03:21:31 +0200

nogajun のGravatar画像

例えばですが、
シートの名前が"Sheet1"でない、もしくは"Sheet2"ではない場合、Worksheets(1)をDeleteするという文があります。

(A)

If Not Worksheets(1).Name = "Sheet1" Then
If Not Worksheets(1).Name = "Sheet2" Then
Worksheets(1).Delete

とあったとして、 この2つの構文を1つにしたとき、

(B)

If Not Worksheets(1).Name = "Sheet1" Or Not Worksheets(1).Name = "Sheet2"
Worksheets(1).Delete

とすると、 Worksheets(1)が"Sheet1"であっても"Sheet2"であってもDeleteが実行されます。

また、Or を And にしたら、"Sheet1","Sheet2"の場合Deleteされなくなりました。

(B)はプログラム上どういった解釈になっているのでしょうか?

edit retag flag offensive close merge delete

1 Answer

0

回答日 2020-10-24 13:57:45 +0200

himajin100000 のGravatar画像

updated 2020-10-24 14:05:26 +0200

Option VBASupport 1の環境での質問ですね。

  Option VBASupport 1
  Sub Main()
      Dim x As String
      x = "a"

      REM If ((Not (x = "a")) Or (Not (x = "b"))) Then

      If Not x = "a" Or Not x = "b" Then
          Msgbox(x)
      End If
  End Sub

とあったとき、x = "a" は trueで、x = "b"はfalseです。

Not true = falseであり、またNot false = trueでもあるので

(false Or true) は trueです。言語非依存の数学の問題です。

ちなみにOption VBASupport 0のとき、Not x = "a"は ((Not x) = "a")なので、文字列を論理値に変換できずエラーになります。(tdf#52601)

edit flag offensive delete link もっと

Comments

…やべぇ、当初とコードが変わったからか、StarBasicの挙動を今のコードで説明できない...そのうち勉強しないとなあ

himajin100000 のGravatar画像himajin100000 ( 2020-10-24 16:32:52 +0200 )edit

わかりやすい回答ありがとうございます! 言語的に考えてしまっていました。

Dagiri のGravatar画像Dagiri ( 2020-10-24 23:31:02 +0200 )edit
ログイン/サインアップして回答する

質問ツール

2 followers

Stats

Asked: 2020-10-24 09:21:13 +0200

Seen: 54 times

Last updated: Oct 24 '20