2017-08-21 12 views
0

を挿入するために、VBAを使用したときに値の入力を求める続けます。 AllCandidates(ID、姓、姓)とCandicateSteps(ID、ステップ、DateReceived、結果) 私のスクリプトは、姓、姓のペアのために、Excelファイルから読み込むことです:私は2つのテーブルを持っています。存在しない場合は、LastName、FirstNameを最初のテーブルに挿入し、Step、DateReceived、Resultを2番目のテーブルに挿入します。 実行時、Accessはすべてのフィールド値を入力するように要求し続け、その値を使用して、Excelから渡された値の代わりにテーブルに格納します。誰かが私が間違っていたことに光を当ててもらえますか?どうもありがとう。アクセス2016は、私はAccessで初心者です、レコード

Public Sub LoadExcelToAccess(xlPath As String) 

    Dim xlApp As Object 
    Dim xlWrk As Object 
    Dim xlSheet As Object 
    Dim i As Long 
    Dim sql, sql2 As String 

    Set xlApp = VBA.CreateObject("Excel.Application") 
    Set xlWrk = xlApp.Workbooks.Open(xlPath) 
    Set xlSheet = xlWrk.Sheets("Sheet1") 

    For i = 2 To 4 
     Dim rID 
     'check if the person is already in the DB 
     Set rID = CurrentDb.OpenRecordset("Select ID from AllCandidates where LastName='" & xlSheet.cells(i, 1) & "' and FirstName = '" & xlSheet.cells(i, 2) & "'") 
     If rID.EOF Then 
      'person is not in DB, insert it into the AllCandidates db 
      MsgBox "ID Not found" 
      sql = "Insert Into [AllCandidates] (LastName, FirstName) VALUES (" & xlSheet.cells(i, 1).Value & "," & xlSheet.cells(i, 2).Value & ")" 
      DoCmd.RunSQL sql 
     End If 
     rID.Close 

     'now that the person is surely there, insert the steps status into the CandiateSteps table 
     Set rID = CurrentDb.OpenRecordset("Select ID from AllCandidates where LastName='" & xlSheet.cells(i, 1) & "' and FirstName = '" & xlSheet.cells(i, 2) & "'") 
     'get the last ID that were inserted in the AllCandidates table 
     Dim fld As Field 
     Set fld = rID.Fields(0) 
     MsgBox "item in row ID = " & fld 
     sql2 = "Insert into [CandidateSteps] (ID, Step, DateReceived, Result) VALUES (" & fld & ", " & xlSheet.cells(i, 3).Value & ", " & xlSheet.cells(i, 4).Value & ", " & xlSheet.cells(i, 5).Value & ")" 
     DoCmd.RunSQL sql2 
     rID.Close 
    Next i 

    'make sure to dispose of objects 
    xlWrk.Close 
    xlApp.Quit 
    Set rID = Nothing 
    Set fld = Nothing 
    Set xlSheet = Nothing 
    Set xlWrk = Nothing 
    Set xlApp = Nothing 
End Sub 
+0

引用符なしでテキスト値を挿入しようとしています –

+0

ありがとうございますTim !!!!それはそれを修正しました!愚かな私! – Christine

答えて

2

として@TimWilliamsあなたは姓を使用して、あなたが他のすべてのクエリに引用符を含める行う興味深いことに、1つの問題のクエリのために引用符なし文字列リテラル()を通過している、言及します

引用符をラップして問題を解決するのではなく、の引用符または文字列連結を必要としないMS Accessのquerydef parameterizationを検討してください。以下は、パラメータを使用したレコードセット呼び出し(SELECTステートメント)とアクションクエリ(INSERT,,ステートメント)の例です。あなたのコードに統合してください。

パラメータ化クエリ定義レコード

Dim qdef As Querydef 
... 

' PREPARED STATEMENT WITH DEFINED PLACEHOLDERS 
sql = "PARAMETERS LastNameParam TEXT(255), FirstNameParam TEXT(255);" _ 
     & " SELECT ID from AllCandidates WHERE LastName=[LastNameParam] and FirstName=[FirstNameParam]" 

' ASSIGN TO TEMP QUERY OBJECT (ABOVE CAN BE A SAVED QUERY) 
Set qdef = CurrentDb.CreateQueryDef("", sql) 

' BIND PARAMS 
qdef!LastNameParam = xlSheet.cells(i, 1) 
qdef!FirstNameParam = xlSheet.cells(i, 2) 

' OPEN QUERY'S RECORDSET 
Set rID = qdef.OpenRecordset() 
... 
rID.Close: qdf.Close 
Set qdf = Nothing 

パラメータ化クエリ定義アクションクエリ(DoCmd.RunSQLを置き換えます)

' PREPARED STATEMENT WITH DEFINED PLACEHOLDERS 
sql = "PARAMETERS LastNameParam TEXT(255), FirstNameParam TEXT(255);" _ 
     & " INSERT INTO [AllCandidates] (LastName, FirstName) VALUES ([LastNameParam], [FirstNameParam])" 

' ASSIGN TO TEMP QUERY OBJECT 
Set qdef = CurrentDb.CreateQueryDef("", sql) 

' BIND PARAMS 
qdef!LastNameParam = xlSheet.cells(i, 1) 
qdef!FirstNameParam = xlSheet.cells(i, 2) 

' EXECUTE ACTION 
qdef.Execute dbFailOnError 

qdf.Close 
Set qdf = Nothing 

ところで、あなたは初心者なので、パラメータがあります任意のリレーショナルデータベース(MYSにおける業界のベストプラクティスQL、SQL Server、Oracle、Postgres、DB2、SQLite)を使用して、アプリケーション層コーディングを介してSQLクエリを実行します。ボビーの表を思い出してください。これはより多くの行を扱うように見えるかもしれませんが、コードはより安全で、argubalyはより保守性があり、さらに効率的です。

+0

ありがとうパフェ!素晴らしい答えと説明。私はそれを試みます。 – Christine

関連する問題