• 締切済み

accessのVABを使ったインポートについて

accessへのインポートについて質問です。 VBAをつかってボタンを押すとファイル選択ダイアログが開き選択すると既存のテーブルへインポートするものを作成したいと考えています。 検索して出てきたものを加工して使ってみているのですが理想形になりません。 現状いまのままでも使えてはいるのですがより効率的にしたいと思っています。 具体的には以下の2点を修正したいと考えています。 ・元データは本来はCSVのためCSVのまま取り込みたい 範囲指定の際にExcelの関数を使って求めているためそれをCSV 現状はCSVを一度Excelに修正しています。 ・A2のセルに日付(ユーザー定義yyyy年mm月dd日)が入っているためそれをUPDATEだデータに追加したい 現状は入力を求められるためそこに入力すると反映されます。 また、反映時はyyyy/mm/ddという表記で表示をしたいです。 一応Gとしてデータの取得はしていると思うのですがうまくいきません。 取り込むデータをCSVとExcelにしているのはもう一つ取込用のボタンがありそちらの取込はCSVだからです。 (CSVだけで取り込めるようになったらExcelは消します) 独学でネットにあるものをつまんでいる状況のため専門用語などが分からず説明が足りていないところなどありましたらご質問下さい。 宜しくお願い致します。 Private Sub コマンド1_Click() Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub Dim objFileSys As Object Dim fileName As String Dim FN As Variant 'ファイルシステムを扱うオブジェクトを作成 Set objFileSys = CreateObject("Scripting.FileSystemObject") '拡張子無しのファイル名を取得 fileName = objFileSys.GetBaseName(msg) FN = objFileSys.GetAbsolutePathName(msg) Dim b As Long Dim r As Long Dim G As Date With CreateObject("Excel.Application") With .Workbooks.Open(FN) 'G = CDate(.Sheets(fileName).Range("A2").Value) b = .Sheets(fileName).Cells(1, 1).End(-4121).row .Close False End With End With DoCmd.TransferSpreadsheet acImport, , "T_G", msg, True, "B7:I" & b Dim sql As String DoCmd.SetWarnings WarningsOn:=False sql = "UPDATE T_G SET 入金日 = G WHERE Nz(入金日)=''" DoCmd.RunSQL sql DoCmd.SetWarnings WarningsOn:=True Set objFileSys = Nothing On Error GoTo err_sample err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "ダウンロード" '任意のフォルダパスを入れてください fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "Excel Files(*.xls)", "*.xlsx;*.xls" fDlg.Filters.Add "Text Files(*.csv;*.txt)", "*.csv;*.txt" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" End Function

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

言っていることが、長々延べているが、普通人には、そんなに出くわすケースではないと思うが、言っている事象がよくわからない.実例を挙げて説明しないとわからない。話題が飛びすぎ。質問は小刻みに的を絞れ。 >ボタンを押す>ファイル選択ダイアログが開き>理想形になりません>効率的にしたいと思って 既にできているものは省け、抽象的な表現ばかりしてないで、具体的に文章・語句で示せ。 ==== CSVファイルをアクセスに取り込むのは、ADOを使う手がある。 処理について、終りの方で、枝分かれすれば、CSVー>エクセル、CSVー>アクセス、CSV->SQLですぐ使えると思うので参考に上げてみる。WEBに例がたくさん載っている。 ーーーーー 例1 Sub CSVSample_Select() 'ADOを使用してCSVファイルに接続(参照設定にMicrosoft ActiveX Data Object 6.1 Libraryを適用済み) Dim objCn As New ADODB.Connection Dim objRS As ADODB.Recordset Dim strSQL As String 'CSVへのコネクション With objCn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Text;HDR=Yes;FMT=Delimited" .Open ThisWorkbook.Path & "\" End With '---- Dim rs As New ADODB.Recordset 'rs.Open "SELECT * FROM C:\Users\xxx\Desktop\データA.csv" '----- 'SQL作成 strSQL = "" strSQL = strSQL & " SELECT *" strSQL = strSQL & " FROM" strSQL = strSQL & " C:\Users\惇\Desktop\データA.csv" '<ーー--‐場合により変えること '------ 'SQL実行 Set rs = objCn.Execute(strSQL) '取得した内容(Recordset)の確認 Do While Not rs.EOF MsgBox rs.Fields(0) '<-------ここが場合により変わるところ rs.MoveNext Loop '-------- 'メモリの解放 rs.Close Set rs = Nothing objCn.Close Set objCn = Nothing End Sub ーーーーーー 例2 Sub getCSV_utf8() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim strPath As String strPath = "C:\Users\XXX\Desktop\データA.csv" '<--‐場合により変える Dim i As Long, j As Long Dim strLine As String Dim arrLine As Variant 'カンマでsplitして格納 'ADODB.Streamオブジェクトを生成 Dim adoSt As Object Set adoSt = CreateObject("ADODB.Stream") i = 1 With adoSt .Charset = "UTF-8" 'Streamで扱う文字コートをutf-8に設定 .Open 'Streamをオープン .LoadFromFile (strPath) 'ファイルからStreamにデータを読み込む Do Until .EOS 'Streamの末尾まで繰り返す strLine = .ReadText(adReadLine) 'Streamから1行取り込み 'arrLine = Split(Replace(replaceColon(strLine), """", ""), ":") 'strLineをカンマで区切りarrLineに格納 arrLine = Split(strLine, ",") For j = 0 To UBound(arrLine) '<ーーーエクセルシートに書き出し ws.Cells(i, j + 1).Value = arrLine(j) Next j i = i + 1 Loop .Close End With End Sub

vbawakarann
質問者

補足

ご回答ありがとうございます。 質問の文章が途中で途切れてしまっていたようです。 あいにくADOやSQLについての知識がほとんどないためこのままだと難しいということが分かりました。 意図していたことがうまく伝わっていないようですのでSQLについてもう少し勉強してからきちんと意図が伝わるような形で質問させていただきます。

関連するQ&A

専門家に質問してみよう