dポイントプレゼントキャンペーン実施中!

Access 2003でVBAでフォームにサブフォーム(データシートビュー)を組み込んで
一覧表を作成しております。

・選択されたレコードの行番号のようなものを取得する
・指定行の列の値を取得する

記述方法を探しております。

VB.netなどのDataGridViewのように
Rowなどで取得する方法などはないのでしょうか?
ご存知の方、ご教授よろしくお願いいたします。

A 回答 (5件)

piroin654 さんへ


http://msdn.microsoft.com/ja-jp/library/cc948691 …
より抜粋

同じプロジェクトに、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

抜粋終了(傍点は当方で付けました)
なので、修飾子を含めた記述にしといた方が後々面倒が少ないと思いますよ。
回答するときも楽だし (^^ゞ
    • good
    • 0
この回答へのお礼

nicotinismさんも、piroin654さんも丁寧な
ご回答、大変感謝しております。
VBAは久しぶりで、他の言語と違いクセがありますが
使いこなせるように頑張りたいと思います。

piroin654さんにもベストアンサーをつけさせて頂きたいところですが、
今回はnicotinismさんにベストアンサーとさせて頂きたいと思います。
piroini654さんも、ご回答助かりました。

また宜しくお願いいたします。

お礼日時:2011/09/10 16:59

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のような数字です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/10 16:56

追加です。

操作は、

cmdレコード数 をクリックすると txNumbers に
レコード数が表示されます。

txPosition に行の位置を入れて cmd行移動 を
クリックすると、見た目のレコード選択と
カレントレコードを一致させます。

txRow に列の位置を入力して cmd列指定 を
クリックすると、列の名前、すなわちフィールドの
名前とフィールドの値をメッセージボックスで
表示します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/10 16:55

だいたいのことは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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/10 16:52

こういうことかな?メインフォームのコマンドボタンのイベントに割り当ててみました。


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

後は芋づる式に調べていけば突破口になる?と?思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/10 16:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています