• ベストアンサー

EXCEL2007ではOKですが2003だとエラーになる

よろしくお願いします。 下記のコード(抜粋)がエクセル2007では全く問題なく動くのに、2003だとエラーになってしまうというもので困ってしまいました。 下記は二つのファイルの構成を比較して(OLDBOOKのシートをNEWBOOKと同じ構成にする)追加、削除、並び替えを行うというものです。 残念ながら、当方2003を持ってないので確認が出来ません。(当然配布は互換形式) 各配布先で試してもらったところ、2007のところは問題なし。2003のところはすべてエラーとなり、エラー箇所は抜粋している範囲のさらに2つのファイルを比較し、必要に応じて追加、削除を行う部分です。 Set shDst = OLDBOOK.Sheets(shSrc.Name) と Set shSrc = NEWBOOK.Sheets(shDst.Name) の部分で「454のオブジェクトエラー」となるとのことでした。原因は、そこにあると思いましたが、2007では問題ないので、何が悪いのかさっぱりです。どなたか助けて下さい。 Dim FIRSTBOOK As Workbook Dim OLDBOOK As Workbook Dim shSrc As Object Dim shDst As Object ~省略 ~ '現在の再計算モードの取得 iOldCalculation = Application.Calculation '再計算モードを手動に設定 Application.Calculation = xlManual '*****ここから比較***** ' // まず NEWBOOK.xls にあって OLDBOOK.xls にないシートをOLDBOOK.xls に複写 For Each shSrc In NEWBOOK.Sheets On Error Resume Next Set shDst = OLDBOOK.Sheets(shSrc.Name) On Error GoTo 0 If shDst Is Nothing Then shSrc.Copy After:=OLDBOOK.Sheets(OLDBOOK.Sheets.Count) End If Set shDst = Nothing Next ' // 続いてNEWBOOK.xls になくてOLDBOOK.xls にあるシートをOLDBOOK.xls から削除 For Each shDst In OLDBOOK.Sheets On Error Resume Next Set shSrc = NEWBOOK.Sheets(shDst.Name) On Error GoTo 0 If shSrc Is Nothing Then shDst.Delete End If Set shSrc = Nothing Next ' // シート並べ替え For Each shDst In OLDBOOK.Sheets shDst.Move Before:=OLDBOOK.Sheets(NEWBOOK.Sheets(shDst.Name).Index) shDst.Protect DrawingObjects:=True, Contents:=True, UserInterfaceOnly:=True Next '再計算モードの復元 Application.Calculation = iOldCalculation NEWBOOK.Close (False) '有無を言わずに保存せず閉じる ~省略 ~

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

解決したのであればいったん質問は閉じて新たな質問を投稿した方がいいように思います というのも、このまま続けていくと他の回答者の目に止まらないかも知れません 私よりもっとスマートなやり方をご存知の方がいる可能性もありますので > 配列を使わないで ・・・ の部分をもう少し掘り下げて質問した方がご希望により近い回答が得られそうですよ たとえば シートの並び順がこのようになっていて シートのIndexがこんな感じになっている これを これこれこのように並び替えたい といった 具体的な 元データ、希望する結果、現行のコードなどを明示しましょう また質問の際には 開発環境/実行環境などの情報もお忘れなく

yokokama46
質問者

お礼

すいません。今見ました。 そうですね。一旦閉じます。最後まで丁寧に助言頂き、有難うございます。またよろしくお願いします。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

