Excel VBA質問箱 IV

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

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


4451 / 13645 ツリー ←次へ | 前へ→

【56473】指定シート以外削除 if文ですが 操否 08/6/18(水) 17:12 質問[未読]
【56474】Re:指定シート以外削除 if文ですが Jaka 08/6/18(水) 17:23 発言[未読]
【56477】Re:指定シート以外削除 if文ですが 操否 08/6/18(水) 18:18 お礼[未読]
【56478】Re:指定シート以外削除 if文ですが kanabun 08/6/18(水) 18:42 発言[未読]
【56597】Re:指定シート以外削除 if文ですが 操否 08/6/23(月) 17:28 お礼[未読]
【56603】Re:指定シート以外削除 if文ですが kanabun 08/6/23(月) 22:52 発言[未読]
【56606】Re:指定シート以外削除 if文ですが 操否 08/6/24(火) 11:36 お礼[未読]

【56473】指定シート以外削除 if文ですが
質問  操否  - 08/6/18(水) 17:12 -

引用なし
パスワード
   指定シート以外のシートを削除したいと思っています
シートが 指定シート1 の1枚 の時 下記でいいのですが
シートが2枚 指定シート1 指定シート2 を残したいとき

If .Name <> "指定シート1" Or .Name <> "指定シート2" Then .Delete
では、Worksheet クラスの Delete メソッドが失敗しました
となってしまいます

どう修正すればいいでしょうか
よろしくお願いいたします

Sub 指定シート以外削除()

  Dim I As Integer
  Dim j As Integer
  
  If MsgBox("操作画面以外のシートを削除します", vbOKCancel) = vbOK Then
    '(OKボタンが押されたとき)
  

    I = Worksheets.Count
    Application.DisplayAlerts = False
      For j = I To 1 Step -1
        With Sheets(j)
          If .Name <> "指定シート1" Then .Delete
        End With
      Next j
    Application.DisplayAlerts = True
    
    MsgBox "削除が完了しました"
  
  Else
    '(キャンセルボタンが押されたとき)
  End If  
  
End Sub

【56474】Re:指定シート以外削除 if文ですが
発言  Jaka  - 08/6/18(水) 17:23 -

引用なし
パスワード
   ▼操否 さん:
>If .Name <> "指定シート1" Or .Name <> "指定シート2" Then .Delete
NotとOrの盲点?
指定シート1か指定シート2以外とは、
指定シート1が対象の場合、指定シート2以外だから削除の対象になります。
指定シート2が対象の場合、指定シート1以外だから削除の対象になります。
よって全部のシートが削除されます。
シートを全部削除できないからエラーになります。

この場合は、orでなくAndにしてください。

【56477】Re:指定シート以外削除 if文ですが
お礼  操否  - 08/6/18(水) 18:18 -

引用なし
パスワード
   ▼Jaka さん:
ありがとうございます
>NotとOrの盲点?
>この場合は、orでなくAndにしてください。
Andでうまくいきました。

この辺理解が乏しい気がしています
True か False
気になったときにググってみたりしていますが基本が身についていません

参考サイト等ご紹介頂ければうれしいです

明日解決にしたいと思います
よろしくお願いいたします

【56478】Re:指定シート以外削除 if文ですが
発言  kanabun  - 08/6/18(水) 18:42 -

引用なし
パスワード
   ▼操否 さん:

>    With Sheets(j)
>      If .Name <> "指定シート1" Then .Delete
>    End With

ここを、
    Select Case Sheets(j).Name
     Case "指定シート1", "指定シート2" '削除したくないシート名のリスト
       '何もしない
     Case Else
       Sheets(j).Delete
    End Select

と書くこともできませんかね。

【56597】Re:指定シート以外削除 if文ですが
お礼  操否  - 08/6/23(月) 17:28 -

引用なし
パスワード
   大変遅くなりました 申し訳ありません

Select Case
も有りでした。

ご指摘頂いてググリ直してみましたが
上記2つが定番?みたいな気がしましたが、IF文は理解不足なので
Select Caseのほうが、間違わなくてすみそうな気がします

何かありましたらよろしくお願いいたします

【56603】Re:指定シート以外削除 if文ですが
発言  kanabun  - 08/6/23(月) 22:52 -

引用なし
パスワード
   ▼操否 さん:
>上記2つが定番?みたいな気がしましたが、IF文は理解不足なので
>Select Caseのほうが、間違わなくてすみそうな気がします

同感です。

ANDやOR ってのは、難しいです。
ワークシートの数式ですと、1行で書かなければならないので、
AND関数やOR関数をよく使いますが、VBAはそれとちがい、
ステートメントを複数並べて処理を記述できますから、
なるべく And や Or 演算子を使わず(ドモルガンの法則に立ち
入らず ^^)やりたいことを率直に記述する方法で行きましょう♪

ぶっちゃけた話、
If シートが a でなく And シートが b でもなければ Then
とか、
If (シートが a または シートが b ) 以外のときThen
と書くと、
Basicでは <シートがa かどうか> を調べ、その結果、
<シートが b かどうか> 調べる必要がなくても、必ず
<シートが b かどうか> 調べるので、(★)
こういう書き方は 時間のムダ、と考えるわけです。
 (★)VB.NET では AndAlso 演算子、OrElse 演算子なるものが
   あり、C言語同様に 2条件の判断のとき、最初の条件の判断
   で2番目の条件文を評価する必要がないときは、さっさと
   次の処理に移るようなコーディングができるようになりま
   したが。

If 文を使って書くときでも、And または Or で1行にするよりも、
むしろ、
If シート<>a Then  'シートが a でなく
  If シート<> b Then  'なおかつ、シートが b でなかったときのみ
    シート削除    '処理をする
  End If
End If
のほうが無駄が少ない書き方と言える訳です。
でも、そういうことなら、
 Select Case シート
  Case a, b
  Case Else
    シート削除
 End Select
のほうが、より読みやすいと思いませんか? (^^

【56606】Re:指定シート以外削除 if文ですが
お礼  操否  - 08/6/24(火) 11:36 -

引用なし
パスワード
   kanabunさん ありがとうございます

他方面からのアドバイスを頂いて勉強になります

ドモルガン・・・って、みたことあるようないようなです
勉強になります、

>Basicでは・・・
ふーん なるほど・・・・

>VB.NET では AndAlso 演算子、OrElse 演算子なるものが・・・
なるほど・・・・

>If 文を使って書くときでも、And または Or で1行にするよりも、・・・
なんとなく、1行のほうがカッコよさげな気がして
と、
なんとなく、数式風にみたいな感じで書けそうな気がしていましたが
わかりやすいのが何よりですね

今後は、ミスしないわかりやすい方法にするよう心がけたいと思います


Jakaさん
kanabunさん
ありがとうございました

今後もよろしくお願いいたします

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