VBAの実行時エラー91とは?対処法はある?

このQ&Aのポイント
  • 「実行時エラー'91'オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが発生し、VBAのコードが正常に実行されない問題です。
  • エラーの原因として、オブジェクト変数やWithブロック変数が正しく設定されていないことが考えられます。
  • 解決策として、変数の宣言やオブジェクトのセットアップを適切に行う必要があります。また、変数が使用される箇所で値がセットされているか確認することも重要です。
回答を見る
  • ベストアンサー

VBAの実行時エラー91!どうしよう?

excelVBAでファイル内の各シートを確認して、条件に合うシートのデータをコピーするところで、「実行時エラー'91'オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ました。 確認したのですが、なかなか分かりません。どなたがご指導お願いできませんか。 コードは以下のとおりです。 Sub Tenki(theBook As Workbook, mySheet As Worksheet) Dim K_Sheet As Worksheet Dim DstRange As Range For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました! If K_Sheet.Name <> "C" Then Set DstRange = mySheet.Range("A" & _ mySheet.Range("A1").CurrentRegion.Rows.Count + 1) K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select Range("B7:K48").Copy DstRange.PasteSpecial Paste:=xlPasteValues End If Next Application.CutCopyMode = False End Sub どうぞよろしくお願いします。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

theBookに値がセットされていないのでは? Dim DstRange As Range msgbox theBook.name 'これを追加して、ここで同じエラーが出るのであれば、theBookに値がセットされていない For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました! 他にも、んっと思うところもありますが 取り敢えず、エラーの部分のみ 以上参考まで

gohome23jp
質問者

補足

早速のご回答、ありがとうございました。 hige_082さんのおっしゃったとおりです。セットするのが忘れた。 新しくセットして、うまく回したが、 hige_082さんの「んっと思うところもありますが」は ちょっと気になるので、ぜひ教えていただけないでしょうか。 わがままですみません、よろしくお願いします。

その他の回答 (3)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

#2です >「んっと思うところもありますが」は >ちょっと気になるので、ぜひ教えていただけないでしょうか。 私が、んっと思った所を含め、それ以上の回答を #3さんがされていますので #3さんの回答を参考にしてください

gohome23jp
質問者

お礼

はい、了解です。いろいろ助けてくださって、ありがとうございます。

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

こんにちは。 サブルーチンにするまでのほどではないような気がします。 それに、この程度で、コピーする側も、貼り付けする側もサブルーチンの引数で指定するから、ややこしくなるのです。片方をActiveSheet にすれば、コピー元ブックだけになります。 全コードを書いていないから、書かれていない部分を想像するしかありませんが、サブルーチンに入れるためのコードのミスです。空のオブジェクトだからです。ブックの変数に、固有のブックを指定していません。 全体がかかれていないので、やむを得ず、サブルーチンを直すしかありませんが、以下のように一行入れればよいです。本来は不必要です。 If theBook Is Nothing Then Exit Sub '←この行を挿入 For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました! If K_Sheet.Name <> "C"は、大文字・小文字の違いがありますから、場合によっては、K_Sheet.Nameは、StrConv(K_Sheet.Name, vbUpperCase) <> "C" としたほうが安全です。 >K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select >Range("B7:K48").Copy これでは、Select した瞬間に、エラーが発生する可能性がありますから、 K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).("B7:K48").Copy としたほうが良いような気がします。 余計なのかもしれませんが、 DstRange.PasteSpecial Paste:=xlPasteValuesのDstRange で、 Set DstRange = mySheet.Range("A" & _ mySheet.Range("A1").CurrentRegion.Rows.Count + 1) コピーするには、行列のマトリックスで取得して張り付けるのですから、どこかに最終行の基準がある列があってもよいと思うのです。貼り付けるたびに、位置の確認で、CurrentRegion というのは、少し懲りすぎているように思うのです。これは、個人的な感想で、内容が部分的でしかないので、ここらは手が付けられません。もちろん、#1さんご指摘のように、A列の最終行を決めるなら、Rangeオブジェクトにする必要がありません。

gohome23jp
質問者

お礼

ご回答ありがとうございました。自分自身の力不足も実感しました。引き続き、頑張りますが、お邪魔することがあると思います。ぜひまたよろしくお願いします。

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

オブジェクトK_sheetの中身をsetしないといけないのではないでしょうか。 シート数をカウントしてfor 1 to cntで回せば、そこの部分のエラーは回避できるかと思います。

