2017-06-27 7 views
2

それぞれに特定のレコードを表す500種類以上のシェイプを持つAccessフォームがあります。各図形はBox1、Box2などのコントロール名を持っています。VBAでは図形名をキャプチャしようとしています。たとえば、Box502という図形をクリックすると、レコード502に移動します。図形なので、このコントロール名をキャプチャしていません。私が名前を捉えることができれば、それから "Box"を取り除いて、そのレコードに行くのに使う番号を得ることができます。アクセスフォームからシェイプコントロール名を取得してvbaの値を渡します。

図形の代わりにコマンドボタンを使用すると、以下のコードを使用して必要な処理を実行できますが、コマンドボタンでは機能しないように図形の色を変更するコードもあります。

Private Sub Box2_Click() 
    Dim strActiveCtl As String 
    strActiveCtl = Replace(Me.ActiveControl.Name, "Box", "") 
    DoCmd.GoToRecord acDataForm, "Form1", acGoTo, [strActiveCtl] 
End Sub 

このコード行を図形に使用すると、別のコントロールを取得していて、クリックしたものではありません。

クリックするとコードビルダーとこのコード行が使用されていましたが、別のコントロールをキャプチャしていて、クリックしているものではありません。

Dim strActiveCtl As String 
strActiveCtl = Screen.ActiveControl.Name 

これらの小さなボックスがある理由は、基本的には監視されているサービスに関連しているからです。約550のサービスが監視されています。サービスが見直されたときに、その形状が赤から緑に変わります。チームは単に形状をクリックして、それが関連していたサービスに彼らを連れて行きたいと思っていました。

+0

どのような方法でクリックハンドラをボックスに取り付けるのですか? –

+0

クリックするとコードビルダーとこのコード行が使用されましたが、別のコントロールをキャプチャしていて、クリックしているものではありません。 Dim strActiveCtl As String strActiveCtl = Screen.ActiveControl.Name – Jada

+0

シェイプの代わりにコマンドボタンを使用すると、以下のコードを使用して必要な処理を実行できますが、シェイプの色を変更するコードもありますコマンドボタンでは機能しません。プライベートサブBox2_Click()文字列 strActiveCtl = " DoCmd.GoToRecord acDataForm、Form1の" acGoToを(Me.ActiveControl.Name、 "ボックス"、 ")" に置き換え、[strActiveCtl] End Subの – Jada

答えて

0

私は自分の人生にとって、それぞれが異なるレコードを表す500以上の形状のボックスを持つフォームを想像することはできません。 Egads。

しかし、これを行うユニークな理由があります。だから私はあなたがしているように個々のレコードを識別しようとするときに、ほとんどの人が "サブフォーム"と "リストボックス"を使用すると言っている以外、このデザイン哲学に疑問を呈しません。これらの方法を使ってフォームをデザインする方法を読んで、頭を悩ませたくないかもしれません。 (フォームに500個以上のシェイプボックスを置かないようにする他の多くの方法と同様に)

しかし、これはあなたが遵守しなければならないデザインであれば、Accessについて知っておくべきことがいくつかありますアクティブなコントロールを解決する方法と、コントロールがクリックされたときに起こることを示します。

コントロールまたはシェイプをクリックするたびに、「フォーカス」を受け入れるようにコントロールプロパティが設定されている場合は、即座に「アクティブコントロール」になります。

それであなたが何か他のものをクリックすると...あなたの形状は "アクティブコントロール"であるというステータスを失い、新しいものは新しい "アクティブコントロール"になります。

したがって、シェイプをクリックして別のものをクリックして、以前の「アクティブなコントロール」で実行したいコードを起動する方法はありません。 アクセスは過去の "アクティブなコントロール"のメモリを保持しません。

これで、「コントロールやシェイプがクリックされたかどうかわかりますか?」という質問が表示されます。

あなたのために幸いにも(または不運にも)、形状がクリックされると、コードが "On Click"プロパティ用に書き込まれているかどうかがチェックされます。

フォーム上に配置した各シェイプには、それぞれ独自の「クリック時」プロパティがあります。つまり、作成するすべての図形に配置できる関数を書くことができます。その関数に、それを呼び出した「ボックス」の番号を渡すことができます。

これは明らかに非常に面倒です。 (だから私は "サブフォーム"や "リストボックス"を使うことを提案しているのです)しかし、起動する方法がないので500ボックスごとに異なるBox番号を取得する唯一の方法です他のコードはあなたがいたボックスの "フォーカス"を失うことなく。

"500の図形を1つのフォームでそれぞれ別のレコードに対応させたい"場合は、 "Box"と呼ばれる入力パラメータでレコードを呼び出すVBA関数を記述できます。このように:

Private Sub subGoToNewRecord(intActiveCtl As Integer) 

    DoCmd.GoToRecord acDataForm, "Form1", acGoTo, intActiveCtl 

End Sub 

次に、あなたが書くことができ、各シェイプボックスのために:

Private Sub Box1_Click() 
    subGoToNewRecord 1 
End Sub 

Private Sub Box2_Click() 
    subGoToNewRecord 2 
End Sub 

. 
. 
. 

Private Sub Box502_Click() 
    subGoToNewRecord 502 
End Sub 

これが何をしたいあなたを取得します。 (ただし、シェイプの境界線をクリックして境界線をクリックする必要がある場合があります)。

もう一度、私はあなたがこれをしたいと思う理由が分かりません。 「サブフォーム」が何であるかを調べ、「リストボックス」が何であるかを調べることをもう一度お勧めします。彼らは、あなたが望むレコードを選択してそれを "アクティブレコード"にするのに適しています。

希望に役立ちます。 :)

+0

abraxascarab - :)フィードバックいただきありがとうございます。それはそれを働かせる一つの方法です。私は以下のコードをクリックするだけで動作させることもできましたが、一般的なものを使うことができればと思っていました。私はそれが私がオブジェクトである形にしたいと思うように動作するとは思わない。 Private Sub Box3_Click() DoCmd.GoToRecord acDataForm、 "form1"、acGoTo、3 End Sub – Jada

関連する問題