Access VBAで指定フォルダの名簿.csvをインポートし、フィールドを追加する方法

このQ&Aのポイント
  • Access VBAを使用して、指定のフォルダにある「名簿.csv」をインポートし、テーブルの先頭にフィールド[Unique_ID]を追加し、値に[姓]と[名]を組み合わせてセットする方法を教えてください。
  • インポートする際に、姓が空白の場合はレコードを削除して、[Unique_ID]にnullを入れないようにしていますが、フィールドの追加とレコードの追加方法がわかりません。どのような方法がありますか?
  • また、このプログラムを実行する際に指定するフォルダは、VBA内で選択するようになっていますか?
回答を見る
  • ベストアンサー

Access VBA フィールドの追加とデータ

こんにちは。 Access2003のVBAで質問です。 やりたいことは、指定フォルダにある「名簿.csv」をインポートし、テーブルの先頭に、フィールド[Unique_ID]を追加して、値に(フィールド[姓]&フィールド[名])をセットしたいのです。 インポートして、姓が空白のときは、レコードを削除することで、[Unique_ID]にnullがはいらないということはできましたが、肝心なフィールドの追加とレコードの追加がわかりません。 どのような方法があるでしょうか? ご教授よろしくお願いします。 Dim fpass As String Dim Dlfile As String Dim Fd As FileDialog Dim Fchk As String Dlfile = MsgBox("マスタデータを更新しますか?", vbOKCancel + vbExclamation + vbDefaultButton2) If Dlfile = vbCancel Then GoTo Exit_DT_UP_Click Const msoFileDialogFolderPicker = 4 Set Fd = Application.FileDialog(msoFileDialogFolderPicker) With Fd .Title = "更新データのフォルダを指定してください。" .AllowMultiSelect = False If .Show = False Then GoTo CkErr_DT_UP_Click fpass = .selecteditems(1) End With Dlfile = fpass & "\名簿.csv" Fchk = Dir(Dlfile, vbNormal) If (Fchk = "") Then GoTo CkErr_DT_UP_Click DoCmd.TransferText acImportDelim, "", "名簿", Dlfile, True, "", 65001 'ADO Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "名簿", cn, adOpenKeyset, adLockOptimistic Do Until rs.EOF If IsNull(InStr(rs!姓, "")) Then rs.Delete Else 'レコード追加? End If rs.MoveNext Loop rs.Close Set rs = Nothing Set cn = Nothing CkErr_DT_UP_Click: Set Fd = Nothing Exit_DT_UP_Click: Exit Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

ADO・ADOX で変更できるかまでは探し当てていませんが Googleにあたり、どうも、キーワードとして ORDINAL_POSITION や OpenSchema 辺りが有効の様です。 参照するだけなら http://www.gizcollabo.jp/vbtomo/log/archive/choshoqa_24010_0.html とか色々ありますが 変更に関しては可能か否かも含めて見つけてません。 分かったら私めにも教えてくださいませ。<m(__)m> もう一つ レコードが 1,a 2, 3,c 4,d となっていた場合に 2のレコードを削除した時に、カレントレコードの位置が 1,aになるのか、それとも、3,cになるのかの確認も必要かも?

cricket5
質問者

お礼

お正月休みも含めて調べましたが、わかりませんでした。 結局、インポート元が対応することになりました。 ありがとうございました。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

決して茶々を入れるつもりではありません。ご了承ください。 >フィールド[Unique_ID]を追加して Set cn = CurrentProject.Connection Cn.execute "Alter Table 名簿 Add Column Unique_ID Char(12)" で出来るかと思いますけど、同姓同名の存在の可能性を考えると Unique_ID というフィールド名はそぐわないと思いません? >テーブルの先頭に DAOに参照設定が必要ですが CurrentDB.TableDef("名簿").Fields("Unique_ID").OrdinalPosition =0 で出来るかもしれませんがほとんど分かりません。(見た目には拘らない性格だし・・) Kiku さんの検証をご覧ください。 http://kikutips.blog13.fc2.com/blog-entry-74.html >rs.Open "名簿", cn, adOpenKeyset, adLockOptimistic rs.Open "SELECT * FROM 名簿 WHERE 姓 Is Not Null", cn, adOpenForwardOnly, adLockPessimistic にしておけば ループ中のIsNull判定が不要ですし、他のユーザーの変更も防げ、少し処理速度が上がります。 rs.edit rs!Unique_ID = rs!姓 & rs!名 rs.update で変更できますが、そもそも『姓』と『名』というフィールドがあるので クエリでも「姓名」に連結出来るので不要な処理とも考えられます。 また、Unique_ID に姓名をセットするなら レコードセットを廻さなくても更新クエリで一発だとおもいます。 UPDATE 名簿 SET [Unique_ID] = [姓] & [名] WHERE [姓] Is Not Null ※バックアップを取ってからお試しください。 ps. 『姓』にデータが無かったら消すのでしたか、なら DELETRE * FROM 名簿 WHERE 姓 IS NULL の削除クエリで。 説明下手で _(._.)_ 勘違い有っても <(_ _)>

