あなたの映画力を試せる!POPLETA映画検定(無料) >>

別のACCESSデータベースのテーブルのレコードを追加したいのです

同じ内容のデータベースが二つあります
データベース1とデータベース2を其々別の人がデータを入力しています
データベース1にデータベース2のテーブルで T_データT_データ明細の二つのレコードを追加したいのですがどの様にすればよいでしょうか

ご指導をお願いいたします。

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

A 回答 (35件中1~10件)

レコードカウントで採番する場合は、



rsInMain.AddNew
rsInMain!番号 = rsInNUM!番号 + 1
rsInMain!項目1 = rsOutMain!項目1
rsInMain!項目2 = rsOutMain!項目2
j = rsInMain!番号
rsInMain.Update

のところで、

rsInMain!番号 = rsInNUM!番号 + 1



rsInMain!番号 = rsInMain.RecordCount + 1

に置き換えればいいです。

それと、

'T_番号の更新
rsInNUM.Edit
rsInNUM!番号 = rsInNUM!番号 + 1
rsInNUM.Update

の部分はコメントアウトするか削除します。


こちらの環境では、レコードソースを
クエリ、テーブル、SQLどれも問題はないのですが。
一応、簡単にT_テーブルでオートフォームでフォームを
つくり、あとボタンをくっつけた簡単な
フォームでやっています。
    • good
    • 0
この回答へのお礼

大変 お世話になりました

ようやく完成いたしました。

どの様にお礼を言って良いのかわかりませんが
今後とも よろしくお願いいたします。


ご指導ありがとうございました。

お礼日時:2010/06/29 02:43

すこし状況がわかりました。


まず、最適化をしてください。

多分、何度もプログラムを入れ替えたり、
データをセットしたりするとファイルの
最適化が必要になることがあります。

この回答への補足

すいません
用事で外出していました 今戻りまして 遅くなりまてすいません

まずプログラム起動時に自動で最適化をしています
それと鉛筆マークは出ていません チェックボックスにチェックを入れ直しても同じで
2回実行しないとダメのようです  ??

それと データベース2のT_データのナンバーを番号テーブルから取っていますが
T_データの最後のレコードを取得した方が良いようです
間違って番号テーブルのデータを消したらヌルでエラーになりますし
生成された番号が違う場合も有りうりますのでT_データの最終レコードを取得した方が確実なので

ご指導頂けますでしょうか

補足日時:2010/06/29 00:14
    • good
    • 0

両方のデータベースを最適化と操作をくりかえしてみてください。

この回答への補足

すいません追加情報です
転送をして そのたびにフォームを閉じると
上手く動きます

補足日時:2010/06/29 01:44
    • good
    • 0

(2)


チェックを入れたときにチェックを入れたレコードの
左端に鉛筆マークが表示されたままボタンクリックを
するとレコードロックのエラーが表示されます。
したがって、鉛筆マークが消えるようにどれか他の
レコードのフィールドをクリックして鉛筆マークが
黒い三角マークになるようにしてください。
これでチェックを入れたレコードの事前処理が
確定したことになります。

この意味はチェックボックスもテキストボックスと
同様に一つのレコードの中のフィールドですから
レコードを確定させるためにチェックをいれたら
フォーカスを他のレコードに移動させて暗黙的に
レコードの更新を確定させるというものです。

したがって、2回ボタンを押したらできるということは
一つのレコードの更新が確定していないが二回押すことに
よりフォーカスが移動してレコードの更新が確定した
ということです。
単独のチェックボックスと違ってレコード帳票フォームなどの
レコードはチェックボックスのチェックを入れただけでは
レコードの確定がしない、ということです。

この回答への補足

ありがとうございます

チェックボックスの件 なんとか自己解決致しました
ありがとうございます

番号の件 よろしくお願いいたします。

補足日時:2010/06/29 02:32
    • good
    • 0

T_データを表示しているのはサブフォームでは


ないですね。

(1)
End Sub の前に
Me.Requery
をいれてください。この場合はサブフォーム
でない場合です。


