- 締切済み
accessのVBAでテーブル更新するには・・・?
[input]フォームより「登録」ボタンを押すことで [data]テーブルの[氏名][住所][電話番号][年齢][性別][コメント]フィールドを更新する動作をVBAだけでさせたいです。 このボタンだけで新規登録と更新登録ように既存データの氏名と住所を参照して入力されたデータが既存なのかを確認するようにしたいです。 dim dbs as database をつかってSQLを書き込んでいけばいけるような気がするのですが どうもうまくいきません。 よろしくお願いします。
- jin0711
- お礼率23% (38/163)
- その他(データベース)
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DVD-RW
- ベストアンサー率36% (195/541)
Dim sqls as String sqls = "DELETE FROM data WHERE 氏名 = '" & [氏名] & "' and 住所 = '" & [住所] & "';" DoCmd.RunSQL sqls sqls = "INSERT INTO data(氏名,住所,電話番号,以下省略) VALUES (" sqls = sqls & " '" & [氏名] & "'" sqls = sqls & ",'" & [住所] & "'" sqls = sqls & ",'" & [電話番号] & "'" sqls = sqls & ",'" & [以下省略] & "'" sqls = sqls & ");" DoCmd.RunSQL sqls 解説 まず、既存のデータの有無を期待せずに、とりあえず[氏名][住所]をキーにレコードを削除してしまいます。 そのあとに、レコードを追加しています。 詳しいことはAccessのリファレンスを参照してください。
DisplayRecord Me, "SELECT * FROM 得意先マスター" UpdateRecord Me, "SELCT * FROM 得意先マスター WHERE ID=" & Me.ID このように、僅か1行にて[得意先マスター]をフォーム[得意先マスター]に表示・更新することも可能です。 ***** いわゆる非連結フォームでフロントエンドを開発したいということでしょうか? であれば、次の諸点についての方策・作法を確立されたがいいかも知れません。 1、主キーをどのように管理するのか? 2、テーブルのデータのフォームへの表示方法。 3、フォームデータに基づきテーブルを更新する方法。 さて、フォームを作成する都度に、これらを実行するコードを書くのは難儀です。 ですから、この3つの手続きは関数化するのがお勧めです。 まず、テーブルの各列に対応するテキストボックスの命名規則を決めればいいです。 例えば、'field_列名' など。 そうすれば、 前述の DisplayRecord()、UpdateRecord() も割りと簡潔なものになります。 なお、[採番テーブル]云々の1についての回答は割愛します。 ' ----------------------------------------------------------------------------------------- ' フォームに読み込んだ列情報を表示します。 ' ' 【要件】 ファームのフィールド名が、<"field_" + 列名>であること。 ' ----------------------------------------------------------------------------------------- Public Function DisplayRecord(ByVal frm As Form, _ ByVal strQuerySQL As String) As Boolean On Error GoTo Err_DisplayRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set rst = New ADODB.Recordset rst.Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not rst.BOF Then ' ================= ' Begin With: frm ' ----------------- With frm N = .Controls.Count - 1 For Each fld In rst.Fields For I = 0 To N If Mid$(.Controls(I).Name, 7) = fld.Name Then .Controls(I).Value = fld.Value Exit For End If Next I Next fld End With ' --------------- ' End With: frm ' =============== Else MsgBox " フォームに表示する情報はありません。(DisplayRecord)", vbInformation, " お知らせ" End If Exit_DisplayRecord: On Error Resume Next rst.Close Set rst = Nothing DisplayRecord = isOK Exit Function Err_DisplayRecord: isOK = False MsgBox "実行時エラーが発生しました。(DisplayRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DisplayRecord End Function Public Function UpdateRecord(ByVal frm As Form, _ ByVal strSQL As String, _ Optional Echo As Boolean = False) As Boolean On Error GoTo Err_UpdateRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim fldName As String Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set cnn = CurrentProject.Connection ' ================= ' Begin With: cnn ' ----------------- With cnn .Errors.Clear .BeginTrans Set rst = New ADODB.Recordset rst.Open strSQL, _ cnn, _ adOpenStatic, _ adLockOptimistic ' ================= ' Begin With: rst ' ----------------- With rst If Not .BOF Then N = frm.Controls.Count - 1 For Each fld In .Fields For I = 0 To N fldName = frm.Controls(I).Name If Left$(fldName, 6) = "field_" Then If Mid$(fldName, 7) = fld.Name Then fld.Value = frm.Controls(I).Value Exit For End If End If Next I Next fld .Update End If End With ' --------------- ' End With: rst ' =============== .CommitTrans End With ' --------------- ' End With: cnn ' =============== If Echo Then MsgBox " 1件のレコードを更新または保存しました。", vbInformation, " お知らせ" End If Exit_UpdateRecord: On Error Resume Next rst.Close Set rst = Nothing UpdateRecord = isOK Exit Function Err_UpdateRecord: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。(UpdateRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_UpdateRecord End Function Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String) MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & CnnErrors.Description & Chr$(13) & _ "・Err.Number=" & CnnErrors.Number & Chr$(13) & _ "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " ADO関数エラーメッセージ" End Sub
関連するQ&A
- エクセルデータをアクセステーブルにコピーするVBA
エクセルファイル E.xlsxにおいて セルA1=ID A2=氏名 A3=性別 A4=住所 というデータがあるとしまして これをアクセスファイル F.accdbにおける テーブルの table1 その項目が ID, 氏名, 性別, 住所, 卒業校, 旧住所 があります。 このエクセルファイル E.xlsxにおける セルA1=ID A2=氏名 A3=性別 A4=住所 というデータを上記F.accdbにおける テーブルの table1 その項目が ID, 氏名, 性別, 住所,に(卒業校, 旧住所は 新規入力はないこととなります) コピー 追加するVBAを御教示願えますか E.xlsxにおいては1行だけのデータですが、 table1には すでに数行のデータが入力済であり、 IDが新規の場合と、すでにtable1に登録済みのIDが存在する場合に 上書きする場合のそれぞれのVBAを 御教示くださりますと助かる次第です よろしくお願い致します win10 office365
- 締切済み
- Access(アクセス)
- アクセス テーブルデータ他のテーブルにコピーVBA
win10 access365のmdbファイルにおいて table1のフィールド1がID 数値型 長整数型 値要求あり 重複あり フィールド2が氏名 短いテキスト型 225 値要求なし 重複あり table2;フィールド1がID 数値型 長整数型 値要求あり 重複あり フィールド2が氏名 短いテキスト型 225 値要求なし 重複あり 上記に置いて table2の新しいデータとして table1のデータをコピーしたい、 ただしtable1には レコードは1行だけとします (table1にレコードが複数行ある場合の最新レコードだけtable2にコピーも出来れば知りたいです) アクセス付属の更新クエリーでは、どうも うまくいきません sqlにおいて UPDATE table1, table2 SET table2.ID = [table1]![ID], table2.氏名 = [table1]![氏名]; 上記動作しません Function table1から2() Dim db As DAO.Database Dim rst As Recordset Dim TB As Table Dim Rdset As Recordset On Error Resume Next Set db = DBEngine(0)(0) Set Rdset = db.OpenRecordset("table2", DB_OPEN_TABLE) Rdset.AddNew Rdset![ID] = Table![table1]![ID] Rdset![氏名] = Table![table1]![氏名] Rdset.Update End Function table1, table2を それぞれ 同名のフォームを作り Function table1から2() Dim db As DAO.Database Dim rst As Recordset Dim fm As Form Dim Rdset As Recordset On Error Resume Next Set db = DBEngine(0)(0) Set fm = Forms![table1] If Rdset.BOF Then Exit Function Else Set Rdset = db.OpenRecordset("table2", DB_OPEN_TABLE) Rdset.AddNew Rdset![ID] = Forms![table1]![ID] Rdset![氏名] = Forms![table1]![氏名] Rdset.Update End If End Function いずれも table2のデータ更新が なされていません すみません 宜しくお願い致します
- ベストアンサー
- Access(アクセス)
- アクセス VBA クエリSQL文変更
以前、教えていただいたにもかかわらず、作業が上手くいったことで、理解を深めることを疎かに してしまい、一部を修正したところ、わからなくなってしまいました。 申し訳ございませんが、教えてください。 Xと同一の構成である X1~という複数のテーブルから一つを選択して、クエリYを実行 クエリYは、フィールド1の値が BBBであるレコードの、フィールド1、3、5を抽出 Dim dbs As DAO.Database Dim qrdef As DAO.QueryDef Set dbs = Currentdb Set qrdef = dbs.QueryDefs("クエリY") qrdef.SQL = Replace(Expression:=qrdef.SQL _ , Find:="テーブルX" _ , Replace:="テーブルX1" _ , Compare:=vbTextCompare) Set qrdef = Nothing Set dbs = Nothing 実行時エラー3075 クエリ式'テーブルX1.フィールド1'の構文エラー:演算子がありません デバッグ qrdef.SQL = Replace(Expression:=qrdef.SQL _ , Find:="テーブルX" _ , Replace:="テーブルX1" _ , Compare:=vbTextCompare) 元となるクエリを直接実行すると正しく動作します。
- ベストアンサー
- オフィス系ソフト
- Vbaでアクセスからエクセルにリンクテーブルする
Vbaでアクセスからエクセルにリンクテーブルするには? エクセルの情報: C:\Users\Desktop¥新規 Microsoft Excel ワークシート.xlsx シート1の情報: フィールド1 フィールド2 あああ aaa いい iii ううう uuu なのですが、 アクセスからVBAでリンクするにはどうすれば良いでしょう? 手作業なら 外部データ→エクセル→外部データの取り込み→リンクテーブルを作成してソースデータにリンクする でリンクできますが、vbaで行いたいです。 Sub Sample01() Dim db As DAO.Database, tb As DAO.TableDef Set db = CurrentDb Set tb = db.TableDefs("Sheet1") tb.Connect = ";DATABASE=" & CurrentProject.FullName & ";TABLE=Sheet1" tb.RefreshLink ' リンク情報の更新 End Sub このコードは意味が違いますよね エクセルのパスとシート名を指定してリンクする方法を教えてください。 最終定期にはシートをループして複数のテーブルを作成したいのです。 リンクが無理ならインポートでもOKです。
- ベストアンサー
- オフィス系ソフト
- ACCESS2000VBAでエラー「型が一致しません」
ACCESS2000で、フォーム上にボタンを作り、そのボタンをクリック時に 以下のイベント プロシージャを実行させています。 Dim dbs As Database Dim rst As Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("採番_相談者") Dim Number rst.MoveFirst Number = rst!相談者番号 Number = Number + 1 Me.相談者NO = Number '相談者NOはフォーム上のテキストボックスです。 で上記 Set rst = dbs.OpenRecordset("採番_相談者") の所で、「実行時エラー 13 型が一致しません」とエラーになります。 テーブル:採番_相談者は、オートナンバー型のIDフィールドと相談者番号という7桁のテキスト型で ”1000001”が入っています。(ちなみに、数値型に変えても同じエラーでした。) 詳しい方教えてください。お願いします。
- ベストアンサー
- Visual Basic
- テーブルのリンク(ACCESS)
ACCESS2003で下記の記述で「実行時エラー ’3219’ 無効な処理です。」というエラーメッセージがでます。 外部mdbでテーブルをリンクさせるとこのエラーがでます。同じmdbファイルにデータテーブルを置くと問題なく処理できます。 参照設定も過去ログを見てチェックしています。 Dim dbs As DAO.Database Dim rst As DAO.Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("テーブル名", dbOpenTable) ACCESS97では何の問題もなかったのですが, 2003ではうまくいきません。 どうかよろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- アクセス2000VBA DAOをADOに書き換えてください
アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With
- ベストアンサー
- オフィス系ソフト
- アクセスのVBAでテキストデータのリンクを更新したいのですが
コードは以下ですが、リンクの更新がうまくいかず更新されずに終了 してしまいます。 Function RefreshLinks(strFileName As String) As Boolean '指定されたデータベースへのリンクを更新します。更新に成功した場合は、True を返します。 Dim dbs As Database Dim intCount As Integer Dim tdf As TableDef 'データベースの全てのテーブルをループします。 Set dbs = CurrentDb For intCount = 0 To dbs.TableDefs.Count - 1 Set tdf = dbs.TableDefs(intCount) 'tdf.connectがある場合、それはリンクテーブルです。 If Len(tdf.Connect) > 0 Then tdf.Connect = "text;databese=" & strFileName Err = 0 On Error Resume Next tdf.RefreshLink 'テーブルのリンクを更新します。 If Err <> 0 Then RefreshLinks = False Exit Function End If End If Next intCount RefreshLinks = True 'リンクの更新が完了しました。 End Function
- 締切済み
- オフィス系ソフト
- Access 外部MDBのリンクテーブルの変更
お世話になってます。 Access2007へ移行のため、移行用のmdbを作成し、移行する既存のmdb群のMSysObjectsを変更しようとしています。 以下のようにVBAで自分のリンクテーブルの接続パスワードは変更できたのですが、同じく他のMDBを指定してリンクテーブルを変更する事は出来るでしょうか? Dim dbs As DAO.Database Dim tdf As DAO.TableDef Set dbs = CurrentDb For Each tdf In dbs.Tabledefs If Len(tdf.Connect > 0 Then tdf.Connect=";PWD=" & strPWD '←リンクテーブルの接続PWDの変更 tdf.RefreshLink End If Next よろしくお願い致します。
- ベストアンサー
- その他(データベース)
- 複数のテーブルから複数条件で新規テーブルへ抽出するには?
こんにちわ。 Windows2000、Access2000という環境下で、 住所録の統合をしようとしています。 簡単な構成は、前任者が、グループ関連会社別に住所録のmdbを作っており、各テーブルのフィールドで主要なものは、「通し番号(各mdbごと)」「氏名」「会社名」「住所」です。 ここで、最終的にテーブルを一つにまとめれば完了としたいところなのですが、 2002年夏の時点での住所録A.mdb 2003年冬の時点での住所録B.mdb 2003年春の時点での住所録C.mdb とあり、それぞれにBの時点での新規入力・(住所等の)更新、Cの時点での新規入力・更新があるのです。 BはAを元に作られており、CはBを元に作られています。 ダブっている部分があるのです。 そこで、AとBを比較してAの中で「氏名」、「会社名」が同じもの以外と、Bのデータを新しいDBのテーブルへ、 新しくできたDBのテーブルとCのテーブルとを比較して、「氏名」「会社名」が同じものは、既存のレコードを消去してCのデータを追加するということをやりたいのです。 つまり、BやCでの更新・新規入力をうまく反映させた形の住所録にしたいのです。 Access自体の使い方に不慣れなもので、この作業がAccessのクエリ等の組み合わせでできるのか、それともSQLやVBAを駆使しないと無理なのかの判断もつきません。 どなたか参考になりそうな操作やSiteを知っていましたら、 教えてください。 よろしくお願いします。
- ベストアンサー
- その他(データベース)