全く同じではないですが 下記のコードで検証したところ 別段問題なく 2003/2007ともに時実行できました また インディエイトに表示されるのは 9 インデックスが有効範囲にありません。 といったメッセージです Option Explicit Sub Check()   Dim newWB As Workbook, oldWB As Workbook   Set newWB = Workbooks("NewBook.xls")   Set oldWB = Workbooks("OldBook.xls")   'Dim shSrc As Worksheet, shDst As Worksheet   Dim shSrc As Object, shDst As Object   Dim r As Range   newWB.Worksheets("Sheet1").UsedRange.Clear   Set r = newWB.Worksheets("Sheet1").Range("A1")   // OLDBOOKに無いものをコピー   For Each shSrc In newWB.Sheets     On Error GoTo ErrTrap     Set shDst = Nothing     Set shDst = oldWB.Worksheets(shSrc.Name)     On Error GoTo 0     r.Value = shSrc.Name     If shDst Is Nothing Then       r.Offset(0, 1).Value = shSrc.Name       shSrc.Copy after:=oldWB.Sheets(oldWB.Sheets.Count)     End If     Set r = r.Offset(1)   Next   Set r = r.Offset(1)   // NEWBOOKに無いものをコピー   For Each shSrc In oldWB.Sheets     On Error GoTo ErrTrap     Set shDst = Nothing     Set shDst = newWB.Worksheets(shSrc.Name)     On Error GoTo 0     r.Offset(0, 1).Value = shSrc.Name     If shDst Is Nothing Then       r.Value = shSrc.Name       shSrc.Copy after:=newWB.Sheets(newWB.Sheets.Count)     End If     Set r = r.Offset(1)   Next   Exit Sub ErrTrap: Debug.Print Err.Number, Err.Description Resume Next End Sub shSrc、shDstをWorkSheetで型指定しても動作は変わらずでした >「454のオブジェクトエラー」 の454って 何でしょう Err.Number ってことですか … そうなると相手はMACかなってことですが

yokokama46
質問者

お礼

原因が解りました。まったく別の問題で、メモリーの問題でした。シート数が約30枚を超えるとシートカウントが狂うようです。シートには数式がぎっしり詰まっており。それを配列処理させているので重くて途中からシートの認識が狂うようです。(今回のコードとは別にシートを貼り付けて行く作業で検証したところ ワークシートカウントが1から順次進み30の次に7になってしまう)←シート50枚あるにもかかわらず。 たまたま2003を使用している営業所は社員数(社員数分のシート数)が多いところでしたので、2007と2003の違い?と思い込んでしまいました。お騒がせいたしました。誠に申し訳ありません ' // まず NEWBOOK.xls にあって OLDBOOK.xls にないシートをOLDBOOK.xls に複写 For Each shSrc In NEWBOOK.Sheets On Error Resume Next Set shDst = OLDBOOK.Sheets(shSrc.Name) On Error GoTo 0 If shDst Is Nothing Then shSrc.Copy After:=OLDBOOK.Sheets(OLDBOOK.Sheets.Count) End If Set shDst = Nothing Next ' // 続いてNEWBOOK.xls になくてOLDBOOK.xls にあるシートをOLDBOOK.xls から削除 For Each shDst In OLDBOOK.Sheets On Error Resume Next Set shSrc = NEWBOOK.Sheets(shDst.Name) On Error GoTo 0 If shSrc Is Nothing Then shDst.Delete End If Set shSrc = Nothing Next ' // シート並べ替え For Each shDst In OLDBOOK.Sheets shDst.Move Before:=OLDBOOK.Sheets(NEWBOOK.Sheets(shDst.Name).Index) shDst.Protect DrawingObjects:=True, Contents:=True, UserInterfaceOnly:=True Next これと同じことを軽い処理(配列を使わず)にするにはどういうのが一番有効でしょうか?引き続き最初の質問とは変わってしまいましたがご教示願えませんか?

yokokama46
質問者

補足

redfox63さん ご返答ありがとうございます。 誤記入でした。454は424でした。すいません。今配布先が居ないので詳しくは解りませんが。実行時のオブジェクトエラーとデバック画面に出ると言っていたような気がします。 また、同じ会社の各営業所に送っているものなので、XPを使用していることは間違いありません。 そこで424のオブジェクトが無いというエラーならば、今回は、BOOKの中のSHEETが明示されていないということなのかと思うのですが、2007では認識されて動いているのになぜ?という疑問があるのです。どうも腑に落ちないのです。同じコードの同じ場所で2003を使用している各営業所のエクセルは同じ内容の実行時424エラーとなるし、2007はスルー。何故なんでしょうか? それとredfox63さんが検証された類似しているコードもこれから見させて頂きます。 よろしくお願いします。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

