- ベストアンサー
AccessのDAOでフィールド名を配列に格納して・・・
Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。 Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable) Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable) Do Until Rs1.EOF Rs2.AddNew Rs2!FL1 = Rs1!名前 Rs2!FL2= Rs1!性別 Rs2!FL3= Rs1!郵便番号 Rs2!FL4= Rs1!住所 ・ ・ Rs2! FL50= Rs1! 50番目 Rs2.Update Rs1.MoveNext Loop 複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。 Dim I Dim FieldsName FieldsName=Array("名前","性別",・・・"50番目") ・ ・ Do Until Rs1.EOF Rs2.AddNew For I=0 To 49 Rs2!フィールド(I) = Rs1!FieldsName(I) Next Rs2.Update Rs1.MoveNext Loop じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。 For I=0 To 49 Rs2!フィールド(I) = Rs1!Td.Fields(I).Name Next やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。
- souta_n
- お礼率85% (391/456)
- Visual Basic
- 回答数3
- ありがとう数4
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 一応自分なりにコードを作ってみました。 Dim I As Integer, Db As Database, Rs1 As Recordset, Rs2 As Recordset Set Db = CurrentDb Set Rs1 = Db.OpenRecordset("複写元") Set Rs2 = Db.OpenRecordset("複写先") Do Until Rs1.EOF Rs2.AddNew For I = 0 To 49 Rs2.Fields(I).Value = Rs1.Fields(I).Value Next Rs2.Update Rs1.MoveNext Loop Rs2.Close Rs1.Close Set Rs2 = Nothing Set Rs1 = Nothing Set Db = Nothing でいいと思います。ただし、前提条件として、テーブル「複写先」を作っていないとできませんが。 ご参考までに。
その他の回答 (2)
- kinokoyasan2004
- ベストアンサー率59% (16/27)
こんにちわ。 Dim I As Integr Set Rs1 = Db.OpenRecordset("複写元") Set Rs2 = Db.OpenRecordset("複写先") For I=0 To 49 Rs2.Fields(I).Value= Rs1.Fields(I).Value Next でいいはずです。ちなみに、Dbは、 Set Db = CurrentDb ってしてます(・・?
お礼
できました、できました。ありがとうございます。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 Rs2.Fields(FieldsName(I)) = Rs1.Fields(FieldsName(I)) でどうですか。
お礼
maruru01さん、いつもお世話になります。 やってみましたが、エラーになりFieldsNameが青色に、プロシージャ名の行が黄色になり、SubまたはFunctionが無いとのたまいよります。多分私のコーディングのどこかがおかしいのでしょう。#2の答えでうまく動きましたので、とりあえずそちらでやります。ありがとうございました。
関連するQ&A
- ACCESS ADOのMovePreviousについて
毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2 1 あ 2 い 3 う 4 え 5 お コード Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly Do Until rs.EOF rs.MoveNext Loop rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value rs.MoveNext rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。
- ベストアンサー
- その他(データベース)
- ASPのSession変数を配列にしたいのですが。。。
ASPのSession変数を配列にして使用したいのですが、どのように表記すればいいのでしょうか? Do Until rs.EOF ID=Session("ID(i)") i=i+1 rs.MoveNext Loop という感じに使用したいのですが。。。
- 締切済み
- Microsoft ASP
- Access VBA 添付型フィールド
Access VBAで添付型フィールドからファイル名を取りだしたいのですが、どのようにすればいいでしょうか? Private Sub Sample() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String Set DB = CurrentDb SQL_1 = "SELECT * FROM ボランティア情報 ORDER BY 分野 & 団体名読み;" Set RS = DB.OpenRecordset(SQL_1, dbOpenDynaset) With RS Do While Not .EOF MsgBox (!写真.FileName) ←ここでエラーが出ます。 . MoveNext Loop End With RS.Close Set RS = Nothing Set MDB = Nothing End Sub
- ベストアンサー
- Visual Basic
- ACCESSでデータセット時、項目を可変にしたい
よろしくお願いしますm(__)m MDBであるテーブルのある項目に、データを セットする際、項目名を可変にしたいのですが、 方法が分からないので、教えて下さい><; Public Sub AAA(テ As String, 項 As String) SQL = "select" & 項 SQL = SQL$ & " from " & テ Set rs = cdb.OpenRecordset(SQL) Do Until rs.EOF rs.Edit ********************************************** rs![項] = "あいう" ←入れ先を可変にしたい ********************************************** rs.Update rs.MoveNext Loop
- ベストアンサー
- その他(プログラミング・開発)
- MySQLからフィールド名のリストを取り出し、一部のフィールド名を除外したい場合
PHP + MySQLにて テーブルからフィールド名だけを取得し、さらに一部のフィールド名を除外したいです。 レコードじゃないのでis not構文は使えませんでした。 何かいい方法があれば教えてください。 $sql = "select * from table"; //tableテーブルからフィールド名を取り出し $rs = mysql_query($sql); $fields = mysql_num_fields($rs); $column = array(); for ( $i=0; $i<$fields; $i++ ) { $column[$i] = mysql_field_name($rs, $i); }
- ベストアンサー
- MySQL
- VB6.0DataGridでのUpdate文で疑問?
ADOの勉強したばっかりで、あまり詳しくありませんのでよろしくお願いします。 DataGridを使ってある条件で抽出しています。その抽出したものを更新したいのですが、 Do rs!分類ID = text1 rs.Update rs.MoveNext Loop Until rs.EOF という命令を書くと、いいような気がするのですが、なぜか抽出したデータが一個おきに書き換わります。 でも、 Do rs!分類ID = text1 rs.Update rs.MoveNext if rs.EOF then rs.Previous END IF Loop Until rs.EOF と命令するとすべてのデータが書き換わります。 なぜなんでしょうか?疑問です。 VB6.0、ACCESS2000です。
- 締切済み
- その他(プログラミング・開発)
- 【VB】コンボボックスにデータベースから取り出した値を入れたい
VB2005です。 表題の通りですがやり方がよくわかりません。 データベースに接続し、 SQLで重複しない値を取り出すところまではできています。 SQL=SELECT DISTINCT FieldName FROM TableName VB6の時はこんなソースでした Do Until rs.EOF Combo1.AddItem.Fields("FieldName") rs.MoveNext Loop VB2005ではどう書くのでしょう? よろしくご教授ください。
- ベストアンサー
- Visual Basic
- access vbでループ処理
レコードセットでテーブルの内容をフォームのテキストボックスに表示 させたいのですが、vbの知識が無く困ってます。以下の処理をループ処理で 簡単に出来ないでしょうか。 ' PASU1 = rs!PASU ' rs.MoveNext ' PASU2 = rs!PASU ' rs.MoveNext ' PASU3 = rs!PASU ' rs.MoveNext ' PASU4 = rs!PASU ' rs.MoveNext ' PASU5 = rs!PASU ' rs.MoveNext ' PASU6 = rs!PASU レコードセットは, Do Until rs.EOF loop を用いれば繰り返し出来ると解っているのですがフォームの, PASU[1,2,3,,,]の数字の部分を指定することが出来ずにいます。 変数など駆使すれば出来ると思うのですが良くわかりません。 どなたか教えてください。
- ベストアンサー
- その他(データベース)
- dbOpenTableとdbOpenDynaset
Access2003 で開発をしています。 サブフォームで選択行のある項目の値を取得したいのですが、 下記ロジック(1)で正しく動作するアプリAと、動作しないアプリBが出てきました。 動作しないアプリは、他の行の値を取ってきてしまいます。 【ロジック(1)】 Set db = CurrentDb Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenTable) Cnt = 1 If rs.BOF = True And rs.EOF = True Then Else Do Until Cnt = Forms![メイン]![サブフォーム].Form.CurrentRecord rs.MoveNext Cnt = Cnt + 1 Loop MsgBox ("項目1の値:" & rs![項目1]) End If 色々調べたところ、正しく動かないアプリでは、ロジックを下記(2)のように変更したら、 正しく動きました。 【ロジック(2)】 Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenDynaset) MsgBox ("項目1の値:" & rs.Fields("項目1").Value) こちらのロジックの方が簡単なのもありますが、 テーブルをopenする際、dbOpenTable と dbOpenDynaset がありますが、 サブフォームのレコードを扱う際には、dbOpenDynaset にするべきなのでしょうか。 ロジック(1)で正しく動作していると思われるアプリAは、現在稼動中のため、 ロジックに間違いがなければそのままにしたいのですが、 ロジック(1)の dbOpenDynaset だと間違いで不具合が起きる可能性があるのでしょうか? ご教授いただければ幸いです。 よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- ACCESS VBAからDAOを使ってのExcelファイル読み込みについて
以前もお世話になりました。またよろしくお願いできますでしょうか。(OS: XP , Access 2003) 今回はACCESS VBA からDAOを使ってのExcelファイルの読み込みを試みています。 最初はTransferSpreadsheetを使ってうまく行っている様に見えたのですが、Quit及びSet XLApp=Nothingをちゃんとしていても、タスクマネージャーを開けると裏でEXCELが走っている状態でした。 他サイトで同じ現象の解決でAddNewが提案されており、そのサイトの例と他のDAOを使っている例を自分用にアレンジしてみました。 (他サイトのURL張っていいのかわからないので外しておきます) エラー1)Import元のファイルを開けていないと"External table is not in the expected format" でOpenDatabaseの行で止まります。これは仕様でしょうか?わざわざ Excel.Applicationなどで開けないと行けないということですか? エラー2)"Run-time error 1004. Method 'Range' of object '_Global' failed"。ファイルを開けて実行した場合Rangeの所で止まります。Public subにしたりしましたが関係なかったようです。 申し訳ありませんが、アドバイスお願い致します。 ------- Sub loadToDB() Dim rs, rs2 As DAO.Recordset Dim db As DAO.Database Dim SheetName As String Set db = OpenDatabase("U:\projects\ABC\TestFile.xls", False, False, "Excel 8.0;") ’ファイルを開けていないとまずここで SheetName = db.TableDefs(0).Name Set rs = db.OpenRecordset(SheetName) Set rs2 = CurrentDb.OpenRecordset("TableA") Do Until rs.EOF rs2.AddNew rs!F1 = Range("A1").Value ’ファイル開けているとここで駄目です rs!F2 = Range("B1").Value rs!F3 = Range("C1").Value rs!F4 = Range("D1").Value rs2.Update rs.MoveNext Loop rs.Close Set rs = Nothing db.Close Set db = Nothing rs2.Close Set rs2 = Nothing End Sub
- ベストアンサー
- Visual Basic
お礼
重ね重ね親切丁寧なコーディング例ありがとうございます。 今後とも宜しくお願いします。