• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAでワークシートのコメントを全部削除)

エクセルVBAでワークシートのコメントを全部削除

このQ&Aのポイント
  • エクセルVBAを使用してワークシートのコメントを一括で削除する方法について説明します。
  • ワークシートのコメントを削除するためには、特殊セルを使用してコメントの範囲を特定する必要があります。
  • また、エクセルVBA実行時にエラー91が発生する場合は、オブジェクト変数が設定されていない可能性があります。このエラーを回避するためには、エラーハンドリングを使用するか、オブジェクト変数を正しく設定する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

merlionXXさん、いつも、スレッド汚してすみませんです。(^^; Wendy02です。 少なくとも、SpecialCellsは、On Error トラップなしでは、まともには使えませんね。 それと、今回のエラーの意味は、その状況が書かれていませんので、私には分かりません。 ただ、Cells というのは、ワークシートのプロパティに属するものですから、Cellsと、いきなり、そのままで使うと、モジュールの違いによって、実行時エラーが起こります。なるべく、Cellsは、シートを指定するか、以下のように、ActiveSheetなどとしたほうがよいです。 また、モジュールは、一般的に、Excelでは標準モジュールを使うようにお勧めします。 Sub Del_Comment2() Dim cm As Comment For Each cm In ActiveSheet.Comments   cm.Delete Next End Sub

merlionXX
質問者

お礼

Wendy02さん、いつもためになる回答やご助言ありがとうございます。 おかげさまで無事解決です。 > 少なくとも、SpecialCellsは、On Error トラップなしでは、まともには使えませんね。 え、そうなんですか? 知らずに結構使ってました、大変!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルのVBAコードにつてい

    以下のコードについて、その内容をまだ自分の知識では理解できず困っておりまして、アドバイスいただければと思いまして書き込みました。 『コード』 Sub Test() Dim Lc As Integer Dim Ct As Integer Dim MyR As Range Dim C As Range Dim D As Range Lc = Range("A1").End(xlToRight).Column - 2 For Each C In Range("B2", Range("B65536").End(xlUp)) Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc)) If Ct > 0 Then Set MyR = C.Offset(, 1).Resize(, Lc).SpecialCells(2, 1) For Each D In MyR With Sheets("Sheet2").Range("A65536").End(xlUp) .Offset(1).Value = C.Value .Offset(1, 1).Value = Cells(1, D.Column).Value End With Next Set MyR = Nothing End If Next With Sheets("Sheet2") .Columns("A:B").AutoFit .Activate End With End Sub 『質問』 1.「Lc = Range("A1").End(xlToRight).Column - 2」の部分の解釈は「A1から右方向に一番最後のセルまでを範囲指定し、その一番右のセルの列番号を取得する」変数という解釈でいいのか 2.「Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc))」の部分の変数はどういった値の整数を取得する変数なのか 以上2点についてアドバイスいただけると幸いです。

  • EXCEL VBAで空白削除のマクロを作りましたが

    削除されません。 下記のとおりですが、どう考えても動きません、どなたか修正をお願いします。 初心者です。宜しくお願いします。 Sub Ksakujyo() Dim ObjRange As Range On Error Resume Next Set ObjRange = Application.InputBox("削除範囲を選択して下さい。", "印刷範囲", Type:=8) On Error GoTo 0 If ObjRange Is Nothing Then MsgBox "キャンセルされました。" End If If Selection.Count = 1 Then Exit Sub On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Delete shift:=xlShiftUp Exit Sub End Sub

  • シートを増やすVBA

    フィルタで隠れている場合もある列の値を シート名として増やしていくVBAで以下のようなものをつくりました (値は重複している場合もある) 雛型シートがありそれをシート名だけ増やしていくというものです Sub シートを増やす() Dim target As Range Dim h As Range On Error Resume Next Set target = Worksheets("一覧シート").Range("E10:E" & Worksheets("一覧シート").Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(h.Value).Select On Error GoTo 0 Next Sheets("一覧シート").Select Exit Sub errhandle: Worksheets("雛型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub そうすると、実行エラー1004 ”シートの名前をほかのシート、Visual Basicで参照されるオブジェクトライブラリまたはワークシートと同じ名前に変更することはできません。” というエラーがたまにおきます(シート名が数字の場合におきるようです) 解決方法及び理由をご教授ください

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • VBAの空白行削除について教えて下さい。

    以下のサイトにでてくるA列で空白セルを探し出し、その行全体を削除する方法を利用したいです。 書いてあるコードなのですが、 http://veaba.keemoosoft.com/2012/12/376/ Sub DeleteRowsWithBlankCells(ByRef argRange As Range) On Error Resume Next argRange.SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 End Sub と Call DeleteRowsWithBlankCells(Range("A1:A10")) はそれぞれどのように書けばいいのですか? End Subの前にCall DeleteRowsWithBlankCells(Range("A1:A10"))を書けばいいのですか? Callで呼び出してからSub以降ですか? Sub以降はそのままですか?どこか書き換えるのですか? Sub以降の書き方が今まで知っている書き方と違うのでよくわからなくなってしまいました。 宜しくお願い致します。

  • エクセルVBAで表の塗りわけ

    エクセル2003です。 添付画像のような表を、B列の時刻を基準に、何時台かで表を上から順に4色に色分けしようと思います。 一応、以下のコードで出来たのですが、Offset(-1).Value で見ている1行目のタイトル行が文字列なのでOn Error Resume Next でエラー回避しなくてはいけません。 他にもっと良い方法はないでしょうか? Sub test001() Dim cl As Variant Dim n As Long cl = Split("2,19,35,39", ",") For Each rng In Range("B2", Cells(Rows.Count, "B").End(xlUp)) On Error Resume Next If Hour(rng.Value) <> Hour(rng.Offset(-1).Value) Then n = n + 1 End If On Error GoTo 0 rng.EntireRow.Interior.ColorIndex = Val(cl(n Mod 4)) Next End Sub

  • Excel VBA 全部のUserForm名

    OSはXP、 Excelは2003 を使用しています。 色々なサイトを参考にさせて頂いて作ったブック内のコントロールを表に書き出すマクロが下記になるのですが、 ユーザーフォーム名を都度書き換えないといけないので、 同時にブック内のユーザーフォーム名を変数に格納する方法をどなたか教えて頂けないでしょうか? Sub test() Dim c As Control, r As Long Dim d As Control Load frmCustomerEntry  ’←☆ Worksheets("Sheet1").Activate r = 3 Cells(1, 1) = ("コントロール数:" & frmCustomerEntry.Controls.Count)  ’←☆ Cells(2, 1).Value = "No" Cells(2, 2).Value = "名前" Cells(2, 3).Value = "種類" Cells(2, 4).Value = "Caption" Cells(2, 5).Value = "高さ" Cells(2, 6).Value = "幅" Cells(2, 7).Value = "Top" Cells(2, 8).Value = "Left" Cells(2, 9).Value = "Enabled" For Each c In frmCustomerEntry.Controls Cells(r, 1).Value = r - 2 Cells(r, 2).Value = c.Name Cells(r, 3).Value = TypeName(c) If TypeName(c) = "TextBox" Then 'captionの項目がないのでエラー回避 Cells(r, 4).Value = "" ElseIf TypeName(c) = "ListBox" Then 'captionの項目がないのでエラー回避 Cells(r, 4).Value = "" Else Cells(r, 4).Value = c.Caption End If Cells(r, 5).Value = c.Height Cells(r, 6).Value = c.Width Cells(r, 7).Value = c.Top Cells(r, 8).Value = c.Left Cells(r, 9).Value = c.Enabled r = r + 1 Next c On Error GoTo 0 End Sub ***************** ブックの中にユーザーフォームが10数個あります。 名前は任意に名前に変更しています。 全て「frm」が頭に付いていて以下はバラバラです。 説明不足なところもあるかもしれませんが、 どうかよろしくお願い致します。

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • マクロエラー 1004 1004 アプリケーション定義またはオブジェクト定義のエラーです。

    下記のプログラムで 自分のパソコンでは正常に動くのですが 違うパソコンでは エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 セルの書式設定 → 表示形式  を変更するとエラーがでてしまいます。 自分のパソコンでは何をしてもエラーは出ません。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Private Sub CommandButton2_Click() Dim myShp As Shape Dim myR As Range, SR As Range On Error Resume Next Set myR = Range("G87:K96") If Err.Number <> 0 Then Exit Sub On Error GoTo 0 For Each myShp In ActiveSheet.Shapes Set SR = Range(myShp.TopLeftCell, myShp.BottomRightCell) If Not Intersect(SR, myR) Is Nothing Then myShp.Delete End If Set SR = Nothing Next Set myR = Nothing End Sub

  • エクセル2010 VBA 行削除

    特定列が空白であれば行削除をしたいのですが、下記コードでうまく削除は出来るのですが、応答なしになったり、とても遅いのですが、もう少し早く処理出来る方法はありますか? E列が空白であれば行削除をしたいのですが・・ With Range("E13", Cells(Rows.Count, 5).End(xlUp)) .AutoFilter Field:=1, Criteria1:="" On Error Resume Next Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then rng.EntireRow.Delete On Error GoTo 0 .AutoFilter End With

専門家に質問してみよう