変数OLDBOOKとNEWBOOKに対してのセットの仕方がまずいとか? (当方も2007はもってなく憶測ですけど) 例えば比較する双方のBookが2003に対応していないとか。

yokokama46
質問者

補足

n-junさん、早速お相手して下さり有難うございます。 変数OLDBOOKとNEWBOOKについては、すでに省略してある部分で何度も使用していて問題なく来ていることと、今回の部分を追加(構成の比較及び整合化の部分)する前のものは半年位2003でも動かしてもらっていて問題なかったのですよ。 更に比較する2つのファイルは、この作業の中で作らせてたり、開いたりして、コードもこの部分までたどり着いて来ているので問題は無し(2003互換の .XLS 拡張子)なのですよ。問題の作業を追加前も同じ用にファイルを作成したり、開いたり、閉じたりしてきました。(2003で) なにより皆のパソコンで2007だと普通に動くし。でも2003だとダメだし。 なので今回の抜粋部分の追加の記入の仕方のどこかが2003だとまずいのかなぁ?という次第なんです。う~ん。助けて!

関連するQ&A

  • 追加の質問ですが、シートを一致させたい。

     昨日の質問(シートを配列に格納して比較)で解決したのですが、 欲が出てきました。前回は、NEWBOOKにあってOLDBOOKにないものを NEWBOOKからOLDBOOKに挿入し、OLDBOOKをNEWBOOKと同じく並び換えるという流れでした。(Ken-KenSPさんありがとう御座いました。)  今回は、更にNEWBOOKにないものをOLDBOOKから削除もしたいので、  シート追加のコードを逆に検索させ、Deleteにしてみましたが、消えません。よって並び替え時に数が合わないため(シートが合わない)エラーになってしまいます。  目的 OLDBOOKをNEWBOOKのシート構成と同じにするために(単に上書きではなく) NEWBOOKにあってOLDBOOKにないシートはNEWBOOKからOLDBOOKに挿入 OLDBOOKにあってNEWBOOKにないシートはOLDBOOKから削除 設定 NEWBOOKはコピー元 OLDBOOKはコピー先 shSrcはNEWBOOK内のシート shDstOLDBOOK内のシート ' // まず NEWBOOK.xls にあって OLDBOOK.xls にないシートを複写   For Each shSrc In wbSrc.Sheets     On Error Resume Next     Set shDst = wbDst.Sheets(shSrc.Name)     On Error GoTo 0     If shDst Is Nothing Then       shSrc.Copy After:=wbDst.Sheets(wbDst.Sheets.Count)     End If     Set shDst = Nothing    Next ' // 続いてOLDBOOK.xls にあって NEWBOOK.xls にないシートを削除 For Each shDst In OLDBOOK.Sheets On Error Resume Next Set shSrc = NEWBOOK.Sheets(shDst.Name) On Error GoTo 0 If shDst Is Nothing Then shDst.Delete End If Set shSrc = Nothing ' <---- 追加 Next   ' // シート並べ替え   For Each shDst In wbDst.Sheets     shDst.Move Before:=wbDst.Sheets(wbSrc.Sheets(shDst.Name).Index)   Next 上記のコードのDeleteのコードの変数の入れ方(元、先)があやしい以外はなさそうなので、試しましたが、やっぱり助けて下さい。

  • 配列処理を遅くてもよいので軽い処理に変えたい。

     よろしくお願いします。  抜粋のコードをメモリーに負荷をかけない処理に変えたいのです。  下記は二つのファイルの構成を比較して(OLDBOOKのシートをNEWBOOKと同じ構成にする)追加、削除、並び替えを行うというものです。 しかし、メモリーの問題でシート数が30を超えると(環境によっては40枚位まではOK)Sheets.Countが狂い結果エラーに結び付くのです。 そこで、メモリーの負担を軽くするため、一気に配列に呼び込むのではなく、遅くなってもいいので、一つずつ比較するやりかたをご教示願えないかという次第です。  なお補足ですが、シートは関数などがぎっしり書き込まれているので、重いものなのです。それをBOOKに出来れば100枚位まで入るようにしたいのです。  ネット上で「一つのBOOKに何枚までシートを挿入出来るか?」というのを見ましたが、やはりメモリーに依存し(物理メモリーではなく)空のシートなら65000枚とかまででもOKですが、重いシートだと30枚位からダメになるとありましたので、実は今回の省略の前の部分でシートをCopy Afterで別BOOKに追加していくという形が有ったのですがここでもエラーでした。その内容はやはりSheets.Countが30を過ぎたら狂い(50枚入れる指示にもかかわらず31枚目を挿入時、シートカウントが7とかに戻ってしまう)そこで必要な枚数をCopy Afterで挿入して行かずに、先に空シートを必要な枚数作らせたBOOKのシートをまとめて、今回のシートを貼り付ける作業に変えたところ、100枚でもOKになり、そこはクリアしたのですが、今回の抜粋の所で引っかかってしまいました。 同じように遅くなっても軽い処理に下記コードを直したいのです。助けて下さい。 Dim NEWBOOK As Workbook Dim OLDBOOK As Workbook Dim shSrc As Object Dim shDst As Object ~省略 ~ '現在の再計算モードの取得 iOldCalculation = Application.Calculation '再計算モードを手動に設定 Application.Calculation = xlManual '*****ここから比較***** ' // まず NEWBOOK にあって OLDBOOK にないシートをOLDBOOK に複写 For Each shSrc In NEWBOOK.Sheets On Error Resume Next Set shDst = OLDBOOK.Sheets(shSrc.Name) On Error GoTo 0 If shDst Is Nothing Then shSrc.Copy After:=OLDBOOK.Sheets(OLDBOOK.Sheets.Count)   ←ここで実行時エラー(1004 コピー先の行数が足りないため~) End If Set shDst = Nothing Next ' // 続いてNEWBOOK になくてOLDBOOK にあるシートをOLDBOOK から削除 For Each shDst In OLDBOOK.Sheets On Error Resume Next Set shSrc = NEWBOOK.Sheets(shDst.Name) On Error GoTo 0 If shSrc Is Nothing Then shDst.Delete End If Set shSrc = Nothing Next ' // シート並べ替え For Each shDst In OLDBOOK.Sheets shDst.Move Before:=OLDBOOK.Sheets(NEWBOOK.Sheets(shDst.Name).Index) shDst.Protect DrawingObjects:=True, Contents:=True, UserInterfaceOnly:=True Next '再計算モードの復元 Application.Calculation = iOldCalculation NEWBOOK.Close (False) '有無を言わずに保存せず閉じる ~省略 ~

  • VBAであるBOOKの「sample」というシートを別BOOKに

    VBAであるBOOKの「sample」というシートを別BOOKに 別Bookにコピーしたいのですが、 ネットを参考にして下記のようにするとエラーになります。 実行時エラー'9' 「インデックスが有効範囲にありません」 と表示されます。 どこが間違っているでしょうか? どなたか教えてください。 ---------------------------------------- Dim NewBook As Workbook Dim fName As String Set NewBook = Workbooks.Add fName = ThisWorkbook.Path & "cp.xls" NewBook.SaveAs Filename:=fName Workbooks("moto.xls").Sheets("ピッキング").Cells.Copy Workbooks(fName).Sheets("Sheet1").Paste Destination:=Cells(1, 1) '<---ここでエラー Workbooks(fName).Save ----------------------------------------

  • 保護されたブックのコピーについて

    現在、ボタンを押すと新規ブックが作成され、最初のブックのシートをコピーするというマクロを組みました。 しかし、元になるブックにはブックの保護とシートの保護を両方かけていて、途中でエラーになるはずなのですが、何故かそうならずに普通に新規ブックにコピーがされます。 上手くいったのですがエラーが出ると予想していたので気持ちが悪く、また個人だけで使うわけじゃないので原因を知っておきたいです。 どなたかよろしくお願いします。 Private Sub makeBookButton_Click() Dim myWorkBook As String Dim newWorkBook As String Dim mySheet As Worksheet Application.ScreenUpdating = False On Error GoTo ErrTrap Application.DisplayAlerts = False myWorkBook = ThisWorkbook.Name Workbooks.Add ActiveWorkbook.SaveAs Filename:=NEWBOOK newWorkBook = ActiveWorkbook.Name Workbooks(myWorkBook).Activate For Each mySheet In ThisWorkbook.Worksheets Workbooks(myWorkBook).Sheets(mySheet.Name).copy after:=Workbooks(newWorkBook).Sheets(Workbooks(newWorkBook).Sheets.Count) Next Workbooks(NEWBOOK).Sheets("Sheet1").Delete Workbooks(NEWBOOK).Sheets("Sheet2").Delete Workbooks(NEWBOOK).Sheets("Sheet3").Delete Application.DisplayAlerts = True Application.ScreenUpdating = True Exit Sub ErrTrap: Call MsgBox("ブック作成時にエラーが発生しました。", vbCritical) End Sub

  • マクロでファイル名を指定して保存する際にエラー

    「全データ」というシートをマクロでファイル名に「伝票+実行時の日付・時間]をいれてCSV形式で保存したいと思い、 一度マクロを登録してみたのですが、途中でエラーが発生しうまくいきません。 「"」や「&」の付け方に問題があるかと思い、いろいろなパターンで試しましたが同様です。 修正記述がお分かりの方がいらっしゃいましたら、お言葉をいただけると幸いです。 宜しくお願いいたします。 ------------------------------------------------------------------------------------- Sheets("全データ").Select Dim file As Variant Dim NewBook As Workbook Dim NowSheet As Worksheet Set NowSheet = ActiveSheet file = Application.GetSaveAsFilename("伝票" & Now, "yy-mm-dd-hh-mm" & ".csv", "CSVカンマ区切り形式 (*.csv), *.csv") If file = False Then Exit Sub  ←ここでエラー2015が発生 Set NewBook = Workbooks.Add NowSheet.Copy before:=NewBook.Worksheets(1) On Error Resume Next NewBook.Worksheets(1).SaveAs Filename:=file, FileFormat:=xlCSV On Error GoTo 0 Application.DisplayAlerts = False NewBook.Close Application.DisplayAlerts = True NowSheet.Activate   End Sub

  • 図形のクリアで実行時の1004エラーになる

     指定範囲(I9:CW40)から図形(円・四角形)のクリアをするとエラーになってしまいます。終了をすればクリアはできるのですが。御教授願えませんでしようか?(尚四角形はセルの枠線上に貼り付けるようにしてあります。) Sub 図形のクリア() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim myRng As Range Dim sp As Variant Set myRng = Range("I9:CW40") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then sp.Delete (ここで実行時1004のエラーになる。) End If Next Set myRng = Nothing Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • EXCEL VBA エラーメッセージ「「Moveメソッドに失敗しました」の対応方法

    いつも拝見しています。 あるブック(A.xls)にある10個のシートのうち"Sheet1"以外のシートを別のブック(B.xls)に移動しようとしたところ「Moveメソッドに失敗しました」とエラーが出てしまいました。 何が原因なのか見当がつきません。 このメッセージを過去ご覧になった方がいらっしゃいましたら、どのように対応されたか教えてください。よろしくお願いします。 以下が考え中のソースです。///////////////////// 'ケースに移動する(今はコピー) Dim cnt As Integer cnt = 0 For Each pWS In Workbooks("A.xls").Worksheets If pWS.Name <> "Sheet1" Then pWS.Move after:=Workbooks("B.xls").Sheets(cnt+1) cnt = cnt + 1 End If Next

  • TextToDisplayがうまく出来ない。

    シートの中の全てのハイパーリンクのアドレスとテキストを新シートに一覧で書き出すマクロを作ってるのですが、詰みました。 例えば、http://oshiete.goo.ne.jp/をctrl+A→ctrl+Cで、全体をコピーして エクセルのシートに貼り付けます。(添付画像参照) そうした状態で、 ///////////////////////////////////////////////////////// Sub test() Dim h As Hyperlink Dim MyRow As Long Dim StrURL As String Dim StrTEXT As String Dim MyBook As Workbook Dim NewBook As Workbook Debug.Print ActiveSheet.Hyperlinks.Count Set MyBook = ActiveWorkbook Set NewBook = Workbooks.Add 'ブックを挿入したらアクティブになってしまう MyRow = 1 For Each h In MyBook.ActiveSheet.Hyperlinks StrURL = h.Address 'アドレスを抜き出す If IsNull(h.TextToDisplay) = True Then StrTEXT = "" Else StrTEXT = h.TextToDisplay '表示文字を抜き出す End If NewBook.Activate '新ブックをアクティブにする Cells(MyRow, 1) = StrURL Cells(MyRow, 2) = StrTEXT MyRow = MyRow + 1 Next Set MyBook = Nothing Set NewBook = Nothing End Sub ///////////////////////////////////////////////////////// を実行してるのですが、h.TextToDisplayが空白の時?値がエラーの時?に、 実行時エラー ’-2147467259(800004005)': 'TextToDisplay'メソッドは失敗しました:'Hyperlink'オブジェクト となってしまいます。 If IsNull(h.TextToDisplay) = True Then をすれば回避できると思いましたが、ダメでした。 なんでこのエラーになるのかと、このエラーを回避する方法を教えてください。 ご回答よろしくお願いします。

  • マクロエラー 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

  • 複数シートをブックにするマクロを応用して。。

    1ブック内にyymmdd(日付)シートが多数あり、それを月別yymmごとブックを作成するマクロです。 これは以前、回答して頂いた「n-jun」さんの構文です(n-junさん、重宝しています、感謝!) Private Sub CommandButton1_Click() Dim myDic As Object Dim wb1 As Workbook Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim myKey Set myDic = CreateObject("Scripting.Dictionary") Set wb1 = ThisWorkbook Application.ScreenUpdating = False For Each sh In wb1.Worksheets myDic(Left(sh.Name, 4) & "_") = Empty Next For Each myKey In myDic.keys For Each sh In wb1.Worksheets If InStr(sh.Name, Left(myKey, 4)) > 0 Then If wb Is Nothing Then wb1.Worksheets(sh.Name).Copy Set wb = ActiveWorkbook Else wb1.Worksheets(sh.Name).Copy after:=wb.Sheets(wb.Sheets.Count) End If End If Next Application.DisplayAlerts = False wb.SaveAs Filename:="C:\仕事\月別" & "\" & Left(myKey, 4) & ".xls" wb.Close Set wb = Nothing Application.DisplayAlerts = True Next Application.ScreenUpdating = True Set myDic = Nothing Worksheets("main").Activate MsgBox "出力完了" End Sub 実は、これをフォルダ内のブックの場合は? として応用ができないか悩んでいます。 つまり、フォルダ内にyymmddブックが多数あり、 これを月別yymmとして、それぞれまとめたいのです。 Set wb1 = ThisWorkbookの箇所が、 フォルダ内のブック指定になると思うのですが、 下記コードでどうなんでしょうか?動きません。 myfdr = "C:\仕事\月別" fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 Set wb1 = Workbooks.Open(myfdr & "\" & fname) 変更箇所、アドバイス頂ければ助かります。お願いします