2017-12-21 12 views
0

まず、時間と手助けをお寄せいただきありがとうございます。ここに私の状況です。アクセステーブルの条件でアクセスするためにExcelから値をインポートする

既存のExcelワークブックの値をアクセスデータベースの既存のテーブルに追加しようとしています。ここでは、私が見つけたコードを私のニーズに応じて少し演奏しましたが、私がボタンをクリックすると、何もしません。エラーメッセージもインポートされた値もなく、何もしません。

Private Sub Command39_Click() 

On Error GoTo Err_Handler 

Dim wbFDU As Workbook 
Dim objExcelApp As Excel.Application 
Dim db As Database 
Dim rstWL As Recordset 
Dim columnI As String 
Dim columnS As String 
Dim searchInC As String 
Dim C As String 
Dim I As String 
Dim M As String 
Dim S As String 
Dim W As String 

Dim iCounter As Integer 

Set db = CurrentDb 
Set rstWL = db.OpenRecordset("Select * FROM WL WHERE WLDate = Date()-1") 

Set objExcelApp = New Excel.Application 
objExcelApp.Workbooks.Open ("\\CDB\Shared\MNG\CIO Mng.xlsm") 
Set wbFDU = objExcelApp.Workbooks(1) 

If rstWL.EOF = False Then 

    rstWL.MoveFirst 
    Do While rstWL.EOF = False 

     iCounter = 1 
     C = "C" & iCounter 
     I = "I" & iCounter 
     M = "M" & iCounter 
     S = "S" & iCounter 
     W = "W" & iCounter 

     Do Until wbFDU.Worksheets("Rep").Range(C).Value = "" 

      searchInC = wbFDU.Worksheets("Rep").Range(C).Value 

      If rstWL!CustName = searchInC Then 

       columnI = wbFDU.Worksheets("Rep").Range(I).Value + wbFDU.Worksheets("Rep").Range(M).Value 
       columnS = wbFDU.Worksheets("Rep").Range(S).Value + wbFDU.Worksheets("Rep").Range(W).Value 

       rstWL.Edit 
       rstWL.Fields("LCDCO") = columnI 
       rstWL.Update 
       rstWL.Fields("ECDCO") = columnS 
       rstWL.Update 

      End If 

      iCounter = iCounter + 1 
      C = "C" & iCounter 
      I = "I" & iCounter 
      M = "M" & iCounter 
      S = "S" & iCounter 
      W = "W" & iCounter 
     Loop 

     rstWL.MoveNext 
    Loop 

End If 

wbFDU.Close False 
Set wbFDU = Nothing 

rstWL.Close 
Set rstWL = Nothing 
db.Close 
Set db = Nothing 
Exit Sub 

Err_Handler: 

MsgBox "The following error has occured." & vbCrLf & vbCrLf & _ 
    "Error Number " & Err.Number & vbCrLf & _ 
    "Error Description" & Err.Description & vbCrLf & _ 
    "Your application will close!", _ 
    vbCritical, "An Error has Occured" 

End Sub 

私は何を間違っているのか分からないので、

+0

インポートした値*を要求していないため、レコードを更新または追加しようとしていますか?後者が[Recordset.AddNew](https://msdn.microsoft.com/en-us/library/office/ff845624.aspx)を使用し、特定の 'SELECT'ではなくテーブル全体を呼び出す場合。また、 'If'blockを' If rstWL.RecordCount> 0'として試してください。 – Parfait

+0

私はレコードを更新することを意図しています。アクセステーブルには他の値を持つ顧客IDがあります(同じ顧客IDが複数の異なる日付に存在する可能性があります。そのため、Date() - 1基準でレコードセットを呼び出そうとしています)影響を受ける)。 Excelシートには、異なる価値を持つ顧客がいくつかあります。その値は、アクセステーブルのフィールドに更新する必要があります。 – taccoo73

+0

コードを一度に1行ずつ進めるには、F8キーを押してください。 Range(C).Value = "" 'と' rstWL!CustName = searchInCならば、あなたの更新プログラムが起動しないようにすることができます。 –

答えて

0

レコードセットのループを必要とせずに、MS AccessでExcelブックを直接照会することを検討してください。具体的には、のクエリUPDATEで使用するたびに再作成または削除された一時表を使用してください。

ただし、ワークブックで列見出しが使用されていないようですので、HDR=Noを指定すると、結果セットでF1、F2、F3、...となります。それ以外の場合は、HDR=Yesと参照名付き列を使用します。

メイク表クエリ

SELECT * 
INTO myExcelTempTable 
FROM [Excel 12.0 Xml;HDR=No;Database=\\CDB\Shared\MNG\CIO Mng.xlsm].[Rep$] AS t; 

更新クエリを

UPDATE WL 
INNER JOIN myExcelTempTable AS t 
ON WL.CustomerId = t.F3   --F3 being Column C (customer id) 

SET LCDCO = F9,     --F9 being Column I 
    ECDCO = F19     --F19 being Column S 

WHERE WL.WLDate = Date()-1; 

しないでください(最初の時間の後に、それ以降のExcelの更新のためのクエリを追加/削除する使用してください) MS Accessで上記のクエリのコメントを使用します。ここにあなたを導くためにのみ含まれています。

+0

ありがとう、もう一度パフェ、私はできるだけ早くこのアプローチを試してみます。これまでにこのような質問をしたことはありませんでした。 – taccoo73

関連する問題