• ベストアンサー

Excel 終了マクロ

Excel で終了マクロを作ってみましたが、途中で次のメッセージが出てしまいます。 「実行時エラー'424' オブジェクトが必要です」 どう直したらよいか、教えて下さい。よろしくお願いします。 Sub Macro1() With ActiveWorkbook If MsgBox("終了します") = vbOK Then Set dbsTemp = Nothing ActiveWorkbooks.Close End If End With End Sub

  • awazo
  • お礼率97% (616/629)

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

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

こんにちは。 ActiveWorkbooks.Close  の ActiveWorkbooks というオブジェクト名は存在していません。 ActiveWorkbook です。だから、424 のエラーが発生します。 ただし、通常、終了時には、そのようなマクロの書き方をしません。 最低限、このようにします。 Sub Macro2()   With ActiveWorkbook     If MsgBox("終了します", vbOKCancel) = vbOK Then      .Close True '上書き終了     End If   End With End Sub

awazo
質問者

お礼

Wendy02さん すっきりと巧くいきました。 動作確認を終え、これから Word で用法説明書を作ります。 お忙しい中、いろいろありがとうございました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

ACtiveと付く(オブジェクトは)、エクセルが動いている各現時点で1つしかない。だからActiveWorkbooksと末尾に「s」をつけてはいけないのは、VBAでは有名な話。 また1つのブックをCLOSEしても、エクセルは終了しないはずだが。 Application(=Excel)の終了はQuitでは無いですか。 http://seadragon.info/excelvba/excel_library1.htm#強制終了 Sub 強制終了() '何も保存しないですぐエクセルを終了したいとき Application.DisplayAlerts = False Application.Quit End Sub その後Nothingをオブジェクト(変数)に対しセット。

awazo
質問者

お礼

imogasiさん ありがとうございました。 元のブックをひとまず見せて安心させてから終了ということにしました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.3

ActiveWorkbooks.Close ↓ .Close でどうでしょうか? または With ActiveWorkbook End With をやめて、 ActiveWorkbooks.Close ↓ ActiveWorkbook.Close

awazo
質問者

お礼

ka_na_deさん ありがとうございました。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.2

>With ActiveWorkbook と >ActiveWorkbooks.Close で、ActiveWorkbooksがダブってるのが原因ですね 一応、 .Close だけで動きます

awazo
質問者

お礼

ASIMOVさん ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

Sub Macro1() With ActiveWorkbook If MsgBox("終了します") = vbOK Then Set dbsTemp = Nothing .Close End If End With End Sub With ActiveWorkbookでくくってありますから、ActiveWorkbooks.CloseのActiveWorkbooksは不要です。

awazo
質問者

お礼

merlionXXさん ありがとうございました。

