Excel VBA質問箱 IV

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

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


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

【49444】Newキーワードの使用法について Lindy 07/6/5(火) 11:23 質問[未読]
【49445】Re:Newキーワードの使用法について ハチ 07/6/5(火) 12:34 発言[未読]
【49446】Re:Newキーワードの使用法について Lindy 07/6/5(火) 13:19 お礼[未読]
【49447】Re:Newキーワードの使用法について Lindy 07/6/5(火) 14:13 質問[未読]
【49448】Re:Newキーワードの使用法について neptune 07/6/5(火) 14:16 回答[未読]
【49450】Re:Newキーワードの使用法について Lindy 07/6/5(火) 14:34 お礼[未読]
【49458】Re:Newキーワードの使用法について Kein 07/6/5(火) 18:02 発言[未読]
【49478】Re:Newキーワードの使用法について Lindy 07/6/6(水) 9:41 お礼[未読]
【49449】Re:Newキーワードの使用法について neptune 07/6/5(火) 14:18 発言[未読]
【49467】Re:Newキーワードの使用法について ichinose 07/6/5(火) 22:07 発言[未読]
【49474】Re:Newキーワードの使用法について 追伸 ichinose 07/6/6(水) 7:09 発言[未読]
【49476】Re:Newキーワードの使用法について 追伸 Lindy 07/6/6(水) 9:32 お礼[未読]
【49479】Re:Newキーワードの使用法について 追伸 Lindy 07/6/6(水) 9:54 発言[未読]
【49484】Re:Newキーワードの使用法について 追伸 neptune 07/6/6(水) 11:22 発言[未読]
【49486】Re:Newキーワードの使用法について 追伸 neptune 07/6/6(水) 11:39 発言[未読]
【49487】Re:Newキーワードの使用法について 追伸 Lindy 07/6/6(水) 11:56 お礼[未読]
【49490】Re:Newキーワードの使用法について 追伸 Lindy 07/6/6(水) 13:37 お礼[未読]
【49492】Re:Newキーワードの使用法について 追伸 Lindy 07/6/6(水) 14:28 お礼[未読]
【49498】Re:Newキーワードの使用法について 追伸 ichinose 07/6/7(木) 7:33 発言[未読]
【49500】Re:Newキーワードの使用法について 追伸 Lindy 07/6/7(木) 9:20 お礼[未読]

【49444】Newキーワードの使用法について
質問  Lindy  - 07/6/5(火) 11:23 -

引用なし
パスワード
   VBAを独学で初めて1年程度、
ほとんどヘルプとオブジェクトブラウザと、ここの掲示板で
勉強させて頂いて色々と開発(もどき)してまいりましたが
ふと疑問に思い独自解決に至らないので識者の御意見を賜りたく
初めて質問させて頂きます。

当初、色々なプロシージャやファンクションで
いちいち With ThisWorkbook.Sheets("Sheet1") などとするのが面倒で

Public sh_i as Object
Public sh_p as Object

Private Sub Auto_Open()
 SheetnameSet
End Sub

Sub SheetnameSet()
 Set sh_i = ThisWorkbook.Sheets ("Sheet1")
 Set sh_p = ThisWorkbook.Sheets ("Sheet2")
End Sub

としていました。
で、勉強していくうちにNewキーワードというものを発見し

Public sh_i As New Sheet1
Public sh_p As New Sheet2

と、してみたら・・・うまく行ったのです

しかし、さらにシートを追加してやってみようとしたり
新しいブックで同じような事をしようとすると
「New キーワードの使用法が不正です。」とエラーメッセージが出ます。
また、シート名(ワークシートオブジェクト?)がオブジェクトブラウザでも出てこず、
同様に記述できません。

いったい何が違うのか、そもそも使い方が間違っているのか・・・
偶然出来てしまったが為に勘違いしているのか?

と、悩み果てて質問させて頂きました。
御教授よろしくお願い致します。

【49445】Re:Newキーワードの使用法について
発言  ハチ  - 07/6/5(火) 12:34 -

引用なし
パスワード
   >いったい何が違うのか、そもそも使い方が間違っているのか・・・
>偶然出来てしまったが為に勘違いしているのか?

そもそも使い方が間違っている だと思います。
自分も独学の為、詳しくはありませんが、
New は新しいインスタンス(実体)を作成する為のキーワードです。

「VB インスタンス」あたりググってみれば、詳しい説明が出てると思います。

【49446】Re:Newキーワードの使用法について
お礼  Lindy  - 07/6/5(火) 13:19 -

引用なし
パスワード
   ハチ さん早速の御回答ありがとうございます。

>そもそも使い方が間違っている だと思います。
やはりそうなのですか・・・
間違いながらも偶然に動いているという事なのでしょうか
ただ、この表記が出来るブックではオブジェクトブラウザでも
Sheet1とか出てくる点、正常にエラーも出ずに動いてる点が気になります。

>自分も独学の為、詳しくはありませんが、
独学でも高度なレベルまで辿り着けるというお手本とさせていただいております。

>New は新しいインスタンス(実体)を作成する為のキーワードです。
実はこれが悩みの最難関でありまして・・・
「インスタンスの生成」という言葉をよく目にするのですが
いまいちイメージが沸かないのです。
ソフトウェアの世界ですので当然物理的な実体は無く、
論理的なイメージの世界だと思うのですが・・・
まずは「インスタンス」をさらに勉強してみようと思います。

取り急ぎお礼まで

【49447】Re:Newキーワードの使用法について
質問  Lindy  - 07/6/5(火) 14:13 -

引用なし
パスワード
   調べてわかった(つもりな)事。

インスタンスとは
・メモリー上のプログラムなどの実体
・メモリー上にオンロードされたオブジェクトや変数の集合体

Sheetのインスタンス生成がエラーになる理由
・SheetのクラスによりSheetのインスタンスは1つしか生成出来ないことになっている。

と、言葉だけではありますが確認できました。
(合っているのか解りませんが・・・)

そこでさらに疑問がわいてしまいました。
1.Sheetのインスタンスが1つとは、エクセルアプリケーションが起動した際に
  すでに生成されているので新たに生成できない。という理解でよいのか・・・

2.ではなぜ、偶然そのブックでは出来てしまったのか・・・
  ソースを記載したい所ではありますが、総行数3000超えるので難しいです
  特別なコードを記載してはおりません(それほど能力もありません)
  強いて言うなら、こちらのリンクにもありますAddinBoxさんの
  「擬似からの脱却」にありますフォームのオブジェクトを配列として
  扱えるコードを利用させて頂いています。

なるべくなら自力で到達したい所ではあるのですが力及ばず悔しい限りです。

【49448】Re:Newキーワードの使用法について
回答  neptune  - 07/6/5(火) 14:16 -

引用なし
パスワード
   ▼Lindy さん:
こんにちは

ハチ さんがすでにお答えになってますが、何かに例えて見ましょうか。

dim pic as picturebox
この宣言では、picという変数はpictureboxへの参照できる変数ですよ。
という状態ですね。
ここではただの入れ物を用意しただけで中身はありません。

set pic = me.picturebox1
と実際にあるpicturebox1というコントロールへの参照をセットしてやると
初めて、picturebox1という実体を持つ物への参照が可能になります。
この時点で、変数pic はpicturebox1という実体を持つ(インスタンスが作成された)わけです。

さて、newキーワードですが、
pirvate rs as new ado.recordset
などとやると、
最初にrsを使用して ado.recordsetに参照する行為を行った時点で
ado.recordsetという実体を持つ変数rsが出来上がります。
set rs=なんたら
とやる必要はありません。

これは
set rs=nothing
とやっても同じで、この時点で同様に実体を持つ変数rsが出来上がります。
・・・これは無意味ですね。nothingではなくなりますから。

