Excelオートシェープでマクロエラーの原因と対処法

このQ&Aのポイント
  • Excelでオートシェープを使用した際に発生するマクロエラーの原因と対処法を解説します。
  • 具体的な現象としては、ワークシートに図形を挿入し、その図形にマクロを登録すると、特定の順番でプロテクト解除を行った場合にエラーが発生します。
  • このエラーの原因は、プロテクト解除の順番にあります。sheet2を先に解除すると正常に動作しますが、sheet1を先に解除するとエラーが発生します。
回答を見る
  • ベストアンサー

excel オートシェープでマクロエラー

前回、不思議なエラーについて質問した者です。 その後、原因と対処法は分かったのですが、エラーになる理由が分かりません。 現象について極簡単に簡略化して説明します。 ①ワークシートを2つ作ります。sheet1,sheet2 ②sheet1のA列の任意のセルに図形を挿入します。 ③その図形に以下のマクロを登録します。 Sub Macro1() Dim row, j As Integer Dim target As String Worksheets("sheet1").Unprotect ("") Worksheets("sheet2").Unprotect ("") row = ActiveSheet.Shapes(Application.Caller).TopLeftCell.row target = CStr(row) j = Worksheets("sheet1").Range("B" + target).Value j = j + 1 Worksheets("sheet1").Range("B" + target).Value = j Worksheets("sheet2").Protect ("") Worksheets("sheet1").Protect ("") End Sub 図形をクリックした回数をその図形の右に表示するだけのものです。 sheet2はその動作には関係ないのですが、エラーに関係します。 ④ここで4行目と5行目のプロテクト解除を  先にsheet1を解除してから次にsheet2を解除 Worksheets("sheet1").Unprotect ("") Worksheets("sheet2").Unprotect ("")  すると、正常に動作しますが、  先にsheet2を解除してから次にsheet1を解除 Worksheets("sheet2").Unprotect ("") Worksheets("sheet1").Unprotect ("")  にすると、1回目のクリックは動作しますが、2回目のクリックでは「指定した名前のアイテムがみつかりませんでした。」というエラーになります。 この現象について、どなたか理由を教えていただけませんか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1622/2462)
回答No.1

> 1回目のクリックは動作しますが、2回目のクリックでは「指定した名前のアイテムがみつかりませんでした。」というエラーになります。 最初にシートを保護してから実行すると1回目からエラーになります。 オフィシャルな説明箇所は提示できませんが 保護をしているシートをUnprotectをするとその前にUnprotectしたシートがあればそのシートがActiveSheetになります。 なので、 Worksheets("sheet2").Unprotect ("") Worksheets("sheet1").Unprotect ("") とした場合にSheet2がActiveになりActiveSheet.Shapesがないのでエラーになります。 たとえばですが、以下のようにしておくとどちらを先にUnprotectしてもエラーになりません。 Dim row, j As Integer Dim target As String Dim Sh1 As String Sh1 = ActiveSheet.Name Worksheets("sheet2").Unprotect ("") Worksheets("sheet1").Unprotect ("") row = Sheets(Sh1).Shapes(Application.Caller).TopLeftCell.row target = CStr(row) j = Worksheets("sheet1").Range("B" + target).Value j = j + 1 Worksheets("sheet1").Range("B" + target).Value = j Worksheets("sheet2").Protect ("") Worksheets("sheet1").Protect ("") Sheets(Sh1).Activate

その他の回答 (2)

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

Sub test01() Worksheets("sheet1").Unprotect ("") MsgBox ActiveSheet.Name Worksheets("sheet2").Unprotect ("") MsgBox ActiveSheet.Name '--- 'ActiveSheetは、上記Unprotect変わらない。 End Sub 色んな箇所に、MsgBox ActiveSheet.Name の行を増やしてテスト実行し、自分の考えているシートを捉えているか、予想外はないか、チェックし直してはどうか。 ーー シートの指定は、明示的にWorkSheets(”Sheet1”).・・のようにシート名で行うことを勧める。 蛇足だが、良く注意を受ける例で、 特にRange(cells(・・),Cells(・・))のような指定するときに注意。 持ちろん、 With WorkSheets(”Sheet1”) Range(.cells(・・),.Cells(・・))  End With のような指定でもよいが。

  • kkkkkm
  • ベストアンサー率65% (1622/2462)
