「夫を成功」へ導く妻の秘訣 座談会

こんにちわ

私の環境はOS:Xp
     ACCESS2000です。

タイトルに書きました通り
「AccessVBAでループ使用時にフォームの数値項目名を増減させたい」のです。

例えば、
Do Until ~ Loop の中で、
顧客名1という項目名があったとします。
その「1」の部分をループが回るごとに1づつ増やし、
顧客名1、顧客名2、顧客名3・・・
としていきたいのです。

知っておられる方がおられましたら、どうか宜しくお願いします。

A 回答 (3件)

> 顧客名1という項目名があったとします。



コントロール名ということですよね?

Dim lngIdx As Long
For lngIdx = 1 To 3
  Debug.Print Me.Controls("顧客名" & lngIdx)
Next lngIdx

のようにすれば大丈夫だと思います。

この回答への補足

ありがとうございます! 大変参考になりました。

あつかましいのですが、追加で初歩な質問をさせていただきます。

Dim lngIdx As Long
For lngIdx = 1 To 3
  Debug.Print Me.Controls("顧客名" & lngIdx)
Next lngIdx

上記の「"顧客名"」というコントロール名なのですが、サブフォームに作成しているので
今までは、
「Me.顧客管理サブフォーム!顧客名1」
という記述をしておりました。

上記の場合、どこにセミコロン等を使えばよいのでしょうか?

追加質問で失礼かとは思いますが、宜しくお願いします。

補足日時:2004/12/03 16:13
    • good
    • 0
この回答へのお礼

>Debug.Print Me.Controls("顧客名" & lngIdx)
>の時はうまくいけたんですけど、

>Debug.Print Me.Controls(Me.顧客管理サブフォーム.Form("顧客名" & lngIdx))
>にすると「型が一致しません」とエラーがでました。

上記の問題ですが、おかげさまで解決いたしました。
Debug.Print Me.Controls(Me.顧客管理サブフォーム.Form("顧客名" & lngIdx))

Me.顧客管理サブフォーム.Form("顧客名" & lngIdx)
こうする事で解決いたしました。なぜだかは解らないのですが・・・

色々とありがとうございました。

お礼日時:2004/12/03 17:17

> Me.顧客管理サブフォーム!顧客名1



Me.顧客管理サブフォーム.Form.Controls("顧客名" & lngIdx)
とか、
Me.顧客管理サブフォーム.Form("顧客名" & lngIdx)
とかのようにすれば大丈夫だとは思います。

この回答への補足

ありがとうございます。

しかしなぜか「型が一致しません」というエラーがでます。

lngIdx の型宣言がおかしいのかと、long,integer,stringなどを試したのですが、同じエラーが表示されてしまいます。

どの箇所が問題の可能性があるのでしょうか?

宜しくお願いします

補足日時:2004/12/03 16:43
    • good
    • 0
この回答へのお礼

ちなみに

Debug.Print Me.Controls("顧客名" & lngIdx)
の時はうまくいけたんですけど、

Debug.Print Me.Controls(Me.顧客管理サブフォーム.Form("顧客名" & lngIdx))
にすると「型が一致しません」とエラーがでました。

どのようにしたら解決できるのでしょうか?

宜しくお願いします。

お礼日時:2004/12/03 17:07

ご説明だけでは判断できない部分がありますが


こんな感じでしょう。

※rsの宣言などについては省略します。
※通常レコードセットを最初から最後までチェックする
ループと考えています。
その中でIf条件に合致した場合新たにループが発生
する場合は以下の通りです。

●条件というのは「顧客名」というフィールドに具体的な
顧客名 例ABC株式会社 を発見した時という事でしょうか。その場合 顧客名1,顧客名2...と
変数にするのでしょうか。その当りがよくわかりません。

●無限ループに注意してください。



------プロシジャ例-------------------------------
※ rsを前もってレコードセットとして定義
レコードセットをOpenしておく
rs.movefirst
Do until rs.eof

If rs!フィールド1=Kokyakumei then

Do until 条件
ここにループを作る
 Loop 

End If

rs.movenext
Loop
    • good
    • 0

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccessで、フォームからフォームへ値を引き継ぐやり方

フォームからフォームへ値を引き継ぐやり方を教えて下さい。

たとえば、フォームAのテキストボックスに対して取引先コードを入れるような場合に、
取引先検索専用画面(フォームB)で検索して、選択したレコードのデータをフォームAのテキストボックスに入れたいのです。

心優しい方、宜しくお願いいたします。

Aベストアンサー

フォームBにコマンドボタンなどを作成して
クリック時のイベントプロシージャに
forms![フォームA]![テキストボックス名]=me![選択した値のあるコントロール名]
を入れればとりあえず出来るでしょう。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QAccess フォームのテキストボックスに半角英字のみで入力する設定は

