• ベストアンサー

Accessデータシートビューの行指定について

Access 2003でVBAでフォームにサブフォーム(データシートビュー)を組み込んで 一覧表を作成しております。 ・選択されたレコードの行番号のようなものを取得する ・指定行の列の値を取得する 記述方法を探しております。 VB.netなどのDataGridViewのように Rowなどで取得する方法などはないのでしょうか? ご存知の方、ご教授よろしくお願いいたします。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

piroin654 さんへ http://msdn.microsoft.com/ja-jp/library/cc948691.aspx より抜粋 同じプロジェクトに、ADO と DAO の両方の参照を含める場合は、 オブジェクトを宣言するときに、どちらのライブラリを使用するかを明示的に指定する必要があります。 DAO と ADO にはいくつか同じ名前のオブジェクトが含まれているためです。 たとえば、どちらのモデルにも Recordset オブジェクトが含まれているので、次のコードはあいまいです。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim rst as Recordset 使用するオブジェクト モデルを指定するには、次のように修飾子を含める必要があります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim rstADO As ADODB.Recordset Dim rstDAO As DAO.Recordset 修飾子を省略すると、Visual Basic for Applications (VBA) は先に参照されたモデルのオブジェクトを選択します。 したがって、[参照設定]ダイアログ ボックスの参照リストが以下の順序で並んでいる場合、 修飾子なしの Recordset として宣言されているオブジェクトは、DAO の Recordset になります。 Visual Basic For Applications Microsoft DAO 3.6 Object Library Microsoft ActiveX Data Objects 2.1 Library Microsoft ADO Ext. 2.1 for DDL and Security Microsoft Jet and Replication Objects 2.1 Library 抜粋終了(傍点は当方で付けました) なので、修飾子を含めた記述にしといた方が後々面倒が少ないと思いますよ。 回答するときも楽だし (^^ゞ

-0-y
質問者

お礼

nicotinismさんも、piroin654さんも丁寧な ご回答、大変感謝しております。 VBAは久しぶりで、他の言語と違いクセがありますが 使いこなせるように頑張りたいと思います。 piroin654さんにもベストアンサーをつけさせて頂きたいところですが、 今回はnicotinismさんにベストアンサーとさせて頂きたいと思います。 piroini654さんも、ご回答助かりました。 また宜しくお願いいたします。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2の Private Sub cmd列指定_Click() のところで、 Dim fld As Field Dim ctl As Control の二つは使っていないのでコメントアウトするか 削除しておいてください。もう一つこの プロシージャの最後に、 rs.Close: Set rs = Nothing End Sub としておいてください。後始末が抜けていました。 なお、以下はDAOを使っているので、コード表の ツールから参照設定を開き、 Microsoft DAO xx Object Library にチェックを入れ↑ボタンで上げられるところまで あげてください。xxは3.6のような数字です。

-0-y
質問者

お礼

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

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

追加です。操作は、 cmdレコード数 をクリックすると txNumbers に レコード数が表示されます。 txPosition に行の位置を入れて cmd行移動 を クリックすると、見た目のレコード選択と カレントレコードを一致させます。 txRow に列の位置を入力して cmd列指定 を クリックすると、列の名前、すなわちフィールドの 名前とフィールドの値をメッセージボックスで 表示します。

-0-y
質問者

お礼

このソースを色々拡張して作っていけそうな感じですね もう少し頑張ってみます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

だいたいのことはnicotinismの回答で済むと思います。 少し手の込んだ回答をしてみることにしました。 (1) メインフォームにテキストボックスを三つ。 txNumbers txPosition txRow 同じくメインフォームにボタンを三つ。 cmdレコード数 cmd行移動 cmd列指定 (2) 埋め込み0とはサブフォームを表示するコントロール名です。 サブフォームそのものの名前ではありません。このあたりは おわかりだと思います。なお、cmd列指定での変数iはフィールド のIndexの値が0から始まるので、何列目ということで i = Me.txRow.Value - 1 として、見た目の列でテキストボックス の値を取得するようにしています。 Option Compare Database Option Explicit 'ブックマークの設定 Dim bk As Variant Private Sub cmdレコード数_Click() 'サブフォームに表示されているレコード数の取得 Dim rs As Recordset Set rs = Me.埋め込み0.Form.RecordsetClone If rs.RecordCount > 0 Then rs.MoveLast rs.MoveFirst bk = rs.Bookmark Me.埋め込み0.Form.Bookmark = bk Me.txNumbers = rs.RecordCount End If rs.Close: Set rs = Nothing End Sub Private Sub cmd行移動_Click() '見た目のレコード選択とカレントレコードを一致させる Dim rs As Recordset Dim l As Long Set rs = Me.埋め込み0.Form.RecordsetClone If rs.RecordCount > 0 Then 'ブックマークを先頭レコードに移動 rs.MoveFirst bk = rs.Bookmark If Me.txPosition > 0 Then If Not rs.EOF Then rs.Move Nz(Me.txPosition - 1) If Not rs.EOF Then 'サブフォームの表示をカレントレコードに移動 bk = rs.Bookmark Me.埋め込み0.Form.Bookmark = bk End If End If End If End If rs.Close: Set rs = Nothing End Sub Private Sub cmd列指定_Click() 'カレントレコードの指定した列の名前と値の表示 Dim rs As Recordset Dim fld As Field Dim ctl As Control Dim i As Long Set rs = Me.埋め込み0.Form.RecordsetClone i = Me.txRow.Value - 1 If i >= 0 And i <= rs.Fields.Count - 1 Then MsgBox "カレントレコードの指定された列の名前は " & rs.Fields(i).Name MsgBox "カレントレコードの指定された列の値は " & rs.Fields(i).Value End If End Sub

-0-y
質問者

お礼

やはり、レコードセットを使うやり方がベターなのですかね 丁寧な回答、ありがとうございます。 参考にさせていただきます。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

こういうことかな?メインフォームのコマンドボタンのイベントに割り当ててみました。 Private Sub コマンド20_Click() MsgBox "レコード数= " & Me!サブフォーム名.Form.RecordsetClone.RecordCount & vbCrLf _     & "現在位置= " & Me!サブフォーム名.Form.CurrentRecord & vbCrLf _     & "フィールドの値=" & Me!サブフォーム名.Form!フィールド名.Value Dim rs As DAO.Recordset '要参照設定 Microsoft DAO 3.6 ObjectLibrary OR Later             '例 Microsoft Office 14.0 Access databese engine object Library Set rs = Me!サブフォーム名.Form.RecordsetClone rs.AbsolutePosition = 0 'ゼロからレコード数-1まで MsgBox rs!フィールド名 rs.Close: Set rs = Nothing End Sub 後は芋づる式に調べていけば突破口になる?と?思います。

-0-y
質問者

お礼

ありがとうございます。 参考にさせていただきます。