(2)
チェックを入れたときにチェックを入れたレコードの
左端に鉛筆マークが表示されたままボタンクリックを
するとレコードロックのエラーが表示されます。
したがって、鉛筆マークが消えるようにどれか他の
レコードのフィールドをクリックして鉛筆マークが
黒い三角マークになるようにしてください。
これでチェックを入れたレコードの事前処理が
確定したことになります。

これ以外に何かでていますか。
エラーが表示されていましたか。

テーブルを指定するとどうですか。
    • good
    • 0

>そのまま続けて違うレコードにチェックを入れ


>Private Sub コマンド0_Click()を実行させると
>処理ができません

処理ができないというのはどのような状況ですか。
(1)
フォームからデータが消えない
(2)
転送、削除そのものができない。

この回答への補足

ありがとうございます

(2)転送、削除そのものができない です


2回同じ事をすると 実行できます??

Me.Requery は入れています

補足日時:2010/06/28 17:42
    • good
    • 0

なお、データの削除の部分は単純に前のコードに


削除の部分を追加してだけです。その部分を
はずせば前のコードと同じです。

この回答への補足

ありがとうございます

データベース2のT_データのクエリーを造りそれをフォームに引き込みしチェックボタンを設定
チェックを要れPrivate Sub コマンド0_Click()を実行させると処理されますが
そのまま続けて違うレコードにチェックを入れPrivate Sub コマンド0_Click()を実行させると
処理ができません
おそらくクエリーで取っているためだと思いますが 続けて処理するにはどの様にすればよいでしょうか

ご指導お願いいたします。

補足日時:2010/06/28 14:18
    • good
    • 0

字数がぎりぎりだったのでのですが、


たぶん全部一つにして掲示できたと思います。
追加した部分はたいした文字数ではないのですが、
一つにしようとして、既存のコメントの中の
長い部分を二つくらい除けました。

午前のつもりがお昼ですね。

Loopの終了後、データの削除が始まる前に、
MsgBox("データの転送終了。データの削除開始。")

End Subの前に
MsgBox("処理完了")

などを入れて終了確認をしてもいいかもしれません。
データが少なければあまり意味がないかもしれませんが、
一つの案です。

以上です。データの転送、削除を確認をしてみてください。
    • good
    • 0

Private Sub コマンド0_Click()


Dim dbOut As Database 'データベース2
Dim dbIn As Database 'データベース1
Dim rsOutMain As Recordset 'データベース2のT_データ
Dim rsOutSub As Recordset 'データベース2のT_データ明細
Dim rsInMain As Recordset 'データベース1のT_データ
Dim rsInSub As Recordset 'データベース1のT_データ明細
Dim rsInNUM As Recordset 'データベース1のT_番号
Dim i As Long
Dim j As Long
'データベースの設定
Set dbOut = CurrentDb 'データベース2
Set dbIn = DBEngine.Workspaces(0).OpenDatabase("C:\データベース1.mdb")
'各データベースのテーブルの設定
Set rsOutMain = dbOut.OpenRecordset("T_データ", dbOpenDynaset)
Set rsOutSub = dbOut.OpenRecordset("T_データ明細", dbOpenDynaset)
Set rsInMain = dbIn.OpenRecordset("T_データ", dbOpenDynaset)
Set rsInSub = dbIn.OpenRecordset("T_データ明細", dbOpenDynaset)
Set rsInNUM = dbIn.OpenRecordset("T_番号", dbOpenDynaset)

'T_データのエクスポート(データベース2からデータベース1へ)
rsOutMain.MoveFirst
Do Until rsOutMain.EOF
If rsOutMain!チェック = True Then
'T_データに紐付けられたT_データ明細レコード検出用
i = rsOutMain!番号
'データベース1のT_データへのレコードの追加
rsInMain.AddNew
rsInMain!番号 = rsInNUM!番号 + 1
rsInMain!項目1 = rsOutMain!項目1
rsInMain!項目2 = rsOutMain!項目2
j = rsInMain!番号
rsInMain.Update

