プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
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

A 回答 (3件)

ADO・ADOX で変更できるかまでは探し当てていませんが


Googleにあたり、どうも、キーワードとして
ORDINAL_POSITION や OpenSchema 辺りが有効の様です。
参照するだけなら
http://www.gizcollabo.jp/vbtomo/log/archive/chos …
とか色々ありますが
変更に関しては可能か否かも含めて見つけてません。
分かったら私めにも教えてくださいませ。<m(__)m>

もう一つ
レコードが
1,a
2,
3,c
4,d
となっていた場合に
2のレコードを削除した時に、カレントレコードの位置が
1,aになるのか、それとも、3,cになるのかの確認も必要かも?
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2013/01/20 18:37

決して茶々を入れるつもりではありません。

ご了承ください。

>フィールド[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 の削除クエリで。
説明下手で _(._.)_ 勘違い有っても <(_ _)>
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。いろいろなご指摘、勉強になります。

フィールドの位置は、やはりADOでは、設定できないのでしょうか


ちなみに、
インポートのデータがあまりにも大きいのと、10種類ほどインポートするため、姓=nullをテーブルから削除して、小さくしたいということを考えています。
名簿や姓、名としていますが、Stringでの説明しやすい名称にしております。
また、もろもろ事情がありまして、クエリではなくVBで行いたいのです。

お礼日時:2012/12/24 17:47

この種の仕事はエクセルが得意ですから、データをエクセルに下請けに出してやったらいかがですか。


エクセルで第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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2012/12/24 14:36

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