- ベストアンサー
ExcelVBA SET Worksheetsで実行時エラー'438'が発生する理由について
- ExcelVBAのSET Worksheetsで実行時エラー'438'が発生する原因として、オブジェクトがこのプロパティまたはメソッドをサポートしていないためです。
- 具体的な箇所は、Set Worksheets(シート名) = 現状保存の部分です。
- このエラーが発生する理由は、シート名が存在しないか、正しく指定されていない可能性があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> もっと、根本的に > Set Worksheets(シート名) = 現状保存 > が、エラーに、なる理由に、ついて触れて ますよ。 >> ご承知の通り、Setステートメントは >> 「オブジェクト変数に変数(オブジェクト)を代入・格納する」 及び >> 「左辺を右辺に即して代入」 A1セルに「1」を入力するとき、 1 = Range("A1") とは書きませんよね? あるいは、整数型変数「i」にA1セルの値を代入するとき、 Range("A1") = i とすると、iの値がA1セルに入ってしまいますよね? ご提示の > Set Worksheets(シート名) = 現状保存← 此所です における左辺「Worksheets(シート名)」は"オブジェクト変数"ですか? 私にはオブジェクト「そのもの」であり、変数ではないように見えます。 ※「WorkSheets()」を変数として扱える手段があるのだとしたら、 私の知識不足による誤解としてご容赦ください。
その他の回答 (4)
- tsubu-yuki
- ベストアンサー率46% (179/386)
> 走らせる、際は入れて、頂けて … …ますよね? 至極当然です。 と言いたいところですが、走らせていません。 > ~~~中略~~~ とされているのですから、走らせようがありませんもんね。 ついでに言うと、添付された画像も拡大していません。 なので、走らせずともわかる範囲として >> これを見る限りの回答 としています。 ご承知の通り、Setステートメントは 「オブジェクト変数に変数(オブジェクト)を代入・格納する」 ことを目的に使います。 Setステートメントを使うのであればVBAの常識である 「左辺を右辺に即して代入」に則って Set オブジェクト変数 = 代入(格納)すべきオブジェクト とするのが一般的であり、質問中でご提示の通り、 > Dim 現状保存 As Worksheet, シート名 As String 「現状保存」をオブジェクト変数であると宣言していることを踏まえて、 わざわざ確認するまでもなく、先の回答 >> 逆ですよ。 >> Set 現状保存 = Worksheets(シート名) につなげたわけです。 さて、言い訳はこのくらいにして、本題。 > 私の、意図と、しては作業開始時保存した、 > 内容への書き戻しに、よる傍若無人な、程の不測の、消去 添付図を拡大して見てみましたし、質問の文章を読み返しても見ましたが、 (補足以外の)どこにもこの情報は無いですよね? マクロを動かしたあとの「元に戻す」と受け取って良いのであれば、 コピーして貼り付ける 現状保存.Cells.Copy Worksheets(シート名).Cells だけで済むと思うのですが、いかがでしょうか? ・・・と、見落としていました。 というか、補足を読んで気づきました。 私の記憶では Worksheets.Addしてやると、追加されたシートがアクティブになる だったと思うのですが・・・ > Set 現状保存 = Worksheets.Add() > Set Ws = Worksheets.Add() > (略) > Let シート名 = ActiveSheet.Name > Set 現状保存 = ActiveSheet この順番だと、オブジェクト変数「現状保存」には 追加された新規シートが格納されるような気がします。 文字列変数「シート名」にも新規シートの名前が格納されますね。 ・・・いや、違うな。 「現状保存」には、謎の変数「Ws」に格納された新規シートが、 「シート名」には、謎の変数「Ws」の名前が それぞれ格納されてしまいますね。 これで本当にいいのですか? 「Ws」が何なのかとりあえず無視し、 このマクロを走らせる時点で「元のシート」がアクティブだと信じて Let シート名 = ActiveSheet.Name ActiveSheet.Copy After:=Worksheets(Worksheets.Count) Set 現状保存 = ActiveSheet ' Set Ws = Worksheets.add ' 無視 の順番にしてやらないと「元に戻す」機能を成さない気がします。
お礼
有り難うございます 〉追加されたシートがアクティブになる あぁ!! 概念的に、見落として ました 有り難う御座います では、修正させてください Sub Main() Dim 現状保存 As Worksheet, シート名 As String Let シート名 = ActiveSheet.Name Application.ScreenUpdating = False Set 現状保存 = Worksheets.Add() Set Ws = Worksheets.Add() Application.ScreenUpdating = True Set 現状保存 = Worksheets(シート名) '~~~中略~~~ Set Worksheets(シート名) = 現状保存'← 此所です Application.DisplayAlerts = False 現状保存.Delete Ws.Delete Application.DisplayAlerts = True End Sub と、させてください 解り易い、ように もっと、短くすると Dim 現状保存 As Worksheet, シート名 As String Let シート名 = ActiveSheet.Name Set 現状保存 = Worksheets.Add() Set 現状保存 = Worksheets(シート名)'← 此処もかも? '~~~中略~~~ Set Worksheets(シート名) = 現状保存'← 此所です でも、此でも エラーに、なりませんか? もっと、根本的に Set Worksheets(シート名) = 現状保存 が、 エラーに、なる 理由に、ついて 触れて、頂けると 助かります 確かに、コピーでも いい かも、知れません が、 求めよ、さらば開かれん と、申します 求めを、辞めては いけない 正に、今 開かれよう と、する 世界も 閉ざした、まま に、なる と、 言う、意味 で、しょうか? 天使が 肩を、叩いて 新たな、扉の 向こうを、指差して 首根っこを、掴んで 引きずろう と、して 尚 肩を、うな垂れ ガックシ、している そんな、様が 見て取れそう、です 回避策も、良い の、ですが 是非、 何故、駄目か 知りたい の、です 宜しく お願い、します。
補足
何と、なく ですが Worksheets("シート名")の ポインタアドレスが、変えられないんだな 仮に、出来た と、しても 重複名を、許してない ので Set処理の 一連の、中の 名前処理が、出来ないんだな と、思いました なので、仕様上 Set、出来ない のかな? 恐らく Dim 現状保存1 As Worksheet. 現状保存2 As Worksheet. Dim シート名 As String Let シート名 = ActiveSheet.name Set 現状保存2=現状保存1 ' 可 Set 現状保存1=ActiveSheet ' 可 Set 現状保存1 = Worksheets(シート名) ' 可 Set Worksheets(シート名) = 現状保存1 '不可 Set ActiveSheet = 現状保存1 ' 可 ですかね? あと、例えば ポインタ先 ActiveSheet ← シート2 Set 現状保存 = Worksheets.ADD ← シート22 Set 現状保存 = ActiveSheet ← シート2 で、 保存に、なって ませんね Worksheet(シート名).copy After:=Worksheets.count Set 現状保存 = ActiveSheet とか、しないと 保存に、ならない かも? シート単位の、書き戻しは 依然、不明 所で cでは ポインタアドレスの、代入 の、他に 実体の、代入も 出来ました、よね? VBAでは、不可 ですか? と、此は 別スレッド、ですね 引き続き、ご解答を お待ち、しています て、いうか そろそろ 甘えすぎで 質問も、重ねて 来たし スレッド、変えた方が 良い、かな?
- tsubu-yuki
- ベストアンサー率46% (179/386)
> Dim 現状保存 As Worksheet, シート名 As String > (略) > Set Worksheets(シート名) = 現状保存← 此所です えーと・・変数の宣言は 「現状保存」 ⇒ ワークシート 「シート名」 ⇒ 文字列 ですもんね。 これを見る限りの回答をするとしたら・・ 逆ですよ。 Set 現状保存 = Worksheets(シート名)
お礼
有り難うございます 〉逆ですよ。 私の、意図 と、しては 作業開始時 保存した、内容への 書き戻しに、よる 傍若無人な、程の 不測の、消去 ですので データ、移動方向は 合って、いる と、思われる の、ですが 仕様上の、問題 とか で、しょうか? 何等かを、お預かりした 者 と、して 対象の、価値に ついて 疑わず、触れず、 例え、コピー で 未だ、大量に 作成できる、もの で、あろうと 唯一無二の、マスター と、して 扱う 此が 何かを、預かる 其の、際の 根底、根源、 足る、 信頼に、購う 行為 と 思って、います ので 基本と、弁えている 次第、です 是非、 実現、したい の、ですが 難しい で、しょうか?
補足
〉〉Set Worksheets(シート名) = 現状保存← 此所です 注釈に「'」を 入れて、ない の、ですが 走らせる、際は 入れて、頂けて … … ますよね?
- mdmp2
- ベストアンサー率55% (438/787)
No.1 です。 さきほどは全体を読まずに回答してしまいました。すみません。 ・~~~中略~~~の部分を削除して、実行してみました。たしかにその場所でエラーになります。ただ、中略の中に「現状保存」を操作する記述があると、中略の部分を除いて実行した結果がエラーになったとしても、もともとのコード実行のエラーとは違う理由かもしれません。さしつかえなければ中略の部分を補足したほうが良いのでは? ・Set Worksheets(シート名) = 現状保存 でどのような操作をするつもりなのでしょうか? ヘルプを見ると、Worksheets(シート名)は値の取得のみ可能となっています。一方、このコードの Set のに続く部分が、Worksheets(xx)=Worksheets(yy)の形になっていて、値の取得だけではないのが問題なのではないでしょうか?
お礼
有り難うございます 責任の、観点から VBA、動作中の 不測の、動作や、 不測の、人為介入を、 キャンセル、する ため コントロールを 渡された、瞬間の Worksheet状態を 新規作成した、Worksheetに 退避して、おいて 作業、終わりに 復元する、意図 です 此の、観点から 言えば 現状保存Worksheetは 隠蔽し、保護する もしくは、更に 本来の、対象は Sheet、 では、なく ブック丸ごと、 の、方が 本道 で、しょうが 今回は 其処まで、して いません ご理解 頂けますで、しょうか?
- mdmp2
- ベストアンサー率55% (438/787)
Set Worksheets(シート名) = 現状保存 "現状保存" としてみては、
お礼
早々のご対応 痛み入ります
お礼
有り難うございます やはり其処なのですね