回答No.2

ActiveSheetにこだわらなくてSheet1限定でしたら Sheets(Sh1)のところを Worksheets("sheet1") で

関連するQ&A

  • excel オートシェープでマクロエラー

    どうにも不思議な現象が発生して困っています。 どなたか原因と解決方法を教えてください。 ワークシートに挿入した図形にマクロを登録し、選んだ図形によって処理を変えます。 登録したマクロに row = ActiveSheet.Shapes(Application.Caller).TopLeftCell.row を書いて、図形のある行を取得し、どの図形がクリックされたかを判断しています。 不思議なのはここからで、 【その1】  ずっと何年間も不具合無く動作していたのに急に「指定した名前のアイテムがみつかりませんでした。」というエラーが発生するようになりました。  しかも1回目に図形をクリックしたときは正常に動作するのに、続けて2回目をクリックするとこのエラーが出ます。 そして、デバッグでVB画面に移り、マクロを一度停止して再起動すると、また1回目は正常動作するのに2回目はエラーとなります。 【その2】 原因をさぐるためにrow = ActiveSheet.Shapes…の行の前にブレークポイントを設定してみたところ、ブレークポイントを置いて停止後に継続させると何回でも正常に動作します。 この現象自体が不明です。 どなたかよろしくお願いいたします。

  • エクセルマクロでロックするとエラーが出る

    こんにちは エクセルマクロでロックをかけるとエラーが出てしまいます。 具体的には↓ Sub tes() Range("a1:c1").Copy ActiveWorkbook.Worksheets("Sheet2").Activate ActiveSheet.Unprotect '(1) Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).PasteSpecial End Sub 上記のマクロでSheet2にロックをかけるとエラーが起こります。 (1)まではちゃんと行きますし、Sheet2にロックをかけなくても上手く動作します。 原因が思いつかないので、ぜひアドバイスをお願いいたします。

  • マクロ初心者(;◔ิд◔ิ)オーバーフロー!!

    異なるシートで一致するデータがあった場合、 そのセルを選択して値貼り付けするというマクロを作りました。 作ったとはいえ、 教えてもらったマクロを試行錯誤して使えるようにアレンジしただけなので、 なにがなんだかよくわかっていません。 下記の記述でマクロを使用していましたが、 突然エラーになって使用できなくなりました。。。。 中身を見ると If Worksheets("master sheet").Cells(i, "BL").Value = Worksheets("請求書フォーム").Range("J1").Value Then この部分が黄色に塗りつぶされてるのですが、 どこをどう直したらいいのか全くわかりません。 ちなみに、ほかのファイルでも同じようなマクロを使用していますが、 そちらは問題なく使用できています。 なんとか教えていただけないでしょうか。 よろしくお願いします!!!! Sub こぴぺ() ' ' こぴぺ Macro Dim sheet1 As Worksheet Set sheet1 = Worksheets("請求書フォーム") sheet1.Activate Dim target As Range Dim i As Long Worksheets("請求書フォーム").Range("J1").Select For i = 1 To Worksheets("master sheet").Range("BL65536").End(xlUp).Row If Worksheets("master sheet").Cells(i, "BL").Value = Worksheets("請求書フォーム").Range("J1").Value Then If target Is Nothing Then Set target = Worksheets("master sheet").Range("BL" & i) Else Set target = Union(target, Worksheets("master sheet").Range("BL" & i)) End If End If Next i Set sheet1 = Worksheets("master sheet") sheet1.Activate If Not target Is Nothing Then target.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub

  • エクセル マクロ IF関数について

    Sheet1にグループボックス内で、チェックボタンで項目を選択するとA1に記載されるように作成、マクロで入力ボタン作成しボタンをクリックするとSheet2に記載されるように作りました。しかし、項目が多いためSheet2を見るとABCDEFGなどの列に空白が目立ち使いづらいです。 そこでIF関数を使い何とか出来ないでしょうか? 例)SHEET1 B2に原因のグループボックスにカテゴリー(チェックボックスにて1)入力ミス、2)人、3)機械) B3に対応のグループボックスにカテゴリー(チェックボックスにて1)外注、2)修正、3)報告) と作り、それらがチェックされていたら、A1の列に表示され入力ボタンを押したら、Sheet2のAには原因、Bには対応と記載されるようにしたいです。その時Sheet1のA列に空白があれば、Sheet2の列に表示するようにしたいです。 実際のマクロ記入 Sub 入力() Dim LastRow As Long With Worksheets("Sheet2") LastRow = Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & LastRow).Value = Worksheets("Sheet1").Range("A6").Value .Range("B" & LastRow).Value = Worksheets("Sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("Sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("Sheet1").Range("A9").Value .Range("E" & LastRow).Value = Worksheets("Sheet1").Range("A10").Value .Range("F" & LastRow).Value = Worksheets("Sheet1").Range("A12").Value .Range("G" & LastRow).Value = Worksheets("Sheet1").Range("A13").Value .Range("H" & LastRow).Value = Worksheets("Sheet1").Range("A15").Value .Range("I" & LastRow).Value = Worksheets("Sheet1").Range("A16").Value .Range("J" & LastRow).Value = Worksheets("Sheet1").Range("A19").Value End With End Sub お願いします教えてください。

  • エクセルのマクロで。

    エクセルでマクロを組もうと思ったのですが 素人なので進みません。 何が悪いかも判りません。 教えてください。<(_ _)> 単純にシート入力のB1列のデーターの数を数えて シート出力のJ1にその数を入れるだけなんですが・・・。(T_T) Sub Macro1() ' ' Macro1 Macro ' ページ = Worksheets("入力").Range("B1").CurrentRegion.Row.Count Worksheets("出力").Range("J1") = Count End Sub 「ページ = Worksheets("入力").Range("B1").CurrentRegion.Row.Count」 ディバグすると上記の所で「オブジェクトが必要です」とエラーが出ます。 頭も爆発寸前です。(>_<)

  • マクロを組むとこんなエラーが出るようになりました

    捺印君:Vel 1.25→(エクセルのフリーソフトです) PicturesクラスのPasteプロパティを取得出来ません。 予期せぬエラーが発生しました。 とエラーが出ます。 ちなみに組んでいるマクロは下記です Sub 全シートの保護() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Protect Password:=myPassword Next End Sub Sub 全シートの解除() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Unprotect Password:=myPassword Next End Sub このマクロがおかしいからエラーが出るんですよね? 違うマクロにすれば問題ないでしょうか? ちなみにマクロは「全シートの保護一括解除」と「一括保護」で パスワード付きの物をとなっております。

  • 教えてマクロの記述?

    シート1に記述した内容をシート2に一覧形式で入力するマクロを以下の通り作成しました。 シート1に記述した内容を、別のブックのシートに一覧形式で入力していくマクロに変更するには どのようにマクロの記述をすれば宜しいのでしょうか?マクロの初心者にも分るようにご教授 いただければ助かります。よろしくお願いします。 Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1 .Range("B" & LastRow).Value = Worksheets("sheet1").Range("B1").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("B3").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("B5").Value .Range("E" & LastRow).Value = Worksheets("sheet1").Range("B7").Value .Range("F" & LastRow).Value = Worksheets("sheet1").Range("B9").Value .Range("G" & LastRow).Value = Worksheets("sheet1").Range("B11").Value End With End Sub

  • エクセルマクロ実行時エラー1004について

    システムを起動すると実行時エラー1004とでて5行目のWorksheets(3).Selectで止まってしまいます。 私が作成したものではなく、なぜなのかわかりません。緊急を要しています。誰かわかる方いらっしゃらないでしょうか。 よろしくお願いします。 Dim Max_data2 As Integer Public Cunt_01 As Integer Sub auto_open() Dim wkSheet As Excel.Worksheet Worksheets(3).Select ' Range("c4") = Date ' Range("c20") = Date Range("d6").Select With Worksheets("工場、受注一覧表") ' Worksheets("工場、出荷指示書").Range("j3").Value = Date ' Worksheets("工場、出荷指示書").Range("I4").Value = Date ' Worksheets("工場、出荷指示書").Range("J4").Value = Time .Range("d5").Value = Date .Range("d21").Value = Date .Range("d23").Value = Date End With For Each wkSheet In ThisWorkbook.Worksheets If InStr(wkSheet.Name, "工場、出荷指示書") <> 0 Or InStr(wkSheet.Name, "@") <> 0 Then wkSheet.Range("J3").Value = Date wkSheet.Range("I4").Value = Date wkSheet.Range("J4").Value = Time End If Next Call com_list Cunt_01 = 10 '1件づつ転記のカウンタ '★追加★ '入出庫報告書のファイルを開く Dim sPath As String sPath = ThisWorkbook.Worksheets("工場、受注一覧表").Range("W1").Value If sPath = "" Then Exit Sub End If If Dir(sPath) <> "" Then Workbooks.Open (sPath) End If ThisWorkbook.Activate ''★23.06.12 ActiveWindow.SmallScroll ToRight:=4 End Sub

  • 他のブックでマクロを実行するには?

    以下のマクロを実行すると同一ブック内の他のシートに入力 されますが、これを他のブックのシートに入力されるように するには、具体的にどのようにすればいいのでしょうか? ご教授ください。 ---------------------------------------------------------------- Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1 .Range("B" & LastRow).Value = Worksheets("sheet1").Range("B1").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("B3").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("B5").Value .Range("E" & LastRow).Value = Worksheets("sheet1").Range("B7").Value .Range("F" & LastRow).Value = Worksheets("sheet1").Range("B9").Value .Range("G" & LastRow).Value = Worksheets("sheet1").Range("B11").Value End With End Sub

  • エクセルのマクロを教えてください。

    マクロの初心者です。 特に変数が全く使えず、下記もどのように記載していいのかわからないため教えていただけないでしょうか。 ユーザーフォームのtextbox2に開始番号があります。 textbox3に本数があります。 sheet1のB12セルには開始番号が入ります。 開始番号から本数分+1したものを順番にセルに入っていくようにしたいです。 ただ、入れたいセルが横→左下(開始番号の列)→横→左下(開始番号の列)・・・としたいため、どのように書いていいのかわかりません。 地道に書くのであれば、下記のようになると思うのですが、変数を使って書く場合はどのようになるのか教えていただけないでしょうか。 Worksheets("Sheet1").Range("B12").Value = TextBox2.Value If TextBox3.Value = 2 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 ElseIf TextBox3.Value = 3 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 ElseIf TextBox3.Value = 4 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 Worksheets("Sheet1").Range("G13").Value = TextBox2.Value * 1 + 3 ElseIf TextBox3.Value = 5 Then Worksheets("Sheet1").Range("G12").Value = TextBox2.Value * 1 + 1 Worksheets("Sheet1").Range("B13").Value = TextBox2.Value * 1 + 2 Worksheets("Sheet1").Range("G13").Value = TextBox2.Value * 1 + 3 Worksheets("Sheet1").Range("B14").Value = TextBox2.Value * 1 + 4 ・ ・ ・ End If

専門家に質問してみよう