店長のひとりごとパソコンショップT&A店長の奮闘記録ですTreeViewコントロールに挑戦POSレジソフトも開発・使用中ですが、それに連携する商品管理ソフトも作成しています。完成に近づいてきました。画面左側に商品分類ツリーを設けているところが”ミソ”です。VBAのTreeViewコントロールを使いましたが、だいぶ苦労しました。[SelectedImage]の式の中の[Text]が登録するノードの表示名で、[Key]がノードを識別する名前になります。このKeyをTextと同じ内容にしている例があるのですが、Key値は重複が許されません。分類ツリーが細分化していくと、どうしても同じ分類名が出てくる(例えば、LANケーブルにも2mがあるし、USBケーブルにも2mがある)可能性があるので、Text値は重複しますが、Key値は一意の値にしないといけないのです。そこで、同じ親の中には重複する子供の名前は無いので、[親名]&[子名]をKey値としました。分類の親子関係が必要になるので、分類テーブルには親分類のフィールドを設定しています。分類は5階層まで設定したので、Do~Loopを5重の”入れ子”にし、登録部分のコードが出来上がりました。このツリー・ビューの目的は、分類名をクリックするだけでフィルタをかける(商品を絞り込む)ことです。画面右下の[検索]タブでも複合検索はできるのですが、分類だけで絞り込み、価格を比較するということはよくやるので、この機能があると大変便利です。ノードをクリックしたときのイベントが、TreeViewのNodeClickイベントなのですが、ここで失敗したのは、このイベント・プロシージャを一から入力して記述してしまい、エラーが出てしまったことです。見直しましたが、構文には間違いはありません。プロシージャの中に何も記述しなくてもエラーになり、プロシージャ全体をコメントアウトするとエラーがでません。フォームのTreeViewのプロパティのイベントの中にクリック時が無いので、「そもそもクリック時イベントはAccess2010で非対応になったのかな?」とか思ったり、2010にTreeViewに関するバグがあるような情報を見つけたので、更新をかけたりしましたが解決しませんでした。そこで、このプロシージャ部分を一旦削除し、VBAウィンドウのオブジェクト欄からTreeViewを選択し、プロシージャ欄からNodeClickを選択して作成しました。したら、エラーが出なくなりました!非常に単純で基本的なことなのですが、同様の原因でコードがうまく実行できないことがありました。プログラミングに慣れてくると陥りやすい”落とし穴”だと思います。ノードをクリックしたときに得られるプロパティの中に[FullPathプロパティ]があり、そのノードまでのフルパスを返します。インク」という文字列が得られます。この文字列を操作することによって、その分類の親分類名を全て得ることができます。検索をかけるための条件は整ったので、NodeClickイベントの中身を書いていくわけですが、商品テーブルと分類テーブルを結合して検索する必要があるので、SQL文の”SELECT~JOIN~”を使ったのですが、ここでまたつまずきました。「JOIN式はサポートされません。」と叱られてしまったのです(;_;)これも原因が分かるまで苦労しましたが、その原因は”ずぼら”でした。単純なSELECT文の中では、各フィールド名の記述だけでよいのですが、複数のテーブルを結合する場合は、[テーブル名].[フィールド名]というように記述しないといけないのに、フィールド名が重複していなければよいと思い、テーブル名を省略していたのです。これも基本的なことなので、面倒でもちゃんと基本に則らないとダメですね。