[[20100323162045]] 『VBAマクロエラーWorksheetクラスのselectメソッド』(フミ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAマクロエラーWorksheetクラスのselectメソッド』(フミ)20100323

端末からデータを抽出させるものに加える形で、データの形成を行うマクロを組んでいます。
データを加工させるマクロ起動の後、「Worksheetクラスのselectメソッドが失敗しました」とのメッセージが出て保存がされず作業が止まります。

いろいろ修正を加えてみましたが解消しません。何が間違っているのでしょうか?そのマクロを記載します。

    Sheets("売上明細表 (2)").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("売上集計表").Select
    Range("A1:C1").Select
    ActiveWorkbook.Save

アドバイスよろしくお願いします。

使用環境:Excel2000、WindowsXP


 売上明細表 (2)シートが非表示の状態でマクロ実行をしているから?
 (てつろう)

 こんばんわ。。

 >Sheets("売上集計表").Select
 この行が黄色になっている?なら、、
 Sheets("売上集計表")が「非表示」なのでは。。
 (kei)


 (フミ)です。

●てつろうさん

アドバイスありがとうございます。
"売上明細表 (2)"シートは一連の作業を終えてから非表示にしてるんですけどね。

●keiさん

これまでエラーは黄色になっていましたが、最近ならないので分かりにくいんです。
"売上集計表"は最後まで非表示にはしないシートなんです^^;

ちなみに、これらのマクロの後には、別で開いているエクセルブックに移動(Active)して、そのエクセルブックを閉じるというマクロが続きます。


 >"売上明細表 (2)"シートは一連の作業を終えてから非表示にしてるんですけどね。
 一連の作業?
 提示されているコードでは、 "売上明細表 (2)"シートを選択後、すぐに非表示にしてますけど
 それが一連の作業ということでしょうか?

 >>売上明細表 (2)シートが非表示の状態でマクロ実行をしているから?
 と、書かせて頂いたのは、提示されているコードでは"売上明細表 (2)"シートを
 再表示しているコードがないためそのように書きました。
 提示のコードのみですと、1回目のマクロ実行で"売上明細表 (2)"シートが非表示になり
 2回目のマクロ実行で"売上明細表 (2)"シートが非表示状態で選択しようとして
 エラーとなるのかな?と思いました。

 あと、提示されているコードのどこでエラーが出ているのか明記された方がいいと思います。

 それと、ここの掲示板の使い方ですけど
 ←行頭を半角スペースで始めると書き込みの改行位置が反映されます。

 (てつろう)


 >"売上明細表 (2)"シートは一連の作業を終えてから非表示にしてるんですけどね。
 このコードより前に、いろいろやってるってことですね。失礼しました。

 "売上明細表 (2)"シートを表示するコード、または表示状態かチェックするコード
 はなくてよいのでしょうか?
 シートが非表示の状態でSheets("売上明細表 (2)").Select
 ってするとエラーになります。

 (てつろう)

(フミ)です

 >てつろうさん

 アドバイスありがとうございます。
 そうです。記載したコードより前にたくさんの作業をしています。
 "売上明細表 (2)"シートはシートのコピーがされてあらかじめ表示されているものですので、あえて表示するマクロは記入していないんですけれど。必要でしょうか。
 「どこまでか」⇒ ActiveWindow.SelectedSheets.Visible = False ここまでできて、 Sheets("売上集計表").Select ここからできません。

 作業を通常言語で書くと、
 ・"売上明細表 (2)"シートを選択。
 ・"売上明細表 (2)"シートを非表示。
 ・"売上集計表"シートの"A1:C1"セルを選択。
 ・ブックを保存。
 ・他で開いている特定のブックを選択。
 ・そのブックを閉じる。
 以上です。

 >"売上明細表 (2)"シートはシートのコピーがされてあらかじめ表示されているものですので、あえて表示するマクロは記入していないんですけれど。必要でしょうか。
 何度もマクロ実行すると、シートコピーされて、"売上明細表 (3)"、(4)、(5)・・・にはならず、"売上明細表 (2)"シートは必ず表示されているのであれば必要無いでしょう。

 >Sheets("売上集計表").Select
 ここで、「Worksheetクラスのselectメソッドが失敗しました」のエラーが出るのですか?
 (てつろう)

 てつろうさんの意見は、

    Sheets("売上明細表 (2)").Select
    ActiveWindow.SelectedSheets.Visible = False ←ここで"売上明細表 (2)"を非表示
    Sheets("売上集計表").Select
    Range("A1:C1").Select
    ActiveWorkbook.Save  ←そのまま保存しています

 つまり、次回このファイルを開くと"売上明細表 (2)"は、非表示の状態です。
 そのまま上記のマクロを実行するとエラーになりませんか?
 (kei)

 keiさん、わかりやすくフォローしていただきありがとうございます^^
 (てつろう)

(フミ)です

 >てつろうさん
 アドバイスありがとうござます。
  Sheets("売上集計表").Selectが実行されずにエラーになります。

 >keiさん
 アドバイスありがとうございます。
  おっしゃておられる意味がよくわかりました。
 マクロそのものは別のブックに登録されていて、常に何もないところからスタートで新しいエクセルブックに結果を表示させることしていますので、マクロ起動時は必ず"売上明細表 (2)"は存在しません。

  他にも、不要なシートを削除した後に保存させたいのですが、シートを削除すると、「削除したら戻せません」のメッセージが出ますが、そのメッセージ部分で手動で[OK]ボタンを押さないといけなくなるため、あえてシートの非表示にしています。("売上明細表 (2)"については、ピボットテーブルにつなげているため削除はしませんが)

 お忙しいのにありがとうございます。

 Sheets("売上集計表").Selectの前に
 Sheets("売上集計表").Visible = Trueを追加しても
  「Woorksheetクラスのselectメソッドが失敗しました」のエラーが出ますか?

 (てつろう)

 少しお邪魔しますね。

 コード全体を載せてもらうのが一番早いように思います。
 推測の部分が多すぎるので。

 >シートを削除すると、「削除したら戻せません」のメッセージが出ますが・・・
 は、Application.DisplayAlertsを制御すれば済みますし
 場合によってはシートをSelectしなくても良いかもしれません。

 作ったシートを保存するときに邪魔なシートを消す事がそもそもの原因なら
 作ったシートを新規ブックにMoveして保存すれば済みますし。

 処理の全体像によって色々な方法があると思いますよ?
 (momo)

(フミ)です

 >てつろうさん
 アドバイスありがとうござます。
 Sheets("売上集計表").Visible = Trueを追加してもエラー出ます。
 この方法は、ネットで検索して書いてあったので試してみました。今も念のためしてみたのですが、できませんでした。
 あえて、開いているシートを「開く」という命令をして確かとするみたいな。
 端末データを落とすために、他に多くのマクロを組んでいるからかもしれませんね。。

 >momoさん

 アドバイスありがとうございます。
 マクロはかなり大量のものです。全部載せることはできません。
 ここで解決できれば嬉しいですが、何かのヒントでも得られれば助かりますのでありがたいです。

 意味合いが変わってしまいますけど
 Sheets("売上集計表").Select
       ↓
 Sheets("売上集計表").activate
 に変更して、フミさんが望む動作になりますか?

 開示できる情報が少ないようなので、これで最後かも・・・
 (てつろう)

(ふみ)です

 >てつろうさん

 アドバイスありがとうございます。
 最初、「.activate」だったんですよ。
 でも、考えてみると「.Select」だなぁと思いそうしたんですよ。

 もっとマクロを掲載してもよいですが、かなりになりますからね。
 ありがとうございます。

  Application.Goto reference:=Sheets("売上集計表").Range("A1:C1"), Scroll:=True
ためしにこのようなコードでジャンプしてみるとか。
(みやほりん)

 実際のコード全部が無理なら
 現象を再現できる最小限のコードを提示していただけませんか。

 >マクロはかなり大量のものです。全部載せることはできません。

 実際どのくらいのコードなのでしょう?
 大量というと・・・5000行くらいですかね?(私の感覚)
 見たところ、マクロ記録で得られたコードをメインにして作られているようですが
 1つのプロシージャでここに載せられないくらいの行数だとしたら
 そもそもコーディングに問題があるかもしれません。

 ここまでのこのスレッドのやりとりだけで130行くらいでしょうか
 推測だけで解決に進むよりも、全体がある程度見えるだけのコードでも
 載せた方が解決への糸口が掴めると思いますけど。

 回答者の方々の推測力にも限界があると思いますので。

 (momo)

 >最初、「.activate」だったんですよ。
 >でも、考えてみると「.Select」だなぁと思いそうしたんですよ。
 結局、「.activate」じゃだめだったのか、それとも、「.select」じゃないと
 だめなんだ!ってことで試されてないのかわかりませんね・・・

 >端末データを落とすために、他に多くのマクロを組んでいるからかもしれませんね。。
 >もっとマクロを掲載してもよいですが、かなりになりますからね。
 ってことで、追加情報なしみたいなので限界かもですね。
 (てつろう)

 エラーは100%おきるのでしょうか?

 1.
 ご提示のコードの部分の上に
 Stop を入れて一旦この前でコードの実行を停止して
 [F8]キーを押しながら、ゆっくり確認してみられてはどうでしょう?

 2.
 また、ご提示のコードの部分を単独で Sub 〜 End Sub に入れて
 エラーになるか確認する。

 これでエラーに成るなら、もっと減らして
 「Sheets("売上集計表").Select」単独でエラーになるか確認。

 エラーに成らない場合は、少しずつ上側のコードを増やしながら
 エラーが発生するまで繰り返し確認する。

 何の処理を追加した時点でエラーに成るのか見極める。

 等、確かめてみられてはどうでしょう。

 >これまでエラーは黄色になっていましたが、最近ならないので分かりにくいんです。 
 コードはどこに書いてあるのですかね。。。

 (HANA)

(ふみ)です

 皆様アドバイスありがとうございます。
  全マクロは、データサーバーから必要データのみをエクセルに抽出するマクロに、
 その後の加工作業を加えた複雑かつ専門家が見ればおかしくややこしいマクロにな
 っていると思います。

 もう一度、最初から加工を加えていない状態でこれまでの皆様のアドバイスを加味し、
 組みなおしてみたいと思います。
 またご報告させていただきます。
 お世話になりありがとうございます。

(ふみ)です
 おはようございます。
 上記本題の件は、いろいろ試行錯誤中です。
 またうまくいかない場合は、全てのマクロを公開させてもらいます。

 >てつろうさん
 「.activate」も「.select」も両方共実際にしてみました。

 >HANAさん
  >これまでエラーは黄色になっていましたが、最近ならないので分かりにくいんです。 
 コードはどこに書いてあるのですかね。。。
 ⇒Module1に書いています。エラーを起こした時に、{[終了]・[テバッグ]}の選択表示がされる時は[テバッグ]ボタンを押せば黄色になりますが、「Worksheetクラスのselectメソッドが失敗しました」の表示の際は[OK]ボタンのみで停止するため黄色になりません。

  同じマクロですが、別案件での質問ですが、ピボットテーブルをマクロにする場合、
 既存の白紙シート(Sheet3)の指定したセルを左上肩にしたピボット表を作りたいので
 すが、うまく作動しません。なぜでしょうか。マクロを載せます。

    Sheets("売上明細表 (2)").Select
    Range("A2").Select
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "'売上明細表 (2)'!R2C1:R600C16").CreatePivotTable TableDestination:="Sheet3!R3C1", _
        TableName:="ピボットテーブル1"
    ActiveSheet.PivotTables("ピボットテーブル1").SmallGrid = False
    ActiveSheet.PivotTables("ピボットテーブル1").AddFields ColumnFields:="仮"
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("金  額")
        .Orientation = xlDataField
        .Caption = "合計 : 金  額"
        .Function = xlSum
    End With

 また、同じシートに種類の異なるピボット表を3つ作る予定です。
 アドバイスばかりお願いして申し訳ありませんが、よろしくお願いします。

 >「.activate」も「.select」も両方共実際にしてみました。
 で、結果はどうだったのでしょうか?
 activateにしても、「Worksheetクラスのselectメソッドが失敗しました」
 こんな感じのエラーになってしまうのですか?
 それともエラーがでなくなり動いたのですか?

 >同じマクロですが、別案件での質問ですが、・・・・・・・
 同じマクロ?
 別案件なのであれば、新しくスレッドを立てた方がよいかと思いますよ。

 (てつろう)