今回問題の
Public sh_i As New Sheet1 'Sheet1ってnewの次にインテリジェンスで
             '出てきますか????
とやって
>しかし、さらにシートを追加してやってみようとしたり
>新しいブックで同じような事をしようとすると
その時点で、Sheet1への参照を持つ、sh_iがあり、既にSheet1という実体
(インスタンス)を持っているので、おかしなことになるわけだと思います。
sheet1(固有のシートをさしている)は1つしか存在を許されないはずです。

ソースがないので、やっている事が詳しくはわからないのですが、
多分、あたらずとも遠からずと思います。

これで、理解の助けにはなったでしょうか????
#ちなみに私も独学です。がんばりましょう。

【49449】Re:Newキーワードの使用法について
発言  neptune  - 07/6/5(火) 14:18 -

引用なし
パスワード
   長々と書いていたらすれ違い^ ^;

【49450】Re:Newキーワードの使用法について
お礼  Lindy  - 07/6/5(火) 14:34 -

引用なし
パスワード
   ▼neptune さん:
回答ありがとうございます。

お蔭様で、おぼろげながらイメージが沸きつつあります。

>Sheet1ってnewの次にインテリジェンスで出てきますか????
これが今回の間違いの根源といいますか・・・
そのブックだけ出てきたのです。
他のブック、新規のブックでは出てこず当然エラーとなります。

いずれにしろイレギュラーなやり方である事は理解できました。

Public sh_i As WorkSheet

Sub Auto_Open()
 Set sh_i = ThisWorkbook.Sheets("Sheet1")
End Sub

との違いがいまだハッキリとイメージできてはいませんが
これはエラーが出ないので正規なコードという事でよろしければ
まずは「そういう物なんだ」という概念から勉強しつづけてみたいと思います。

>これで、理解の助けにはなったでしょうか????
>#ちなみに私も独学です。がんばりましょう。
全ての御回答には何らかの解決の道が隠されていると承知し、
読解に勤めております。
無償での知識の公開には、ただただ感謝するばかりです。
いずれ皆様のようになりたく、また知識の継承をすべく頑張ります。
ありがとうございました。

【49458】Re:Newキーワードの使用法について
発言  Kein  - 07/6/5(火) 18:02 -

引用なし
パスワード
   Setステートメントのヘルプから、参考になりそうな記述を抜粋してみます。

------------------------------------------------------------------------

一般に、Set ステートメントでオブジェクトへの参照を変数に代入する場合、
変数のためにオブジェクトのコピーは作成されず、代わりにオブジェクトへの参照が
作成されます。複数のオブジェクト変数が同じオブジェクトを参照できます。
このオブジェクト変数は、オブジェクトのコピーではなく、オブジェクトへの参照
なので、オブジェクトに変更を加えると、それはオブジェクトを参照している
すべての変数に反映されます。ただし、Set ステートメントにキーワード New を
使うと、オブジェクトのインスタンスが実際に作成されます。

------------------------------------------------------------------------
ちなみに

Dim 変数 As New オブジェクト

とするのは、
>Set ステートメントにキーワード New を使う
やり方と同じ結果になります。そーいう仕様だと理解しているだけなんで、
詳しい説明は出来ませんが。

【49467】Re:Newキーワードの使用法について
発言  ichinose  - 07/6/5(火) 22:07 -

引用なし
パスワード
   みなさん、こんばんは。
>
>当初、色々なプロシージャやファンクションで
>いちいち With ThisWorkbook.Sheets("Sheet1") などとするのが面倒で
>
>Public sh_i as Object
>Public sh_p as Object
>
>Private Sub Auto_Open()
> SheetnameSet
>End Sub
>
>Sub SheetnameSet()
> Set sh_i = ThisWorkbook.Sheets ("Sheet1")
> Set sh_p = ThisWorkbook.Sheets ("Sheet2")
>End Sub
>
>としていました。
>で、勉強していくうちにNewキーワードというものを発見し
>
>Public sh_i As New Sheet1
>Public sh_p As New Sheet2
>
>と、してみたら・・・うまく行ったのです
>
>しかし、さらにシートを追加してやってみようとしたり
>新しいブックで同じような事をしようとすると
>「New キーワードの使用法が不正です。」とエラーメッセージが出ます。
>また、シート名(ワークシートオブジェクト?)がオブジェクトブラウザでも出てこず、
>同様に記述できません。
>
>いったい何が違うのか、そもそも使い方が間違っているのか・・・
>偶然出来てしまったが為に勘違いしているのか?