cricket5
質問者

お礼

ご回答いただきありがとうございます。いろいろなご指摘、勉強になります。 フィールドの位置は、やはりADOでは、設定できないのでしょうか ちなみに、 インポートのデータがあまりにも大きいのと、10種類ほどインポートするため、姓=nullをテーブルから削除して、小さくしたいということを考えています。 名簿や姓、名としていますが、Stringでの説明しやすい名称にしております。 また、もろもろ事情がありまして、クエリではなくVBで行いたいのです。

noname#192382
noname#192382
回答No.1

この種の仕事はエクセルが得意ですから、データをエクセルに下請けに出してやったらいかがですか。 エクセルで第1カラムにカラムを挿入し、第2カラムのデータと第3カラムのデータをつないで第1カラムにいれる作業は次のプログラムで出来ます。データ数は3つの場合です。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2012/12/24 ユーザー名 : ' ' Dim mygyo As Integer Columns("A:A").Select Selection.Insert Shift:=xlToRight For mygyo = 2 To 4 Cells(mygyo, 1) = Cells(mygyo, 2) & Cells(mygyo, 3) '姓が第2カラム、名が第3カラムの場合 Next End Sub

cricket5
質問者

お礼

ご回答ありがとうございます。 今回は、アクセスでシステム化して、エンジン配布を考えておりますので、アクセスだけで完結したいのです。 VBAまで、作成していただいて、ありがとうございました。