(ふみ)です

 >てつろうさん
 アドバイスありがとうございます。
 「.activate」も「.select」も両方同じく「Worksheetクラスのselectメソッドが失敗しました」のエラーメッセージが出ました。

 「同じマクロ」というのは、このマクロを組んだ中で起きた事象ということです。
 別スレッドを立てた方がよいのですね。

 >コードはどこに書いてあるのですかね。。。
 >⇒Module1に書いています。
 >「Worksheetクラスのselectメソッドが失敗しました」の表示の際は
 >[OK]ボタンのみで停止するため黄色になりません。

 と言う事ですが、前後で強制的に何かエラーを出した場合は
 [デバッグ]ボタンも有るウィンドウが表示されるのでしょうか?

 また、関係ないかも知れませんが コード内にエラートラップ
 (On Error ・・・)は有りませんか?

 それと、整理できる所はご自身で整理してから質問されるのが良いと思います。
 コードだけでなく、そのコードを動かしてエラーになる環境も教えて下さい。

 とは言え、実際のデータは大きいでしょうから
  1.説明用の小さなサンプルデータを作成する
  2.それを使って、同じ様な処理を行うコードを作成する
 そのコードがエラーになる場合は
  ●どのシートに、どの様なサンプルデータを作成したのか
     ↓の様に分かりやすく。
	[A]	[B]	[C]	[D]	[E]	[F]
