こんにちは。
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
No.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になるのかの確認も必要かも?
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 の削除クエリで。
説明下手で _(._.)_ 勘違い有っても <(_ _)>
ご回答いただきありがとうございます。いろいろなご指摘、勉強になります。
フィールドの位置は、やはりADOでは、設定できないのでしょうか
ちなみに、
インポートのデータがあまりにも大きいのと、10種類ほどインポートするため、姓=nullをテーブルから削除して、小さくしたいということを考えています。
名簿や姓、名としていますが、Stringでの説明しやすい名称にしております。
また、もろもろ事情がありまして、クエリではなくVBで行いたいのです。
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
ご回答ありがとうございます。
今回は、アクセスでシステム化して、エンジン配布を考えておりますので、アクセスだけで完結したいのです。
VBAまで、作成していただいて、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UPDATEで既存のレコードに文字...
-
SQL*LOADER実行時のロードデー...
-
sqlite select 表示されない
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
エラーを起こす方法
-
ExcelのVLOOKUP関数の動作をMyS...
-
CSVファイルを読み込んでテーブ...
-
sqlに記述できない文字
-
timestampのデータはどのように...
-
T-SQLで任意の箇所で強制終了す...
-
テーブル名が可変の場合のクエ...
-
CASEでBETWEEN制約
-
テキストボックスの背景をVB...
-
PRIMARY KEYのコピー
-
複数の条件に該当する結果を、...
-
既にテーブルが存在する場合の...
-
truncate tableを使って複数の...
-
SQLSERVER 連番更新について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UPDATEで既存のレコードに文字...
-
SQL*LOADER実行時のロードデー...
-
カラム名を変更するには
-
sqlite select 表示されない
-
Access VBA フィールドの追加と...
-
OracleのLONG型への insert に...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
テーブル名が可変の場合のクエ...
-
PostgreSQLのtimestamp型で時間...
-
pandasでsqlite3にテーブル作成...
-
timestampのデータはどのように...
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
エラーを起こす方法
-
SQLで、Join句で結合したテ...
-
Accessで今日から5日後
-
CSVファイルを読み込んでテーブ...
おすすめ情報