'T_データ明細のエクスポート(データベース2からデータベース1へ)
'T_データに紐付けられたT_データ明細のエクスポート
rsOutSub.MoveFirst
Do Until rsOutSub.EOF
If rsOutSub!番号 = i Then
'データベース1のT_データ明細へのレコードの追加
rsInSub.AddNew
rsInSub!番号 = j
rsInSub!名前 = rsOutSub!名前
rsInSub!住所 = rsOutSub!住所
rsInSub!電話 = rsOutSub!電話
rsInSub.Update
End If
rsOutSub.MoveNext
Loop
'T_番号の更新
rsInNUM.Edit
rsInNUM!番号 = rsInNUM!番号 + 1
rsInNUM.Update
End If
rsOutMain.MoveNext
Loop

'T_データの削除
rsOutMain.MoveFirst
Do Until rsOutMain.EOF
If rsOutMain!チェック = True Then
i = rsOutMain!番号
rsOutMain.Delete

'T_データ明細の削除
rsOutSub.MoveFirst
Do Until rsOutSub.EOF
If rsOutSub!番号 = i Then
rsOutSub.Delete
End If
rsOutSub.MoveNext
Loop
End If
rsOutMain.MoveNext
Loop

rsOutMain.Close
Set rsOutMain = Nothing
rsOutSub.Close
Set rsOutSub = Nothing
rsInMain.Close
Set rsInMain = Nothing
rsInSub.Close
Set rsInSub = Nothing
rsInNUM.Close
Set rsInNUM = Nothing
dbOut.Close
Set dbOut = Nothing
dbIn.Close
Set dbIn = Nothing
End Sub
    • good
    • 0

では、転送終了後に、引き続いてチェックの入った


T_データとそれに紐付けられたT_データ明細を
削除するという方法でいきます。

えー、少し一息いれて仕上げておきます。
もう今日になりましたが、午前には
掲示しておきます。いかがでしょうか。

この回答への補足

誠にありがとうございます

piroin654様のご都合でお任せいたします。
この度は すごく勉強になりました。

ご親切、本当に感謝しております。

補足日時:2010/06/28 02:26
    • good
    • 0

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

1  2  3  4 次の回答→

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

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

関連するカテゴリからQ&Aを探す

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

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

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

とか。

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

Q別のaccessファイルからデータの抽出

回答お願いします。

[メインデータ]というアクセスファイルがあり、検査記録のテーブルがあります。
検査記録のテーブルには判定フィールドがあり合格、不合格が入力されます。
この不合格が入力されたレコードを、別のaccessファイル[異常記録]の社内異常記録テーブルにコピーしてきたいです。
この検査記録のフィールド名と社内異常記録のフィールド名は異なっています。

手順としては、
①異常記録ファイルに検査記録のリンクテーブルを作成する。
②クエリにてリンクテーブルから不合格のレコードを選択し、社内異常記録テーブルに追加する。
という方法を教えてもらったのですが、問題がでたので教えてもらいたいです。

この不合格のレコードは検査記録テーブルにそのまま残さなければならないデータなので、②の不合格レコードを抽出し追加するクエリを実行すると、毎回同じ不合格のレコードも追加されてしまいます。
例えば、検査記録に10件の不合格レコードがあり追加クエリで10件の不合格データを社内異常記録テーブルに移します。その後2件不合格のレコードが検査記録に入力されたとします。この時点で検査記録テーブルには12件の不合格レコードがあります。ここでもう一度追加クエリで不合格のレコードを追加クエリで移すと先の10件+12件で22件のレコードになってしまいます。当然前の10件は重複したレコードになっています。

これを解決する方法はありますか?
削除クエリで追加クエリ前に全データを削除も考えたのですが、社内異常記録のテーブルには手入力する箇所が複数あるので削除は使えません。
リンクテーブルも下手に触ってしまうと検査記録に支障が出てしまうので、出来ればリンクテーブルを使わない方法があれば教えてもらいたいです。

ややこしい話ですので、その都度追記させてもらいますのでよろしくお願いします。

回答お願いします。