gohome23jp
質問者

お礼

hige_082さんがおっしゃったとおり、値のセットを忘れました。 こんなところで引っかかって本当に、恥ずかしいです。 アドバイス、ありがとうございます。参考させていただきます。

関連するQ&A

  • エクセルの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のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • VBAで実行時エラー1004が出ます

    VBAで実行時エラー1004が出ます。 「Rangeメソッドは失敗しました。Worksheetオブジェクト」です。 あらゆる可能性を調べたのですが、分かりません。誰か教えて頂けますでしょうか? 下記コードの「Cells(m, 7) =・・・」の部分がエラーになりました。 Sub ボタン1_Click() Dim 現シート As Worksheet ~ 現シート.Activate Cells(m, 7) = WorksheetFunction.VLookup(現シート.Range(現シート.Cells(m, 4)).Select, 現シート.Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)).Select, 4, False) ~ End Sub 何卒宜しくお願いいたします。

  • VBAで二つの構文を繋げるには

    いつもお世話になります。 WIN7 EXCELL2010 です。 1) A1に 数値化した日付を入力するとシート名表示に反映される。  例えば 2014/07/31 で A1 には 20140731 と入力するとシート名にも      20140731 が表示 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub 2) 1)で表示された複数のシートから今日のシート名になっているシートの色付けです。 Private Sub Workbook_Open() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Tab.ColorIndex = 19 If mySheet.Name = Format(Now(), "yyyymmdd") Then mySheet.Tab.ColorIndex = 3 End If Next End Sub 3) 各月をまとめたシートで シート名は 1~12 あります。 このシート名にも色付けするため下記マクロを追加したいのですが、1)のマクロとどう繋げばいいか分かりません。 Private Sub Workbook_Open() Dim sh As Worksheet     For Each sh In Worksheets         If isnumeric(sh.Name) Then             sh.Tab.ColorIndex = xlNone             If sh.Name = Month(Now) Then                 sh.Tab.Color = 255 ' 赤             End If         End If     Next End Sub 同じ Private Sub Workbook_Open() で始まるので丸められることが可能ならも含めていい方法を御指導いただけると幸甚です。 宜しくお願いします。

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

  • VBA 実行時エラー1004 

    初めまして。 VBA初心者です。 現在、あるセルの範囲に対して、1の数値が入っているなら 直線を引くマクロを作成中です。 実行すると「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」 と表示されます。 サイト等を見ながら、下記プログラムを書いてみました。 修正頂けると幸いです。解説も頂きたいです。 無茶苦茶なプログラムだと思いますが、 宜しくお願い致します。 Sub test01() Dim x As Range Dim c As Range Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single Set x = Range("D4:E9") For Each c In x If Worksheets("Sheet1").Range("c").Value = 1 Then X1 = Worksheets("Sheet1").Range("c").Left + Worksheets("Sheet1").Range("c").Width Y1 = Worksheets("Sheet1").Range("c").Top + Worksheets("Sheet1").Range("c").Height / 2 X2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Left Y2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Top + Worksheets("Sheet1").Range("c").Offset(0, 1).Height / 2 Worksheets("Sheet1").Shapes.AddLine X1, Y1, X2, Y2 End If Next c End Sub

  • 『実行時エラー'1001': 'Range'メソッドは失敗しました:'

    『実行時エラー'1001': 'Range'メソッドは失敗しました:'_Worksheet'オブジェクト』 先週から仕事に必要なためVBAの勉強を始めましたが、別シートへコピーする際などに上記のエラーが発生してしまい原因が分からず困っています。どこが間違っているのでしょうか?? 処理はデータが書かれているシートから作業用のシートにセル範囲を指定してコピーする、というものです。 なお、マクロ自体は別にマクロ用ファイルを作成し、そこのシートモジュールへ記述しています。 よろしくお願いします。 Sub test() '--------- 対象ファイルの呼び出し Dim MAIN As Workbook Dim ws As Worksheet Dim sh As String 'ファイルを呼び出す Call GetMAINFile Set MAIN = ActiveWorkbook Set ws = MAIN.Worksheets(1) sh = ws.Name '--------- 一時作業用TEMPシートの作成 Dim TEMP As Worksheet Worksheets.Add(after:=ws).Name = "TEMP" Set TEMP = Worksheets("TEMP") '--------- 対象シートから一時作業用TEMPシートへデータのコピー Dim x1, x2, y1, y2 As Integer x1 = 5 x2 = 10 y1 = 1 y2 = 4 ws.Range(Cells(x1, y1), Cells(x2, y2)).Copy _ Destination:=TEMP.Range(Cells.SpecialCells(xlLastCell).Row, 1) End Sub '--------- ファイル名を指定ダイアログの表示 Sub GetMAINFile() Dim NewBook As Workbook Dim OpenFileName As String OpenFileName = Application.GetOpenFilename() If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else Exit Sub End If End Sub

  • VBA どうしてなのでしょうか?

    どうしてなのかまったくわかりません… Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Activate Range("G5").Activate End Sub は良いのに Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Range("G5").Activate End Sub はエラーがでます… この理由をご存知の方いらっしゃいますか?? よかったら教えていただけませんか?

  • エクセルVBAで実行時エラー 91 が出ます

    エクセル2000です 各部署の棚卸を纏める為のVBAを作成しているのですが、実行時にエラーになってしまいます エラーメッセージは 「実行時エラー 91   オブジェクト変数またはWithブロック変数が設定されていません」 です ご教授お願いいたします Sub 棚卸() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("在庫集計票") Set sh2 = Worksheets("棚卸表") x = sh2.Range("A65536").End(xlUp).Row Z = sh1.Range("d2").Value ’部署番号 sh1.Range(Cells(5, Z), Cells(3000, Z)).ClearContents For i = 2 To x y = sh1.Range("A2:A" & Range("A2").End(xlDown).Row). _ Find(sh2.Cells(i, "a")).Row ’ここでエラーが発生します sh1.Cells(y, Z) = sh2.Cells(i, "c") Next i End Sub

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • VBA実行時のエラー

    下記のプログラムは私が作った物では無いのですが、作った方と連絡をとる事が出来なくなってしまった為、質問させて頂きます。 このプログラムをシートから実行した所 エラー:400『既にフォームは表示されています。モーダルにできません。』 なるものが表示されてしまいます。 またコードを記述する所から実行しますと 実行時エラー:1004『アプリケーション定義またはオブジェクト定義のエラー』 となってしまいます。 私の努力が足りないのは重々承知ですが、解決する事が出来ません。 皆様のお力を借りることが出来たらと思い投稿しました。 宜しくお願い致します。 Sub syoutotumen() Dim i As Long Dim j As Long Dim k As Long Dim kyori As Long Dim n As Integer n = 1 i = 1 j = 1 k = 1 Const cnsYEN = "\" Dim xlAPP As Application Dim objWBK As Workbook Dim strPATHNAME As String Dim strFILENAME As String strPATHNAME = "C:\Documents and Settings\tata41\デスクトップ\画像処理\" If strPATHNAME = "" Then Exit Sub strFILENAME = Dir(strPATHNAME & "dem******", vbNormal) If strFILENAME = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False .EnableEvents = Fales .EnableCancelKey = xlErrorHandler .Cursor = xlWait End With Set WS1 = Worksheets("sheet1") Range("A1") = "0" Range("A2") = "1" Range("A1:A2").Select Selection.AutoFill Destinaton:=Range("A1:A512") Do While strFILENAME <> "" DoEvents If swESC = True Then If MsgBox("ESCが押されました。ここで終了しますか?", vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_Exit Else swESC = False End If End If xlAPP.StatusBar = trFILENAME & "処理中..." Set objWBK = Workbooks.Open(Filename:=strPATHNAME & cnsYEN & strFILENAME, UpdateLinks:=False, ReadOnly:=True) Do If Cells(i, 2) = 255 Then Exit Do i = i + 1 Loop Do If Cells(j, 3) = 255 Then Exit Do j = j + 1 Loop Do If Cells(k, 4) = 255 Then Exit Do k = k + 1 Loop kyori = (i + j + k - 21) / 3 WS1.Cells(n, 2) = kyori n = n + 1 i = 1 j = 1 k = 1 objWBK.Close savechanges:=False strFILENAME = Dir Loop GoTo Button1_Click_Exit Button1_Click_ESC: If Err.Number = 18 Then swESC = True Resume ElseIf Err.Number = 1004 Then Resume Next Else MsgBox Err.Description End If Button1_Click_Exit: With xlAPP .StatusBar = False .ScreenUpdating = True .EnableEvents = True .EnableCancelKey = xlInterrupt .Cursur = xlDefault Set objWBK = Nothing Set xlAPP = Nothing End With End Sub

専門家に質問してみよう