[1]						
[2]						
[3]						
[4]						
[5]						
[6]						
  ●他に何のシートが必要なのか
  ●実行して確かにエラーに成ったコード
       Sub 〜 End Sub 迄揃った形で。
  ●何処でどの様なエラーになるのか
  ●コードは何処に貼り付けて実行するのか
  ●その他、特記事項

 と、ご説明通りに操作を行った場合
 同じ様にエラーになる情報を載せて下さい。
 考えて下さる方も多くなると思いますよ。

 確かに、一連のコード内の事かもしれませんが
 パーツ毎にコードの作成を考えてみられてはどうでしょう。

 当初の御質問も、まずはパーツを分けて
 動きを確認するのが良いと思います。

 >作業を通常言語で書くと、
 >・"売上明細表 (2)"シートを選択。
 >・"売上明細表 (2)"シートを非表示。
 >・"売上集計表"シートの"A1:C1"セルを選択。
 >・ブックを保存。
 >・他で開いている特定のブックを選択。
 >・そのブックを閉じる。
 >以上です。 
 このパーツだけでも、エラーが発生するのか。
 この部分だけなら、エラーは発生しないのか。

 後者だった場合、いくらこの部分のコードを眺めても
 問題は解決しませんね。
  ですが、これまでのご説明からは
  前者だったのか、後者だったのか、試していないのか
  分かりません。

 スレを分けた方が良い場合と、分けない方が良い場合と色々有るとは思います。
 ただ、実際のコードに組み込む前のテスト段階として
 小さなサンプルデータで同じ様なピボットテーブルを作るコードを
 作成して、見ておかれるのが良いのではないかと思います。

 そして、このスレは既に少し長いので
 ピボットテーブルに関する事は
 一連の処理の内の一部として使いたい事を明記しておいて
 新しい質問にしても良いと思います。
   当初の質問が解決しているならまだしも。。。

 (HANA)