[メインデータ]というアクセスファイルがあり、検査記録のテーブルがあります。
検査記録のテーブルには判定フィールドがあり合格、不合格が入力されます。
この不合格が入力されたレコードを、別のaccessファイル[異常記録]の社内異常記録テーブルにコピーしてきたいです。
この検査記録のフィールド名と社内異常記録のフィールド名は異なっています。

手順としては、
①異常記録ファイルに検査記録のリンクテーブルを作成する。
②クエリにてリンクテーブルから不合格のレコードを...続きを読む

Aベストアンサー

スッキリと分かるようになりました。
以下は異常記録.accdbのパスをE:\folderU\異常記録.accdbにしてある場合のSQL文です。
そちらの環境に合わせて変更してください。
そのSQL文をメインデータ.accdbの新規クエリのSQLビューにコピペし
出来た更新クエリを走らせてみてください。

INSERT INTO 社内異常記録 ( 検査番号, 社名, 品名, 測定値 ) IN 'E:\folderU\異常記録.accdb'
SELECT 検査番号, 社名, 品名, 測定値1 & '/' & 測定値2 AS 測定値
FROM 検査記録
WHERE 検査番号 NOT IN (SELECT 検査番号 FROM 社内異常記録 IN 'E:\folderU\異常記録.accdb');

なお、確認ですが
異常記録.accdb
  社内異常記録
    No オートナンバー型 主キー・インデックス有
    検査番号  テキスト型 インデックス無
    社名    同上
    品名    同上
    測定値 同上
の検査番号フィールドには、メインデータ.accdbの検査番号が入るのですよね?
でしたら、データ型を長整数型にしてください。
また、念のため、インデックス有・重複なしに設定しておいた方が安全のように思えます。
あと、Noというフィールド名は適切でないので、IDなどに変更をお勧めします。

スッキリと分かるようになりました。
以下は異常記録.accdbのパスをE:\folderU\異常記録.accdbにしてある場合のSQL文です。
そちらの環境に合わせて変更してください。
そのSQL文をメインデータ.accdbの新規クエリのSQLビューにコピペし
出来た更新クエリを走らせてみてください。

