みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DataGridView のSUB制御

Windows 7 Professional に、Microsoft Visual Basic 2010 Express をインストールしました。
今までEXCELやAccessのフォームを使って作成していたVBAプログラムを移植しようと考えています。

その中で、いろいろ試しているうち、妙な現象に悩まされています。

例として、プロジェクト内にForm3を作成します。
そのForm3の中にDataGridView1を設置します。

Form3内のForm3_Load や、ボタンのプロシージャーに

Me.DataGridView1.DataSource = ○○

や、

Me.DataGridView1(0, 0).Style.BackColor = Color.Orange

等を記述して実行すると、うまくデータソースを読み込んだり、指定のセルが塗られたりします。

ところが、 Module1 を作成し、そこに Public Sub test01 を作成して、
Form3.DataGridView1.DataSource = ○○

と記述し、call で test01を呼び出すと、全く表示されません。

Form3.DataGridView1(0, 0).Style.BackColor = Color.Orange
などは、インデックスの範囲エラーと出てしまいました。


おかしいと思い、ブレークポイントを指定して、ステップ実行したところ
call で呼び出されたtest01をステップしている最中に、
Debug.Print(Form3.DataGridView1.Columns.Count)

を通過したところでは、カウント数がデータソースの行数になりますが、test01 のend sub まで実行して、form3のプロシージャーに戻ったところにも、Debug.Print(Me.DataGridView1.Columns.Count)を仕掛けて通過させたところ、イミディエイトウィンドウに表示された値は0でした。

つまり、呼び出したプロシージャー内では値をセットしたのに、戻った途端、それがすべて消えてしまった事になります。

VBAでこのような現象にぶつかった事がないので、ご質問ですが、Visual Basic 2010 では、sub の記述で、Form上のコントロールを制御する事はできないのでしょうか?

Public Sub からFrom上の、特にDataGridViewを制御するのに、なにか必要な事があったら、教えてください。

投稿日時 - 2013-05-28 13:58:39

QNo.8108758

すぐに回答ほしいです

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

Form3 が2つできているのでは?
>Debug.Print(Form3.DataGridView1.Columns.Count)
>を通過したところでは、カウント数がデータソースの行数になりますが
この直前に
Form3.Show のコードを入れたらどうなりますか?
Form3 がもう一つ表示されたなら、インスタンスの管理ができていないということです。

投稿日時 - 2013-05-28 16:22:02

補足

> この直前に
> Form3.Show のコードを入れたらどうなりますか?
> Form3 がもう一つ表示されたなら、インスタンスの
> 管理ができていないということです。

確かに、Form3がもうひとつ表示され、そちらは希望通りになっていました。

ボタンを押すと、用意したフォームを開く は、Excelだと、UserForm3.Show、AccessのVBAでは DoCmd.OpenForm "Form3" でしたが、Visual Basic 2010では

Dim f As New Form3
f.Owner = Me
f.Show

のようにすると書かれていたので、この通り記述しましたが、これだと『インスタンスの管理ができていない』事になるのでしょうか?

VBAだとインスタンス気にしないもので、勘違いしているかもしれません。

投稿日時 - 2013-05-28 17:04:25

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>VBAだとインスタンス気にしないもので、勘違いしているかもしれません。
それがそもそもの間違い。プログラムを詳しく勉強してないからそうなってるだけ。
[Excel2003 VBA]
Sub test()
  Dim f As UserForm3
  Dim i As Long
  For i = 0 To 3
    Set f = New UserForm3
    f.Show vbModeless
  Next
End Sub
※同じ位置に表示されるから、表示後にずらせば4つのUserForm3ができてるはず。

オブジェクトの仕組みはクラスが設計図で、実行時にメモリ上にインスタンス(実体)
を生成しないと使えない。その手続きが New で、これは VBA でも同じなんだけど、
VB 系の言語では裏で勝手にお仕事するのが好きで、デフォルトインスタンスとか
呼ばれるものを勝手に作っちゃう。

この辺を理解できてない素人がシングルトンで画面を制御するなら、New を一切使わず、
全て VB が用意してくれるデフォルトインスタンスで統一すればいいのでは?

投稿日時 - 2013-05-28 18:04:04