関連するQ&A

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • [VBA] ADOの Clone と AddNew

    Access VBA 学習中の初心者です。ADOについて教えて下さい。 RecordsetオブジェクトのCloneメソッドを使用してレコードのコピーを行う以下のプロシージャで、 If Not rs.EOF Then の存在意義がわかりません。 1. rsClone に対象のレコードがあった場合は次行からの処理をする、ということであれば If Not rsClone.EOF Then にすれば良いかと思うのですが、それでは違いますでしょうか? 2. とある人に聞いたところ、 「rsのカレントがEOFだとAddNewでエラーになるから、そのエラー回避のためそうなっている」 と言われたのですが、 テキストやヘルプで AddNewメソッド についてそのような注意事項を見つけられませんでした。 自分なりに試してみてもその条件下でエラーになりませんでした。(試し方に自信ないですが。) AddNewメソッドを使う際にEOFであるかどうか気にした方が良いものなのでしょうか? 質問が分かりづらく、ご回答頂くにあたり追加の情報が必要でしたらご指摘下さい。 「プロシージャをこうした方がわかりやすい、適切」などのご意見も歓迎です。 どうぞよろしくお願いいたします。 -------------------------- Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim rsClone As ADODB.Recordset Dim myField As Variant, cnt As Integer Set cn = CurrentProject.Connection rs.Open "名簿", cn, adOpenStatic, adLockOptimistic Set rsClone = rs.Clone(adLockReadOnly) rs.Clone.Bookmark = rs.Bookmark rsClone.Find "名簿 like '山田 太郎'" If Not rs.EOF Then                 ←★★★質問★★★ rs.AddNew cnt = 0 For Each myField In rsClone.Fields rs.Fields(cnt) = myField cnt = cnt + 1 Next End If rs.Update rs.Clone.Close Set rsClone = Nothing rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub

  • 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

  • VBAのデバックをどなたかお手伝いください。

    もちろん自分でも調べてはいるのですが、急いでいるため、もしどなたか教えてくだされば大変助かります。 この(下記の)Then 以降からがわかりません。 Do Until rs.EOF '該当レコードあり If rs!MCD = "3162" Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価世代1 = rs!仕入単価 rs!仕入単価 = rs2!discount End If '--------------------------------------------- rs!更新日 = Now() rs.Update End If 情報が不足していればお答えします。どうぞ宜しくお願いいたします。 (補足)これより前に入力されているのは以下のものです。 Dim cn As ADODB.Connection Dim cn2 As ADODB.Connection Dim rs As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim strmsg As String Dim lngRet As Long Dim strcriteria As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset Set cn2 = CurrentProject.Connection Set rs2 = New ADODB.Recordset rs.Open "商品2_T", cn, adOpenKeyset, adLockOptimistic rs2.Open "商品2_T25discountてすと", cn2, adOpenKeyset, adLockOptimistic

  • アクセス VBAのエラー

    以下のコードをwindowsXPで問題なく使っていましたが、windows7で使ったところ 「保存できません」というエラーメッセージが出ます。ただ全く同じコードを(だと思うのですが)リストボックスのダブルクリックで実行すると作動します。参考に二つのコードを書いておきます。 何か原因に心当たりのある方よろしくお願いします。 (コマンドボタン) Private Sub コマンド選択_Click() Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub (ダブルクリック) Private Sub リスト会員_DblClick(Cancel As Integer) Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

  • excel vba で .mdb のデータ抽出

    excel vba で postdata.mdbのpostレコードから条件に合うデータを抽出しようとしています。 数日間、いろいろ調べていますが分かりません。 おそらく、SQLの部分だと思うのですが・・・ adoは初めて使う素人なので教えていただけないでしょうか。 On Error GoTo ErrGyo Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Open ThisWorkbook.Path & "\postdata.mdb" Dim Rs As ADODB.Recordset Dim SQL As String Dim T_ken As String Dim T_si As String Dim T_mati As String Dim i As Long T_ken = TextBox1.Value  ’フォームにテキストボックス T_si = TextBox2.Value T_mati = TextBox3.Value SQL = "SELECT * FROM post WHERE ken like '" & T_ken & "' and si LIKE '" & T_si & "' and mati LIKE '" & T_mati & "'" Set Rs = New ADODB.Recordset Rs.Open SQL, cn, adOpenForwardOnly, adLockReadOnly MsgBox Rs.RecordCount  ’ここでチェックすると -1 となる??? If Rs.RecordCount = 0 Then MsgBox "該当するレコードは見つかりませんでした。", vbInformation Else For i = 1 To Rs.RecordCount Cells(i, 1) = Rs!num Cells(i, 2) = Rs!ken Cells(i, 3) = Rs!si Cells(i, 4) = Rs!mati Rs.MoveNext Next End If Rs.Close: Set Rs = Nothing cn.Close: Set cn = Nothing Exit Sub ErrGyo: MsgBox "postdataへの接続に失敗しました", vbCritical

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • Accessのテーブルの文字列フィールドにVBAでアクセスするには?

    いつもお世話になっております。困っていることがありますので教えていただければ幸いです。 AccessのテーブルAに、メモ型のフィールドBがあり、1000文字くらいの文字が入っています。VBAの関数Cの中でそのテーブルにアクセスし、1000文字をいろいろ処理したいと思っています。見よう見まねで試しに Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim FileNum As Integer Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open テーブルA, cn, adOpenDynamic, adLockOptimistic msgbox !フィールドB としてみたのですが、なぜか255文字までしか表示されません。VBAを用いてテーブル(やクエリ)にアクセスし、256文字以上の文字列を扱う方法はありませんでしょうか? 何かこちらで勘違いしているところがありましたら、ご指摘いただければと思います。よろしくお願いします。

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • access 初心者です。

    Private Sub 患者番号_AfterUpdate() Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Set Cn = CurrentProject.Connection Set Rs = New ADODB.Recordset Rs.Open "[tbl個人情報]", Cn, adOpenKeyset, adLockOptimistic Rs.Find "[患者番号] = " & Me![患者番号] If Rs.EOF Then MsgBox "レコードが見つかりません。ID=" & Me![患者番号] Else Me![性] = Rs![性] End If Rs.Close: Set Rs = Nothing Cn.Close: Set Cn = Nothing End Sub 上記の式を見よう見まねで作成したのですが、エラーが出てしまします。          Me![性] = Rs![性]  が見つかりません どのように解釈すれば良いのでしょうか? ちなみに、サブフォームに入れているテキストボックスの「[性]を 同じサブフォーム内の[患者番号]から検索がしたいです。 初歩的なことで申し訳ございません。よろしくお願いします。

専門家に質問してみよう