INSERT INTO 社内異常記録 ( 検査番号, 社名, 品名, 測定値 ) IN 'E:\folderU\異常記録.accdb'
SELECT 検査番号, 社名, 品名, 測定値1 & '/' & 測定値2 AS 測定値
FROM 検査記録
WHERE 検査番号 NOT IN (SELECT 検査番号...続きを読む

QAccessで別mdbのテーブルをコピー

VBで同じような質問をされている方はいたのですが、
ACCESS VBAでの方法がよくわからないので、教えてください。

別フォルダにあるmdbからテーブルをコピーしたいのですが、
どのようにしたらいいのでしょうか。

DoCmd.CopyObjectを使うと、コピー先を指定することはできるようですが、
コピー元を指定してコピーする方法を教えてください。

よろしくお願いします。

Aベストアンサー

DoCmd.TransferDatabase acImport, "Microsoft Access", "C:\元データ.mdb", acTable, "元テーブル名","新テーブル名"
みたいな方法でどうでしょうか?
詳しくはHelpを見てください。
p.s.
すでに同名のテーブルがある場合は、別名でインポートされるようです。
Access2000ではそうでした。

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で分からない事があり質問させてください。

<会社テーブル>
会社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 サブフォームでの選択行の取得

こんにちは。

Access初心者です。

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

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

Aベストアンサー

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

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

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


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

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

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

Me.CurrentRecord

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

Q(ACCESS)複数mdbからのデータ取得方法

よろしくお願いします。
ACCESSはあまり使ったことがない者です。
下記ようなACCESSのデータ取得の方法を教えてください。

構造の同じテーブルを持つ複数のmdbから、1つのリストを作りたいと考えています。
各mdbの違いは、ファイル名と中身のデータのみで、他は全く同じです(ひとつのテンプレートの複製です)。

A部門.mdb (商品リストテーブル ・・・A部門の商品リスト)
B部門.mdb (商品リストテーブル ・・・B部門の商品リスト)

Z部門.mdb (商品リストテーブル ・・・Z部門の商品リスト)

全商品リスト.csv (全社分の商品リストテーブルのデータ)

mdbが数十ファイルあるので、一つずつcsv取得して繋げるのはたいへんです・・・。
何か一発で取得できるような方法はないでしょうか?
ユニオンクエリ?等を使うとできるのでしょうか・・・。
同じフォルダ下にあるmdbを次々に開いて同じクエリを実行する機能とか、マクロとか?

現状こうなってしまっており、一つのmdbに統合するのは、運用上制約があって無理なのです。

何かうまいアイデアがあれば教えていただきたくお願いします。

よろしくお願いします。
ACCESSはあまり使ったことがない者です。
下記ようなACCESSのデータ取得の方法を教えてください。

構造の同じテーブルを持つ複数のmdbから、1つのリストを作りたいと考えています。
各mdbの違いは、ファイル名と中身のデータのみで、他は全く同じです(ひとつのテンプレートの複製です)。

A部門.mdb (商品リストテーブル ・・・A部門の商品リスト)
B部門.mdb (商品リストテーブル ・・・B部門の商品リスト)

Z部門.mdb (商品リストテーブル ・・・Z部門の商品リスト...続きを読む

Aベストアンサー

VBAによる処理ですが。

データの取り出しで、配列を使ったり、SQL文でレコードを
取り出したりすることもありますが、一応ノーマルにしておきます。

前提として、mdbファイルが一つのフォルダにあるものとします。
新しいmdbファイルを同じフォルダに作り、名前を 「司令塔.mdb」
とします。一応、「商品リストテーブル」の構造は、

商品ID、商品名、価格、サイズ

のようしておきます。違うようでしたら補足してください。
分かりやすいように「司令塔.mdb」にフォームを作り、
それにボタンを設定し、そのクリックイベントに以下を
設定します。ボタンの名前などは適当にしています。
標準モジュールでボタンクリックの中身を実行しても
同じではありますが。


設定が終わったらコード表のツールから参照設定を
選択して、Microsoft DAO xx Object Library に
チェックを入れてOKとしてください。xxは3.6のような
数字です。



Private Sub コマンド1_Click()
  If MsgBox("データをCSVへ移します。よろしいですか", vbYesNo) = vbNo Then Exit Sub
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim strFile As String

  'mdbファイルの検索用
  strFile = Dir(CurrentProject.Path & "\" & "*.mdb", vbNormal)

  'CSVファイルのオープン、なければ作成
  Open CurrentProject.Path & "\" & "全商品リスト.csv" For Append Access Write As #1

  'CSVファイルへの書き込み作業
  Do While strFile <> ""
    If strFile <> "司令塔.mdb" Then
      Set db = DBEngine.Workspaces(0).OpenDatabase(CurrentProject.Path & "\" & strFile)
      Set rs = db.OpenRecordset("商品リストテーブル")

      'テーブルからデータを取り出しCSVへ
      If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
          Print #1, rs!商品ID & "," & rs!商品名 & "," & rs!価格 & "," & rs!サイズ & ","
          rs.MoveNext
        Loop
      End If

      rs.Close: Set rs = Nothing
      db.Close: Set db = Nothing
    End If
    strFile = Dir()
  Loop

  Close #1
  MsgBox ("データの移動が終了しました")
End Sub


なお、"全商品リスト.csv"がすでに存在している場合の
処理はしていません。その処理が必要ならば以下に
http://oshiete.goo.ne.jp/qa/7324183.html
しています。参考に。

わからないところがあれば補足してください。

VBAによる処理ですが。

データの取り出しで、配列を使ったり、SQL文でレコードを
取り出したりすることもありますが、一応ノーマルにしておきます。

前提として、mdbファイルが一つのフォルダにあるものとします。
新しいmdbファイルを同じフォルダに作り、名前を 「司令塔.mdb」
とします。一応、「商品リストテーブル」の構造は、

商品ID、商品名、価格、サイズ

のようしておきます。違うようでしたら補足してください。
分かりやすいように「司令塔.mdb」にフォームを作り、
それにボタンを設定し、そのク...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "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)

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


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

人気Q&Aランキング

価格.com 格安SIM 料金比較