Excel VBA質問箱 IV

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

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


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

【35961】データの無いシートを削除 101 06/3/16(木) 20:16 質問[未読]
【35962】Re:データの無いシートを削除 kobasan 06/3/16(木) 21:01 回答[未読]
【35963】Re:データの無いシートを削除 101 06/3/16(木) 21:43 質問[未読]
【35965】Re:データの無いシートを削除 kobasan 06/3/16(木) 22:05 回答[未読]
【35967】Re:データの無いシートを削除 ponpon 06/3/16(木) 22:16 発言[未読]
【35973】Re:データの無いシートを削除 101 06/3/16(木) 22:40 お礼[未読]
【35978】Re:データの無いシートを削除 ゆと 06/3/16(木) 23:47 回答[未読]

【35961】データの無いシートを削除
質問  101  - 06/3/16(木) 20:16 -

引用なし
パスワード
   お世話になります。

個人用マクロブックに作成したマクロで、アクティブファイルの全シートを確認し、データの無いシートを削除する処理をしたいと思います。(シートにデータがある場合は、セルA1に移動)

色々なHPを参照し、次のように作成してみましたが、最後の方のシート削除でエラーがでます。原因はシートを削除したことでシート数が変わるためだと思うのですが、どうしたらうまく動くでしょうか?
また、今はセル"H8"だけをみていますが、"シートの中"に、何も(オブジェクトも)ないときシートを削除するにはどうしたらよいでしょうか?
よろしくお願いします。

Sub データ作成()
For i = 1 To ActiveWorkbook.Worksheets.Count
 With Worksheets(i)
  If .Range("h8").Value <> "" Then
   Application.Goto Reference:=Range("A1"), Scroll:=True
  Else
   Application.DisplayAlerts = False
   Worksheets(i).Delete
   Application.DisplayAlerts = True
  End If
 End With
Next
End Sub

【35962】Re:データの無いシートを削除
回答  kobasan  - 06/3/16(木) 21:01 -

引用なし
パスワード
   ▼101 さん 今晩は。

これでできます。

Sub データ作成()
Dim s As Worksheet
Application.DisplayAlerts = False
For Each s In ActiveWorkbook.Worksheets
  If s.Range("h8").Value <> "" Then
    Application.Goto Reference:=Range("A1"), Scroll:=True
  Else
    If s.Name <> "Sheet1" Then s.Delete   'Sheet1は削除しない
  End If
Next
Application.DisplayAlerts = True
End Sub

【35963】Re:データの無いシートを削除
質問  101  - 06/3/16(木) 21:43 -

引用なし
パスワード
   ▼kobasan さん
 早速ありがとうございます。
 
 もうひとつお願いなのですが、

 >  If s.Range("h8").Value <> "" Then

 の部分を、"H8"ではなく、「シート内に値(オブジェクトも)がないとき」にそのシートを削除するにはどうしたらよいのでしょうか?

 よろしくお願いします。

【35965】Re:データの無いシートを削除
回答  kobasan  - 06/3/16(木) 22:05 -

引用なし
パスワード
   ▼101 さん 今晩は。

> シート内に値(オブジェクトも)がないとき」にそのシートを削除するにはどうしたらよいのでしょうか?
>

「シート内に値がないとき」を
If s.UsedRange.Count = 1 And s.UsedRange.Cells(1, 1) = Empty Then
これで判定しました。他にいい方法があるかもしれませんが。

これでどうでしょうか?


Sub データ作成()
Dim s As Worksheet
  Application.DisplayAlerts = False
  For Each s In ActiveWorkbook.Worksheets
    If s.UsedRange.Count = 1 And s.UsedRange.Cells(1, 1) = Empty Then
      s.Delete
    Else
      Application.Goto Reference:=Range("A1"), Scroll:=True
    End If
  Next
  Application.DisplayAlerts = True
End Sub

【35967】Re:データの無いシートを削除
発言  ponpon  - 06/3/16(木) 22:16 -

引用なし
パスワード
   こんばんは。

私も作ってみました。
>シート内に値(オブジェクトも)がないとき
のオブジェクトがよくわかりませんでしたが、シェイプかな?

Sub test()
  Dim Sh As Worksheet
  Dim C As Range
  
  For Each Sh In ActiveWorkbook.Worksheets
   Set C = Sh.Cells.Find(what:="*")
    If Not C Is Nothing Then
     Application.Goto Reference:=Range("A1"), Scroll:=True
    Else
     Application.DisplayAlerts = False
     If Sh.DrawingObjects.Count = 0 Then
       Sh.Delete  
     End If
     Application.DisplayAlerts = True
    End If
  Next
End Sub

【35973】Re:データの無いシートを削除
お礼  101  - 06/3/16(木) 22:40 -

引用なし
パスワード
   kobasan さん
ponpon さん:

 早速ありがとうございます。
 2つコードを確かめてみましたが、kobasanのコードでは、オブジェクト(オートシェイプとかグラフのつもりで言ってました)だけのシートは削除されましたが、ponponさんのコードでは削除されませんでした。
 今回はponponさんのコードを利用したいと思います。
 ありがとうございました。

【35978】Re:データの無いシートを削除
回答  ゆと  - 06/3/16(木) 23:47 -

引用なし
パスワード
   ▼101 さん:
解決済みなので蛇足ですが…
以下のコードを変更してみるれば101さんのコードでOKかと。
削除がある際には逆順から処理するようにすればいけます。

> For i = 1 To ActiveWorkbook.Worksheets.Count
For i = ActiveWorkbook.Worksheets.Count To 1 Step -1

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