関連するQ&A

  • エクセル/BeforeCloseイベントで保存できない!?

    エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub

  • エクセル2000ではOKなのに2003でエラーになるマクロについて

    下記のVBAコードにつきご教示ください。 終了時にワークシート上に配置したCloseButtonを押すと、ダイアログシート上に配置したフォームのDropDownsやEditBoxesを初期化して保存する単純なマクロです。 エクセル2000では問題なく、2003以降で使用すると実行時エラー424「オブジェクトが必要です」となります。 ただし、いろいろ試したところ以下のことがわかりました。 1.エラーが出るのはCloseButtonを押した場合のみで、エクセル画面右上の×で終了する場合はエラーになりません。 2.終了時以外にSub 初期化()を単独で実行してもエラーになりません。 3.このBOOKの他にもBOOKを開いている場合、(Workbooks.Count= 1でない場合)エラーになりません。 なぜこうなるのか不思議です。 ご教示いただければ幸いです。 Sub CloseButton() ans = MsgBox("終了しますか?", vbYesNo + vbQuestion, " おしまい?") Select Case ans Case vbYes Call Auto_Close Case vbNo Exit Sub End Select End Sub Sub Auto_Close() Call 初期化 ThisWorkbook.Save If Workbooks.Count = 1 Then Application.DisplayAlerts = False Application.Quit Else ActiveWorkbook.Close (False) End If End Sub Sub 初期化() With DialogSheets("Dialog1") .DropDowns.ListIndex = 1 'ここでエラー(「オブジェクトが必要です」) .EditBoxes.Text = "" End With End Sub

  • 列幅、行の高さを指定するマクロ

    元マクロ初心者(今はほとんど忘れています)です。 列幅、行の高さを変更するマクロを以前作りました。 セルに指定する列幅を入力するのですが、 最近100以上の値の時はスキップされることに気づきました。 100以上の値でも処理されるようにするにはどうすればよいでしょうか。 Sub 列幅変更マクロ() ' ' Macro1 Macro ' マクロ記録日 : 2004/1/31 ユーザー名 : ' 列幅の変更 ' Keyboard Shortcut: Ctrl+l ' If MsgBox("→:列幅を変更します。右の方向にセル内の数値に従って処理しています。一番右のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.ColumnWidth = ActiveCell.Value End If End If ActiveCell.Offset(0, 1).Select Loop End If End Sub Sub 行の高さ変更マクロ() ' ' Macro2 Macro ' マクロ記録日 : 2004/2/1 ユーザー名 : ' 行の高さ変更 ' Keyboard Shortcut: Ctrl+p ' If MsgBox("↓:行の高さを変更します。下の方向にセル内の数値に従って処理しています。一番下のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.RowHeight = ActiveCell.Value End If End If ActiveCell.Offset(1, 0).Select Loop End If End Sub

  • フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?

    エクセル2003です。 ワークシート上に複数個のチェックボックスを配置し、オンの場合、その左隣のセルの値を返すマクロを作成する場合についての質問です。 普段はフォームのCheck boxを使っています。 フォームのCheck boxなら Sub ChkBx() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub と、標準モジュールに一つだけプロシージャを書いて、複数個のCheck boxに同一のマクロを登録すれば簡単に出来ます。 ところがこれをOLEObjectのCheckboxでやってみようと思ったところ、フォームのように一つのプロシージャを使いまわすことができず、シートモジュールに以下のように各Checkboxごとのマクロを書かなくてはいけないようです。 Private Sub CheckBox1_Click() With OLEObjects("CheckBox1") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox2_Click() With OLEObjects("CheckBox2") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox3_Click() With OLEObjects("CheckBox3") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub 3つや4つくらいならどうってことはないのですが十数個もあるとかなり面倒です。 OLEObjectのCheckboxでももっと簡単にする方法はないのでしょうか? それともわたしが何かOLEObjectのCheckboxの使い方について思い違いをしているのでしょうか? ご教示をお願いいたします。

  • エクセル・名前を付けて保存するマクロ 不要な文字を消す方法

    お世話になります。 エクセルで「名前をつけて保存」のマクロを作って使用していますが、 一部、改造したいところがあります。 B20セルの文字が自動でファイル名になるようにしています。 「件名:●×商店納品見積書_20090125_1326」という感じなのですが、 最初の「件名:」という文字が不要で、毎回手動で消しています。 しかし、この文字を最初から消しておくわけにはいかず、 マクロ実行時のみ「件名:」が消えるようにしたいのです。 よい方法はありますか? どうぞよろしくお願いします。 Sub ブック保存() Dim SaveFileName As String, re As Variant, WSH As Variant, Path As String Set WSH = CreateObject("WScript.Shell") Path = WSH.SpecialFolders("Desktop") & "\" With Sheets("見積書").Range("B20") If .Value = "" Then MsgBox "店舗名が入力されていません", vbExclamation Exit Sub Else SaveFileName = Path & .Value & "_" & Format(Now, "yyyymmdd_hhmm") End If End With Set WSH = Nothing re = Application.GetSaveAsFilename(SaveFileName) If re = False Then MsgBox "保存中止", vbExclamation Else ActiveWorkbook.SaveAs SaveFileName MsgBox "保存OK", vbInformation End If End Sub

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • エクセルのマクロについて教えて下さい。

    資料作成の為に、マクロを組んでいるのですが、どうしてもできない部分があり、 ご教授頂きたく書きこませて頂きます。 私が行いたいのは、2種のブック(1ブック,2ブックとして)を用意して、 2ブックのC列にある文字列を1ブックのC列に検索をかけて、該当する物があれば、 セルの塗りつぶしを行う。と言う動作です。 ですが、2ブックのC列の取り込みがうまく出来ません。 range(C)と書いてもエラーが出てしまします。 何卒、ご教授のほど、宜しくお願い致します。 Sub selectfoundsheets() For Each s In Worksheets vx = MsgBox(s.Name & " を検索しますか?", vbYesNo) If vx = vbYes Then s.Select Set c = Cells.Find(What:="   ")   'ここに2ブックのC列を取り込みたいのです。 If Not c Is Nothing Then f = c.Address Do With c.Interior .ColorIndex = 6 .Pattern = xlSolid .PatternColorIndex = xlAutomatic End With Set c = Cells.FindNext(c) Loop While Not c Is Nothing And c.Address <> f End If End If Next s End Sub

  • エクセルのマクロで保存して終了が出来ない

     あるエクセルファイルにて、VBAで Sub 保存して終了() ActiveWorkbook.Save ActiveWorkbook.close End Sub  というマクロを作成したのですが、1回目は正常に動いたのですが次からは、そのマクロを動かしても画面が一瞬点滅するだけで、上書き保存も終了もしません。  それで、ファイルを別の名前をつけて保存してその、別の名前で保存したファイルで、また上のマクロを動かすと1回目は正常に動くのですが、やはり次に開くと動かなくなります。  因みに他のマクロは正常に動作し、この保存して終了させるマクロだけが変なのです。  マクロの書き方を変えて以下のようにしてもだめでした。 Workbooks("ナントカ.xls").Close savechanges:=True  やはり、何回書き方を変えても保存して終了させることだけが出来ません。普通にマクロを使用せず手動ですることは出来るのですが…。  分かりにくい説明ですみませんが、よろしくお願いします。

  • EXCELで作ったマクロを別のファイルのEXCELでも使えるようにしたいです。

    (1)EXCELファイルでマクロを作成しました。 (実際はここである人の知恵をお借りして作ったものですが…) しかし、(2)EXCELファイルで(1)EXCEL作成マクロが実行できません。 どのような処理をすれば、どのPCでも、どのファイルでも実行できるようなマクロに出来るのでしょうか?? 以下にそのマクロを示します。 ↓↓↓ Sub 文字置換() '半角カタカナを全角に、全角英数を半角にするマクロ (Excel編) Dim rng As Range Dim Re As Object Dim myPat As String Dim c As Range Dim Matches As Object Dim Match As Object Dim Str1 As String Dim Str2 As String Dim buf As String Dim t As Long On Error Resume Next Set rng = ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeConstants, xlTextValues) On Error GoTo 0 If rng Is Nothing Then MsgBox "変換する対象が見当たりません。", 48 Exit Sub End If '全角側 --- 半角側 (!-/ を加えれば記号も半角) myPat = "([\uFF66-\uFF9F]*)([!-}]*)" '正規表現のパターン Set Re = CreateObject("VBScript.RegExp") Application.ScreenUpdating = False With Re .Global = True .IgnoreCase = True .Pattern = myPat For Each c In rng.Cells Set Matches = .Execute(c.Value) If Matches.Count > 0 Then buf = c.Value For Each Match In Matches If Len(Match.Value) > 0 Then Str1 = StrConv(Match.SubMatches(0), vbWide) If Str1 <> "" Then '0 =vbBinaryCompare buf = Replace(buf, Match.SubMatches(0), Str1, , , 0) End If Str2 = StrConv(Match.SubMatches(1), vbNarrow) If Str2 <> "" Then buf = Replace(buf, Match.SubMatches(1), Str2, , , 0) End If End If Str1 = "": Str2 = "" Next Match If buf <> c.Value Then c.Value = buf t = t + 1 End If End If Next c End With Set Re = Nothing Application.ScreenUpdating = True If t > 0 Then MsgBox t & "個のセルを変換しました。", 64 End If End Sub 出来れば、置換した文字数をメッセージBOXに表示したいです。

  • Word2007のマクロについて

    こんにちは。 Word2007のマクロについて質問させて下さい。 ・タイトル行が(16738047)色で、本文が黒文字の日本語の文書があります。 ・タイトル行内でキーワード検索を行いたいです。 ・1個ずつ内容を確認したいので「次を検索」 MsgBoxを使用しています。 以下のコードを実行すると、単語が1個飛ばしに選択されてしまいます。 どこを変更すればいいでしょうか? 教えてください。よろしくお願いします。 Sub タイトル検索() Dim myKW As String 'キーワード myKW = InputBox("検索する文字を入力して下さい") Selection.HomeKey Unit:=wdStory 'カーソルを文頭に移動 With Selection.Find .ClearFormatting .Font.Color = 16738047 .Text = myKW .MatchWildcards = False .MatchFuzzy = False If Len(myKW) = 0 Then Exit Sub If .Execute = True Then Do While .Execute If MsgBox("次を検索", vbokcansel, "確認") = vbOK Then Selection.Find.Execute End If Loop   MsgBox "処理が終了しました。" Else MsgBox "文字はありませんでした。" End If End With With Selection.Find ' 検索・置換のクリア .ClearFormatting: .Replacement.ClearFormatting .Text = "": .Replacement.Text = "" .MatchWildcards = False: .MatchFuzzy = False End With End Sub

専門家に質問してみよう