IME入力モードをテーブル・フォームともオフにしたのですがひらがな入力モードになってしまいます。
フォームのテキストボックスに半角英字のみで入力する設定としてプロパティのIME入力モードをオフにするやり方自体が間違っているのでしょうか。
それともATOKを使っているなど利用するパソコン側の問題でしょうか

Aベストアンサー

IME入力モードを「使用不可」にしましょう。

QACCESSの表形式で、レコードをクリック→詳細を表示させたい

表題の通りなのですが、ACEESSで、表形式でレコードを表示させています。
これらの詳細を書いたものを、別フォームで作成しています。

要はこの2つを、
表形式のどこかにボタン配置→そのボタンをクリックすると、別フォームで該当テーブルが起動され、見ることができる、
ということを行いたいと思っています。

これらを行うことはできるのでしょうか。
また、できるならその方法をご教授頂けませんでしょうか。
どうぞよろしくお願いします。

Aベストアンサー

>表形式のどこかにボタン配置
表形式のフォームの詳細にボタンをおきます
(ボタンはすべてのレコードに表示されます)

このボタンで別フォームを開くようにしておき
別フォームのソースをクエリデザインビューで開き
主キーフィールドの抽出条件欄に

=Forms!表形式フォーム名!主キーフィールド名

標示したいレコードのボタンを押すと
そのレコードがカレントレコードになり
別フォームの抽出条件としてそのレコードの主キーが渡されます

Qサブフォームでのダブルクリックイベント

Access2003です。
フォームにサブフォームを設置し、直接テーブルを表示させています。
このサブフォームのテーブルのある行をダブルクリックしたら
その行のデータを他のフォームのオブジェクトにセットしたいのですが
行や行のデータ全てを取得は出来るのですが、サブフォームのイベントがEnterとExitしかなくて、イベント発生が出来ません。
フォームのダブルクリックでXとYを見て…と思ったのですがサブフォーム上ではフォームのダブルクリックイベントが発生せず。
サブフォームのテーブルはユーザーがソートする事もあるのでベタに上にテキストボックス等を置く事は出来ません。
どうにかダブルクリックで動作させる方法はありませんでしょうか?

Aベストアンサー

> どうにかダブルクリックで動作させる方法はありませんでしょうか?

前回の質問でも触れたように(下から2つ目の段落)、
http://oshiete1.goo.ne.jp/qa4952701.html

> サブフォームの「コントロールとしてのイベント」は「Enter」と「Exit」の2つしかありませんが、
> ソースオブジェクトに指定したフォーム(上記の例では「SF1」)側で、各種イベント(Open
> その他)が実行

されます。

ですので、No.1の方の回答にもあるように、『既定のビュー』(フォームのプロパティシートの
『書式』タブにあります)を「データシート ビュー」にしたフォームを、サブフォームのソース
オブジェクトにすれば、テーブルと同様の表示で、かつ、ダブルクリック等のイベントを発生
させることができます。
(但し、テーブル/クエリでは「サブデータシート」を表示できますが、これには非対応です)


【重要】
「フォームのダブルクリックイベント」は、データシートの外側(データが表示されていない、
グレーの背景部分)をダブルクリックした時にしか発生しません。
『データシート内でのダブルクリック』でデータを取得するレコードを指定する場合は、面倒
でも「各コントロールのダブルクリックイベント」に処理を記述してやる必要がありますので
ご注意下さい。
(以下のように、他のフォームへの代入を行う部分を、イベントとは別のSubとして作成して、
 各コントロールではそれを呼び出す形にすると、コードを組むのも修正/管理するのも
 比較的楽だと思います)

なお、ダブルクリックした時点で、コントロールの値は「現在のレコードのもの」しか参照
できないので、x,yなどで「どのレコードが選択されたか」の判定は不要です。念のため(汗)


Private Sub 社員コード_DblClick(Cancel As Integer)
  Call FromAtoB
End Sub

Private Sub 氏名_DblClick(Cancel As Integer)
  Call FromAtoB
End Sub

Private Sub FromAtoB()
  With Forms!フォームB   '別フォームの名前が「フォームB」の場合
    !社員コード = Me!社員コード
    !氏名 = Me!氏名
    '(以下、データを転記する処理を必要な追加)
  End With
End Sub

> どうにかダブルクリックで動作させる方法はありませんでしょうか?

前回の質問でも触れたように(下から2つ目の段落)、
http://oshiete1.goo.ne.jp/qa4952701.html

> サブフォームの「コントロールとしてのイベント」は「Enter」と「Exit」の2つしかありませんが、
> ソースオブジェクトに指定したフォーム(上記の例では「SF1」)側で、各種イベント(Open
> その他)が実行

されます。

ですので、No.1の方の回答にもあるように、『既定のビュー』(フォームのプロパティシートの
『書式』タブにあり...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング