>はじめまして、私は、AccessVBAであるプログラム(仕事用)を作っていますが、初心者でもあり、行き詰まってしまいました。

テーブル1にフィールド1,2,3,4,5があり、各フィールドには、データが入力されています。
テーブル2には、フィールド1,2,3,4,5,6,7があり、フィールド1,2,3はテーブル1のフィールド1,2,3と同じデータが入力されています。
そこで、テーブル2のフィールド4,5に、テーブル1のフィールド4,5のデータを、プログラムを用いて取り込みたいのですが、どうすればいいのですか。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

プログラムを書かずとも、更新クエリを使えばいいと思いますよ。



1:クエリを新規作成して、テーブル1、テーブル2をクエリに追加します。

2:んで、フィールド1,2,3をそれぞれマウスを使って結び付けます。

3:[クエリ]-[更新]を実行

4:テーブル2のフィールド4,5をクエリ下部のフィールド欄に追加

5:フィールド4のレコードの更新欄に「[テーブル1].[フィールド4]」などと入力(カギ括弧は不要)

6:フィールド5についても同様。

7:[!]ボタンをクリック。もしくは、クエリを保存してから、そのクエリをダブルクリックして実行する。

以上で、フィールド4,5の取り込みが完了するはずです。

尚、このクエリをプログラムから実行するには、

CurrentDB.Execute "更新クエリ名"
を実行します。

Dim DB as Database
Set DB = CurrentDB
DB.Execute "更新クエリ名"
MsgBox DB.RecordsAffected
などとすると、変更のあったレコード数を知ることが出来ます。



蛇足になりますが、ご質問の内容に真っ正直に答えるとすると、
複数テーブルを参照する選択クエリを作成(上記を参照)して、
Dim RS As Recordset
Set RS = CurrentDB.OpenRecordSet("クエリ名")

で、複数テーブルをプログラムから開けます。

この回答への補足

早速教えて頂いたとおり行ってみました。
クエリはうまくいったのですが、プログラムで実行する時に、DB AS Databaseの変数確保で、ユーザー定義は使用できないというエラーが、発生してしまいました。
当然ですね、DAOならいいのですがADOでプログラムを作っているのですから、宣言から異なる事に気がつきました。
そこで、
Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection
cn.Execute "クエリ名"
オブジェクトを変えてみたところ成功です。
プログラム完成までは、まだまだ先の長い話ですが今後ともよろしくお願いします。
ありがとうございました。

補足日時:2002/02/10 17:02
    • good
    • 0
この回答へのお礼

今までは、エクセルで行っていたんですが、いろいろ問題もあり、データベースからレポートという、手法が必要となりました。
今回のプログラムは、3月末までに、レポートも含めて完成させなければなりません。
今まで、基礎となるデータを各テーブルを作成し、入力してきました。
今後は、そのデータを用いて、あらゆるレポートを作成しなければなりません。
今回の質問は、その過程における効率化(手作業は不可)の部分です。
したがって、何かのCmdボタンをクリックしただけで、基礎データにあるものは、条件が合えば抽出して、使用するという事柄でした。
一度、クエリについて勉強してみます。
また、ご相談する事と思いますが、よろしくお願いします。

お礼日時:2002/02/09 21:28

「クエリを作成する」ではだめなんですか?

この回答への補足

回答ありがとうございます。
「谷尻かおり書」に更新クエリが掲載されていたので参考にましたが、他テーブルのオープン等プログラムの記述がわからずエラーとなっています。
そのあたりを、参考プログラムで詳しく教えていただけるとありがたいです。

補足日時:2002/02/09 18:59
    • good
    • 0
この回答へのお礼

クエリを作成し、プログラムで実行することとし、成功しました。
プログラム完成までは、まだまだ先の長い話ですが今後ともよろしくお願いします。
ありがとうございました。

お礼日時:2002/02/10 17:07

このQ&Aに関連する人気のQ&A

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

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

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

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

QVB データテーブルA列とB列があった時、B列の1行目から1stepずつデータを入力していきたい

AddDataTableRowメソッドにて
1月として、A列は日付で先に31日分の行が作成されます。その際にB行はNothingで生成しました。
私は、A列はそのままでB列の1行目から1つずつ書き込んでいくコーディングが知りたいです。
現在はAddDataTableRowのためA列の最後の行の次の行が追加され入力されてしまいます。

Aベストアンサー

whereで列BがNothingだけにして、列AのMinの値を取得
列A指定して、狙い打ちでUpdate

Qアクセス2000のデータベースにテーブルを追加して、フィールドを作成したい 

アクセス2000のデータベースがあります。
このファイル「c:\ynet\Hz2data1.mdb」に新しいテーブル「会費管理2」を追加して、フィールドを作成したいのです。
現在は「会費管理2」テーブルがあるのを前提に下記のように書き込みしてみましたが・・・
新しく「会費管理2」テーブルを指定したファイル「c:\ynet\Hz2data1.mdb」に作成してフィールドも作成するのを同時にできるのかしら?
どなたか助けていただければ幸いです。
                                          かしこ



Private Sub コマンド1_Click()
Beep
If (MsgBox("データをアップデートしますが宜しいですか? 作業は一瞬で終わりますよ!!") = 7) Then
End If
Dim cnn As ADODB.Connection
Dim catDB As ADOX.Catalog
Dim tbl As ADOX.Table
Dim colAdo As ADOX.Column
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;"
strCon = strCon & "Data Source=c:\ynet\Hz2data1.mdb"
Set cnn = CurrentProject.Connection
Set catDB = New ADOX.Catalog
catDB.ActiveConnection = cnn
Set tbl = New ADOX.Table
tbl.Name = "会費管理2"


'以下追加したいフィールド
Set colAdo = New ADOX.Column
With colAdo
.Name = "個別台帳ID"
.Type = adInteger
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = New ADOX.Column
With colAdo
.Name = "会費名称ID"
.Type = adInteger
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = New ADOX.Column
With colAdo
.Name = "会費区分ID"
.Type = adInteger
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = New ADOX.Column
With colAdo
.Name = "年度"
.Type = adInteger
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = New ADOX.Column
With colAdo
.Name = "入金日"
.Type = adDate
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = New ADOX.Column
With colAdo
.Name = "入金額"
.Type = adCurrency
.Attributes = adColNullable
End With
tbl.Columns.Append colAdo
Set colAdo = Nothing
Set tbl = Nothing
Set catDB = Nothing
cnn.Close
End Sub

アクセス2000のデータベースがあります。
このファイル「c:\ynet\Hz2data1.mdb」に新しいテーブル「会費管理2」を追加して、フィールドを作成したいのです。
現在は「会費管理2」テーブルがあるのを前提に下記のように書き込みしてみましたが・・・
新しく「会費管理2」テーブルを指定したファイル「c:\ynet\Hz2data1.mdb」に作成してフィールドも作成するのを同時にできるのかしら?
どなたか助けていただければ幸いです。
                                       ...続きを読む

Aベストアンサー

動作確認してみましたので、その内容が参考になればと。
不要であれば、スルーしてください。


事前準備)
・新規 mdb を C:\ynet\test_ynet.mdb として作っておきます。(中身何もなし)
・VBAを記述実行する mdb を新規作成します。
 VBEの画面で標準モジュールを挿入し、以下を記述します。
 FILENAME には、テーブルを作成する mdb のパスを、
 TABLENAME には、作成するテーブル名を記述しておきます。

 ADOBD / ADOX が使えるように、参照設定で設定しておきます。

 実行するのは Sample1 で作成しておいて、Sample2 で追加していくものになります。
(Sample1/2 の違いは★部分だけなので、実際の実行順は関係ないのですけど)

対象の mdb にテーブルが存在しなかったら作成し、あったら追加。
フィールドを重複して追加しようとした時のエラーは、無視して処理を続けるものになります。

Sample1の実行は、Sample1内をクリック後、「F5」キーで、
同様に Sample2 の実行は、Sample2内をクリック後、「F5」キーで行います。

確認は、Sample1実行後、対象ファイルを開いて確認します。
同様に、Sample2実行後、対象ファイルを開いて確認します。

------ 標準モジュールに記述する内容は以下

Const FILENAME = "C:\ynet\test_ynet.mdb"
Const TABLENAME = "会費管理2"

Private Sub SetCol(tbl As ADOX.Table, sName As String, iType As Long)
  Dim colAdo As ADOX.Column

  On Error Resume Next
  Set colAdo = New ADOX.Column
  With colAdo
    .Name = sName
    .Type = iType
    .Attributes = adColNullable
  End With
  tbl.Columns.Append colAdo
  Set colAdo = Nothing
End Sub

Private Sub Sample1()
  Dim cnn As ADODB.Connection
  Dim catDB As ADOX.Catalog
  Dim tbl As ADOX.Table
  Dim sProvider As String
  Dim bNew As Boolean

  sProvider = CurrentProject.Connection.Provider
  Set cnn = New ADODB.Connection
  cnn.Open "Provider=" & sProvider & "; DATA Source='" & FILENAME & "'"
  Set catDB = New ADOX.Catalog
  catDB.ActiveConnection = cnn

  On Error Resume Next
  bNew = False
  Set tbl = catDB.Tables(TABLENAME)
  If (tbl Is Nothing) Then
    Set tbl = New ADOX.Table
    tbl.Name = TABLENAME
    bNew = True
  End If

  Call SetCol(tbl, "数値1", adInteger)
  Call SetCol(tbl, "数値2", adInteger)
  Call SetCol(tbl, "数値3", adInteger)
  Call SetCol(tbl, "日付", adDate)
  Call SetCol(tbl, "金額", adCurrency)

  If (bNew = True) Then
    catDB.Tables.Append tbl
  End If

  catDB.Tables.Refresh

  Set tbl = Nothing
  Set catDB = Nothing
  Set cnn = Nothing
End Sub

Private Sub Sample2()
  Dim cnn As ADODB.Connection
  Dim catDB As ADOX.Catalog
  Dim tbl As ADOX.Table
  Dim sProvider As String
  Dim bNew As Boolean

  sProvider = CurrentProject.Connection.Provider
  Set cnn = New ADODB.Connection
  cnn.Open "Provider=" & sProvider & "; DATA Source='" & FILENAME & "'"
  Set catDB = New ADOX.Catalog
  catDB.ActiveConnection = cnn

  On Error Resume Next
  bNew = False
  Set tbl = catDB.Tables(TABLENAME)
  If (tbl Is Nothing) Then
    Set tbl = New ADOX.Table
    tbl.Name = TABLENAME
    bNew = True
  End If

  Call SetCol(tbl, "数値1", adInteger)
  Call SetCol(tbl, "数値2", adInteger)
  Call SetCol(tbl, "数値3", adInteger)
  Call SetCol(tbl, "日付", adDate)
  Call SetCol(tbl, "金額", adCurrency)

  Call SetCol(tbl, "個別台帳ID", adInteger) ' ★
  Call SetCol(tbl, "会費名称ID", adInteger) ' ★
  Call SetCol(tbl, "会費区分ID", adInteger) ' ★
  Call SetCol(tbl, "年度", adInteger) ' ★
  Call SetCol(tbl, "入金日", adDate) ' ★
  Call SetCol(tbl, "入金額", adCurrency) ' ★

  If (bNew = True) Then
    catDB.Tables.Append tbl
  End If

  catDB.Tables.Refresh

  Set tbl = Nothing
  Set catDB = Nothing
  Set cnn = Nothing
End Sub



Access に記述するVBAということで、Provider に指定する文字列は、
CurrentProject.Connection.Provider
から拾ってきています。

2007で実行したとして、対象ファイルを xxxx.accdb に変更した時でも動作します。
Provider=Microsoft.Jet.OLEDB.4.0;
に固定すると、2007で実行したとしても mdb に限定されます。
(余計なことになりますが)


データが空の時に確認した内容になるので、それ以外は確認してください。

動作確認してみましたので、その内容が参考になればと。
不要であれば、スルーしてください。


事前準備)
・新規 mdb を C:\ynet\test_ynet.mdb として作っておきます。(中身何もなし)
・VBAを記述実行する mdb を新規作成します。
 VBEの画面で標準モジュールを挿入し、以下を記述します。
 FILENAME には、テーブルを作成する mdb のパスを、
 TABLENAME には、作成するテーブル名を記述しておきます。

 ADOBD / ADOX が使えるように、参照設定で設定しておきます。

 実行するのは Samp...続きを読む

QAccessで親テーブルと2つの明細テーブルでできているデータのレポートを作りたい

親テーブルと2つの明細テーブルでできているデータのレポートを作りたいのですが、レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

ウィザードを使って作成するとどうしても以下のようになってしまいます。
(ちなみに親テーブルと明細テーブルは伝票番号でリレーションしています)

↓↓↓↓
伝票番号000001に対して、明細Aテーブル(2レコード)、明細Bテーブル(1レコード)あるとする。
-----------------------------------------------------------
本来は以下のように表示したい

ヘッダーセクション
伝票番号:000001
 親テーブルの情報:xxxxxxx

詳細セクション
 明細Aの情報 01 aaaaaaaa
 明細Aの情報 02 aaaaaaaa
明細Bの情報 11 bbbbbbbb

------------------------------------------------------------
実際は以下のように表示される

ヘッダーセクション
伝票番号:000001
 親テーブルの情報:xxxxxxx

詳細セクション
 明細Aの情報 01 aaaaaaaa 明細Bの情報 11 bbbbbbbb
 明細Aの情報 02 aaaaaaaa 明細Bの情報 11 bbbbbbbb

親テーブルと2つの明細テーブルでできているデータのレポートを作りたいのですが、レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

ウィザードを使って作成するとどうしても以下のようになってしまいます。
(ちなみに親テーブルと明細テーブルは伝票番号でリレーションしています)

↓↓↓↓
伝票番号000001に対して、明細Aテーブル(2レコード)、明細Bテーブル(1レコード)あるとする。
----------------------------------------------...続きを読む

Aベストアンサー

>レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

2つの明細テーブルのデータを表示させる事自体なら、サブフォーム見たくサブレポートを用いれば可能です
ウィザードで作れたかどうかは不明ですが、ベースをウィザードで作りその後デザインで開いてサブレポートで繋げていけば良いと思います

フォームと違ってレポートでの注意点としては
普通に作ると明細Aの情報印字するエリア(サブレーポートA)と明細Bの情報印字するエリア(サブレーポートB)の間に空欄が出来るケースがあります、サブレポートAのエリア幅や高さの調整(コーディングやプロパティー設定など)が必要になります
※フォームならスクロールバーでコト足りるのでしょうが、レポートではスクロールバーなど出すものではありません

そういった調整は複雑になりがちな為、サブレポートがつらなるようなものはあまり作られる事はありません
※ないというわけではない、ここらの制御は想定された制御を記載していく形になる為、想定外が来た場合バグりやすいためあまり用いられないというだけです。
クエリーなどを解しシンプルなレポートにするよう心がける事をおすすめします

・今回のテーブル構成だと、簡単な例としては追加クエリーでワークテーブルに格納し1つの明細テーブルを作り上げ、そのワークテーブルを用いてレポート出力する
・ワークテーブルを持ちいらず行ないたいなら、出きるかどうか不明ですが、クエリーで1つの明細テーブルになるようにSQL文を作成する

質問がAccessバージョンやADPなのかMDBなのか不明ですが
Access2000でのMDBならではの回答です、Accessのバージョンがあがるにつれ機能が豊富になってるので出きるのかもしれませんがAccess2000では以上の回答になります

>レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

2つの明細テーブルのデータを表示させる事自体なら、サブフォーム見たくサブレポートを用いれば可能です
ウィザードで作れたかどうかは不明ですが、ベースをウィザードで作りその後デザインで開いてサブレポートで繋げていけば良いと思います

フォームと違ってレポートでの注意点としては
普通に作ると明細Aの情報印字するエリア(サブレーポートA)と明細Bの情報印字するエリア...続きを読む

Q「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現在のセル( n , "A" )より14行上に数値がないことを確認するために
'14行上のセルを全て足し算しています。
For m = n - 14 To n - 1
s = s + Worksheets("Sheet1").Cells(m, "A").Value
Next

'足し算結果がゼロならば何も記入していないと判断し、
'数字の「1」を記入します。
If s >= 1 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 0
ElseIf s = 0 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 1
End If
End Sub

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現...続きを読む

Aベストアンサー

はいはい了解。

今着目しているセルが (n,1)であるとする。

条件: 今いるところから上に14行サーチして、一度でも1か2の値が見つかったら
     回答を0とする。14行すべてに1・2の値がひとつも含まれていなければ1とする。



Ans = 1

for i = 1 to 14

x = cells ( n - i , 1 ).value

if x = 1 or x = 2
then
Ans = 0
endif
next i


cells ( n , 1 ) = Ans


デフォルトの回答値=1としておき、一回でも条件にヒットしたら回答値=0にする。
ヒットしたらfor~nextを強制的に閉じてもいいけど、面倒なのでそのまま14回検索する。

Qテーブル1から抽出したものをテーブル2に入れたい

ACCESSのVBA初心者です。
基本的な質問で申し訳ないのですが、どうかご教授をお願いします。

まず、まったく同じフィールドを持つテーブル1とテーブル2があります。
抽出したい項目は、テーブル1の中にある[性別]と[登録月]が一致するデータの全てです。
性別と登録月は別のフォームのコンボボックスで選択したもので抽出しようと思っています。

該当するデータが含まれているレコードを全てテーブル2に移したいです。

説明が下手で申し訳ないのですが、どうかご教授をお願い致します。


Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("テーブル1", dbOpenDynaset)
DoCmd.RunSQL "DELETE FROM テーブル2"
rs.Filter = " テーブル1.性別 = テーブル2.性別 & テーブル1.登録月 = テーブル2.登録月"
テーブル2 = テーブル1.RecordsetClone

最初にdeleteがあるのは、前回の抽出条件を消したいからです。
よろしくお願い致します。

ACCESSのVBA初心者です。
基本的な質問で申し訳ないのですが、どうかご教授をお願いします。

まず、まったく同じフィールドを持つテーブル1とテーブル2があります。
抽出したい項目は、テーブル1の中にある[性別]と[登録月]が一致するデータの全てです。
性別と登録月は別のフォームのコンボボックスで選択したもので抽出しようと思っています。

該当するデータが含まれているレコードを全てテーブル2に移したいです。

説明が下手で申し訳ないのですが、どうかご教授をお願い致します。


Dim rs As DAO.Record...続きを読む

Aベストアンサー

SQLはDAOでも実行できると思いますよ。

http://www.accessclub.jp/sql/05.html


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

このカテゴリの人気Q&Aランキング

おすすめ情報