現象確認しました。

Excel2002では、何度やっても

 Dim Sht1 as new sheet1

の正常作動を確認できませんでした(つまり、エラーになります)。

が、

Excel2000で作成したブックをExcel2002で読み込んだ場合、
既に作成してあるシートに対して、

dim sht as new sheet1

上記の宣言が可能です。
しかし、このブックに新しくシートを追加した場合(例えば、Sheet4を追加)、

dim sht4 as new sheet4

は、
>「New キーワードの使用法が不正です。」とエラーメッセージが出ます。

ということはExcel2000までは、 New sheet1 という記述ができたのでしょうか?
と思い、80になる私の父(最近Excelに目覚めた らしい)のPCにExcel2000が
入っていたので2分前に確認したところ、Excel2000でも

Excel2002と同様、

Dim Sht1 as new sheet1

は、エラーになります。
このExcel2000で作成したブックをExcel2002で読み込むと
またまた、

Dim Sht1 as new sheet1

これは、正常に作動します。

Excel2002で作成ブックは、Excel2003では??
Excel2003で作成ブックは、Excel2007では??

確認できる方はお願いします。

上記の現象からすると、

 Dim Sht As New Sheet1

という記述が良い記述ではないことが推測できますよね!!
(Set sht=new sheet1も同様です)

【49474】Re:Newキーワードの使用法について 追伸
発言  ichinose  - 07/6/6(水) 7:09 -

引用なし
パスワード
   おはようございます。

この Dim sht as new sheet1

が正常?に作動するExcel2000で作成したブックを
Excel2002にて・・・、

標準モジュールに
'======================================================
Sub main()
  Dim sht1 As Object
  Dim sht11 As Object
  Dim sht111 As Object
  Set sht11 = Worksheets("sheet1")
  Set sht111 = Worksheets("sheet1")
  Set sht1 = New Sheet1
  MsgBox sht1 Is sht11
  MsgBox sht11 Is sht111
End Sub

というコードを実行してみてください。

実行する前の私の仮説は、 False  True でした。

結果は、True、Trueでした。

何だよ!! New Sheet1 で新しいオブジェクトは、作られてないじゃん・・・。

ってことかなあ・・・。

わっかりません!!

【49476】Re:Newキーワードの使用法について 追伸
お礼  Lindy  - 07/6/6(水) 9:32 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。

すばらしい・・・感服致しました。
一種のバグのような現象だったのですね。

ちなみに私の現在の環境はExcel2003 SP2 です
別場所でも一旦モジュールの変更を行い保存しました。
そちらの環境は覚えておりませんが^^;

>標準モジュールに
>'======================================================
>Sub main()
>  Dim sht1 As Object
>  Dim sht11 As Object
>  Dim sht111 As Object
   Set sht11 = Worksheets("sheet1") 'ここと
  Set sht111 = Worksheets("sheet1") 'ここはインデックスが見つかりませんエラー
>  Set sht1 = New Sheet1
>  MsgBox sht1 Is sht11
>  MsgBox sht11 Is sht111
>End Sub
>
>というコードを実行してみてください。

現在、Public sht As New Sheet1 が正常動作しているブックにて
上記のモジュールを実効しましたが、表記のとおりの場所でエラーとなります。
先にPublic宣言でSheet1のインスタンスを生成してしまっているためのエラーでしょうか?

いずれにしても・・・
・一種のバグであること。
・偶然、そのバグが起こり得る環境で開発してしまった事。
・そもそも「普通そんな使い方はしない」(苦笑)
と、言う事がハッキリと認識できました。

私ごとき素人がこのような間違いを実際に犯しているのですから
今後、同様な方が現れるかもしれません。

恥は私だけで終わるように参考にして頂ければと思います。
本当にありがとうございました。

【49478】Re:Newキーワードの使用法について
お礼  Lindy  - 07/6/6(水) 9:41 -

引用なし
パスワード
   ▼Kein さん:
おはようございます。

なるほど・・・目から鱗です。
とても解りやすい説明をありがとうございます。

・変数宣言でのNewはインスタンスの生成・・・つまりオブジェクトの複製を行う

・Setステートメントはオブジェクトへの参照のみ・・・つまりオブジェクトは1つ
 (ここでオブジェクトという解釈が正しいのかインスタンスなのかは
  今後さらに勉強します)

という事なのですね

SetでNewを使わなければ参照のみなのでSheetのインスタンスは生成されず、
クラスで定められた規定には違反しないが、Newキーワードを使用して
インスタンスの生成を暗黙的に行おうとするとクラス規定に違反する。

と解釈いたしました。

まだまだ・・・ヘルプ読みきれていないですね(悔

変数宣言とSetでの違いはハッキリイメージできました。
本当にありがとうございました。

【49479】Re:Newキーワードの使用法について 追伸
発言  Lindy  - 07/6/6(水) 9:54 -

引用なし
パスワード
   すいません、追伸です。

True True 確認しました。

目安箱にあるichinoseさんの
「ちょっと気になる現象2 Is 演算子」を確認した上で・・・
確かに新しいオブジェクト(インスタンス?)は作成されていないように
思えます。

が、しかし・・・

Public sh_i As New Sheet1
Public sh_p As New Sheet2

のように複数のシートを指定しておりまして・・・

Sub Test()
 sh_i.Range("A1").Value = "Sheet1"
 sh_p.Range("A1").Value = "Sheet2"
End Sub

これは、思惑どおりに動作しております。
インスタンスは生成されておらず、参照扱いとして動作している・・・
という事なのでしょうか。

初心者のくせに素直に納得せず探求してしまう癖が邪魔して
勉強が先に進みません(苦笑)

【49484】Re:Newキーワードの使用法について 追伸
発言  neptune  - 07/6/6(水) 11:22 -

引用なし
パスワード
   ▼Lindy さん:
こんにちは

mougでも同じ質問がありました。そこで以下が紹介されてました。
そういえば昔ここで勉強したことがありました。
//homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html
の「応用編」の「オブジェクト変数とインスタンス」を読んでみて下さい。
できれば最初から全部読むことをお勧めします。

詳しくわかりやすく書いてくれています。

所で、みなさんの書き込みを呼んでいると変なバグ?があるらしいですね。
知りませんでした。
>Public sh_i As New Sheet1
>これは、思惑どおりに動作しております。
これは理解できません。
固有のものが2つになってしまう。やっぱりバグ????
>インスタンスは生成されておらず、参照扱いとして動作している・・・
なら
Public sh_i As Sheet1
ならわかりますが。。。

>勉強が先に進みません(苦笑)
まぁ程々に^ ^

【49486】Re:Newキーワードの使用法について 追伸
発言  neptune  - 07/6/6(水) 11:39 -

引用なし
パスワード
   ここもお勧めです。「「プログラマのメモ帳 」
//web.archive.org/web/20040930165730/www.gj.il24.net/~nakasima/
の「技術文書」
「プログラムがきちんと終了しない理由 」
「Set XXX = Nothingの本当の意味 」
も読んでおくと良いです。

【49487】Re:Newキーワードの使用法について 追伸
お礼  Lindy  - 07/6/6(水) 11:56 -

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

こんにちは

参考になりそうなHPの御紹介ありがとうございます。
会社では閲覧制限にひっかかり閲覧できませんので
帰宅後じっくり見てみたいと思います。

また、モーグに同様の質問があったとの事ですが
是非1度拝見したいと思っています。
一応検索かけたのですが発見に至らず。
何かしら検索のヒント語句を頂けないでしょうか?

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


【49490】Re:Newキーワードの使用法について 追伸
お礼  Lindy  - 07/6/6(水) 13:37 -

引用なし
パスワード
   モーグの件、「プログラミング」の方の板で
「インスタンスの生成について」を発見しました。

かなり参考になりました。
ありがとうございました^^

【49492】Re:Newキーワードの使用法について 追伸
お礼  Lindy  - 07/6/6(水) 14:28 -

引用なし
パスワード
   ▼neptune さん:
>ここもお勧めです。「「プログラマのメモ帳 」
>//web.archive.org/web/20040930165730/www.gj.il24.net/~nakasima/
>の「技術文書」
>「プログラムがきちんと終了しない理由 」
>「Set XXX = Nothingの本当の意味 」
>も読んでおくと良いです。

昼休みに自宅に戻って見てまいりました。(待ちきれず・・)
かなりわかり易く、オブジェクト指向プログラミングについて書いておられ
今後のプログラミングに対する姿勢の基盤を固められた気がします。

昼食を犠牲にした甲斐がありました。
本当にありがとうございます。

【49498】Re:Newキーワードの使用法について 追伸
発言  ichinose  - 07/6/7(木) 7:33 -

引用なし
パスワード
   おはようございます。

もうバグ という結論(バグなのだから、随所に矛盾が発生する)
で良よさそうですね!!


>True True 確認しました。
Lindyさんの現象も前のバージョンで作成したブックを
上位バージョンのExcelで読み込んだということでよろしいのですか?


>インスタンスは生成されておらず、参照扱いとして動作している・・・

としか考えられませんよね!!


>>Public sh_i As New Sheet1
>>これは、思惑どおりに動作しております。
>これは理解できません。
>固有のものが2つになってしまう。やっぱりバグ????

シートを操作する窓口としてのオブジェクトがふたつある

という考え方をすると私は無理やりなら納得は出来ますが、
(Range("A1") is Range("a1") =false と同じ考え方で)

何のために? 用途は? 

と問われると矛盾はありますよねえ

だからって、Newキ−ワードでNewされないのもねえ!!

下位バージョンのブックを上位バージョンで開いた時に
今回のバグらしき現象が他の不具合の引き金になっていないことを
願うばかりです。

【49500】Re:Newキーワードの使用法について 追伸
お礼  Lindy  - 07/6/7(木) 9:20 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。

>もうバグ という結論(バグなのだから、随所に矛盾が発生する)
>で良よさそうですね!!
初心者ながら、↑の通りじゃないと納得がいかないと思いました。

>Lindyさんの現象も前のバージョンで作成したブックを
>上位バージョンのExcelで読み込んだということでよろしいのですか?
はい、私の環境では2000→2003ですが同様でした。

>>インスタンスは生成されておらず、参照扱いとして動作している・・・
>としか考えられませんよね!!
なるほど、矛盾しているなりの解釈ですが参考になります^^

>>固有のものが2つになってしまう。やっぱりバグ????
>シートを操作する窓口としてのオブジェクトがふたつある
もしくは、インスタンスとオブジェクト参照の2つだったとか・・・

>だからって、Newキ−ワードでNewされないのもねえ!!
そうですよね・・・

今回、偶然ながらバグを発見してしまった事は良い事なのか、
偉大なるおバカの成せる技なのか微妙ですが(笑
今後の私のプログラミングの方向性というか考え方において
あまりに抽象的なイメージだった事、しかしながらオブジェクト指向の
なかでは決して避けて通れない部分をはっきりと認識できました。
クラス、インスタンス、オブジェクトという目に見えない概念が
頭に浮かんできました。
さらにイメージを具現化していけるように経験と勉強を積みたいと思います。

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