Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


397 / 13645 ツリー ←次へ | 前へ→

【80573】Worksheet.Delete の動き 北浦 19/3/13(水) 15:18 質問[未読]
【80574】Re:Worksheet.Delete の動き よろずや 19/3/13(水) 20:08 発言[未読]
【80575】Re:Worksheet.Delete の動き マナ 19/3/13(水) 20:15 発言[未読]
【80579】Re:Worksheet.Delete の動き 北浦 19/3/14(木) 12:48 発言[未読]
【80584】Re:Worksheet.Delete の動き マナ 19/3/14(木) 22:49 発言[未読]
【80585】Re:Worksheet.Delete の動き 北浦 19/3/15(金) 8:53 回答[未読]
【80591】Re:Worksheet.Delete の動き マナ 19/3/15(金) 18:54 発言[未読]
【80619】Re:Worksheet.Delete の動き 北浦 19/3/19(火) 9:12 お礼[未読]

【80573】Worksheet.Delete の動き
質問  北浦  - 19/3/13(水) 15:18 -

引用なし
パスワード
   はじめまして。
現在、作成したマクロの動きを調査していて、
シート削除の以下の2つの動きが微妙に異なることに気づきました。
 a) Worksheets(1).Delete
 b) Sheet1.Delete
a:すぐにシートが削除され、VBEのプロジェクト内からも、すぐに無くなります。
b:すぐにシートが削除され、VBEのプロジェクト内は、処理終了後に無くなります。

また、以下のようにすると、
  Debug.Print Sheet1.Name
  Worksheets(1).Delete
上記bと同じ動きになります。
どうも、コード名を利用したのち、シートを削除すると、
プロジェクト内のオブジェクトは、処理終了後にしかなくならないようです。

すべてWorksheets(1)のような記述にすれば、解決するのは分かっているのですが
どうしてコード名を利用した処理の後にシートを削除すると、
プロジェクト内のオブジェクトは、処理終了後にしか無くならないのか、
理由を知りたいと思っています。

どなたか、ご教授いただけないでしょうか
よろしくお願いいたします。

動作環境
 OS: Windows 10 64ビット メモリ4GB
 Excel: Excel 2016 32ビット

【80574】Re:Worksheet.Delete の動き
発言  よろずや  - 19/3/13(水) 20:08 -

引用なし
パスワード
   コード名が書かれているプロジェクトで
そのコード名のオブジェクトを削除すると
プログラムエラーになってしまいます。(実行時エラー)

プログラム実行中にプログラムの状態が変わると
調子が悪いので、プログラム終了まで保持しているのでは。

【80575】Re:Worksheet.Delete の動き
発言  マナ  - 19/3/13(水) 20:15 -

引用なし
パスワード
   ▼北浦 さん:

回答はできないのですが、

そもそも、それで何か不都合があるのでしょうか?

【80579】Re:Worksheet.Delete の動き
発言  北浦  - 19/3/14(木) 12:48 -

引用なし
パスワード
   ▼よろずや さん:
レスありがとうございます。
やぱりそうなんですね

▼マナ さん:
レスありがとうございます。
実を言いますと、一部のシートをブックからエクスポートしたり
ブックにインポートしたりしています。

エクスポートは、ブック内のシート1つを別ブックで保存しており、
インポートは、ブック内にあるインポート対象シートを削除した後、
エクスポートしたシートを取込んでいます。

このインポートの際に問題が生じています。

インポートの処理としては
 シートの Delete コマンドで、インポート対象のシートを削除し、
 インポートするシートを Copy コマンドで取り込んでいます。

通常は、特に問題が起こらないのですが、
以下のように、
 Button1 で インポート対象シートのコード名を参照した処理を行い
 Button2 で、インポート処理を行うと、
  Delete コマンドで、シートのオブジェクトが残ってしまい
  Copy コマンドで、取り込んだシートのコード名が変わり
  処理終了後、Delete コマンドで削除したオブジェクトが消えてなくなります。
  結果、違うコード名で取り込んだような状態になります。

Sub Button1_Click()
  Debug.Print SHT.Name
End Sub

Sub Button2_Click()
  Call Import
End Sub

※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。

この後、コード名が変わっている為、別のプログラムでコード名を
参照している箇所で、エラーが発生します。

回避方法としては、インポート対象のシートに関して、
そのコード名を使用しないようにすればよいというのは、分かっているのですが、
この方法しかないのか、それ以外の方法があるのか探りたいと考えています。

よろしくお願いいたします。

【80584】Re:Worksheet.Delete の動き
発言  マナ  - 19/3/14(木) 22:49 -

引用なし
パスワード
   ▼北浦 さん:

>※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。

OnTime メソッドを使って、処理後に、
SHT1をSHTに変更してしまうのはだめでしょうか。

【80585】Re:Worksheet.Delete の動き
回答  北浦  - 19/3/15(金) 8:53 -

引用なし
パスワード
   ▼マナ さん:

>>※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。
>
>OnTime メソッドを使って、処理後に、
>SHT1をSHTに変更してしまうのはだめでしょうか。

通常、コード名は、実行時、値の取得しかできないため、変更できず、
無理矢理、VBProject.VBComponents からなら変更できるのですが、
「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」の設定を
しないといけなくなり、配布して使用する為、あまりやりたくない手法に
なってしまいます。

思い付きレベルでも構わないのでなんか考えられる方法があれば、
ご教授ください。

よろしくお願いいたします。

【80591】Re:Worksheet.Delete の動き
発言  マナ  - 19/3/15(金) 18:54 -

引用なし
パスワード
   ▼北浦 さん:

ontimeメソッドを使って、
シート削除後に、インポートではだめですか?

【80619】Re:Worksheet.Delete の動き
お礼  北浦  - 19/3/19(火) 9:12 -

引用なし
パスワード
   ▼マナ さん:

>ontimeメソッドを使って、
>シート削除後に、インポートではだめですか?

試してみました。おぉ!できました。
ありがとうございます。
ロジックに組み込んでみます。

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

397 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free