2017-12-21 12 views
0

우선, 시간과 도움에 미리 감사드립니다. 여기 내 상황이있다.엑셀에서 값을 가져 와서 액세스 테이블의 기준으로 액세스하십시오.

기존 엑셀 통합 문서의 일부 값을 액세스 데이터베이스의 기존 테이블에 추가하려고합니다. 여기에 내가 찾은 코드가 있고, 내 요구에 따라 조금씩 연주했지만, 버튼을 클릭해도 아무런 효과가 없습니다. 오류 메시지가 없으며 가져온 값도없고 아무 것도 수행하지 않습니다.

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

한 번에 한 줄씩 코드를 단계별로 실행하려면 F8 키를 눌러보십시오. Range (C) .Value = ""와'If rstWL! CustName = searchInC If'는'당신의 업데이트가 실행되는 것을 막을 수 있습니다. –

답변

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; 

하지 마십시오 (처음 이후, 이후의 엑셀 업데이트 쿼리를 추가/삭제 용) MS Access에서 위 쿼리의 주석을 사용하십시오. 당신을 안내하기 위해 여기에 포함되어 있습니다.

+0

다시 한번 고마워요. 아빠, 최대한 빨리이 방법을 시도해 보겠습니다. 이전에는 이러한 종류의 쿼리를 사용하지 않았고이를 배우는 것을 좋아합니다. – taccoo73