(ふみ)です。

 皆様、しばらくです。
 お返事が遅くなり申し訳ありません。
  前回の書き込み以来、本件の「VBAマクロエラー」について、最初からエクセル操作
 によるマクロ作成を再度やってみた結果、同じ動作をしているにも関わらずエラーがな
 くなりました。
  原因はつかめていませんが、ひとつ言えるとすれば書き込みで少し触れました、ピボ
 ットテーブルをVBA登録した時にうまくいかないために、自分でマクロを修正した時に
 誤って「存在しないシート名」等をつけてしまったためエラーになったものかもしれま
 せん。ただ、それにしてもエラーを起こした場所のシート名は間違ってはいなかったの
 ですけれど!シートをコピーすると次にできるシートは「○○-半角スペース-(2)」となり
 ます。これを本件以降で修正を加えていく過程で半角スペースを入れるのを忘れたことは
 ありました。

  また、ピボットテーブルについての報告ですが、完成形は、
 「3種類のピボットテーブルの結果を1つのシートに横並べする」動作をマクロ化したい
 ものでした。
 エクセル操作によるマクロ作成で登録すると下記のようになります。
 白紙のシート(Sheet3)に結果を置きたいのに、マクロではシートの指定する部分があり
 ません。

    Sheets("売上明細表").Select
    Range("A2").Select
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "売上明細表!R2C1:R600C16").CreatePivotTable TableDestination:=Range("A3"), _
        TableName:="ピボットテーブル1"
    ActiveSheet.PivotTables("ピボットテーブル1").SmallGrid = False
    ActiveSheet.PivotTables("ピボットテーブル1").AddFields ColumnFields:="区分"
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("金  額")
        .Orientation = xlDataField
        .Caption = "合計 : 金  額"
        .Function = xlSum
    End With
    Range("D4").Select
    Selection.Delete
    Range("A3").Select
    Application.CommandBars("PivotTable").Visible = False

 それを、知人の手を借りて作ってもらったマクロから使える部分を抜いた上で、修正を加
 え、下記のようにして完成させました。

    Range("A2").Select

    ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _
        "'売上明細表 (2)'!R2C1:R600C16", TableDestination:="Sheet3!R3C1", TableName:= _
        "ピボットテーブル1"
    ActiveSheet.PivotTables("ピボットテーブル1").AddFields _
        ColumnFields:="区分"
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("金  額")
        .Orientation = xlDataField
        .Name = "合計 : 金  額"
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("区分")
        .PivotItems("(空白)").Visible = False
    End With

  本件の原因については、根本的な解決にはなりませんでしたが、98%完成(2%は不満残)
 しましたので完了とします。
  本当、エクセルそしてマクロは奥が深いです。特にマクロ全体として関連があり、ひと
 つが解決しても別のところからの影響でエラーが発生します。日々勉強ですね。

  この度は、本件について皆様から上記のように様々なアドバイスをいただき、面倒をみ
 ていただいたことに感謝しています。この画面を印刷して大切に保管したいと思います。

  本当にありがとうございました。

     完了

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.