2017-01-11 3 views
0

Excel 2010. 일부 필터를 기반으로 매크로를 실행하는 일부 통합 문서에서 일부 셀을 작성/업데이트하려고합니다. 단순함을 위해, 나는 당신이 볼 수있는 것에 질의를 줄였습니다. 이 코드는 작동하지만 통합 문서가 닫히는 경우에만 작동합니다 (다른 통합 문서에서 테스트 됨).통합 문서가있는 ADODB로 Excel 업데이트 열기

Dim libro As Workbook 
Set libro = ActiveWorkbook 
esteLibro = libro.Name 

Dim cnCaja As ADODB.Connection 
Dim rsCaja As ADODB.Recordset 
Set cnCaja = New ADODB.Connection 
Set rsCaja = New ADODB.Recordset 
cnCaja.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source='" & esteLibro & "';" & _ 
     "Extended Properties='Excel 12.0;HDR=Yes;ReadOnly=False';" 

Dim consCaja As String 
consCaja = "Update [Base$A3:T100000] Set INVERSIONES = 1000 " 
rsCaja.Open consCaja, cnCaja, adOpenStatic, adLockOptimistic 

다른 통합 문서에서 실행하면 "INVERSIONES"열의 빈 셀이 10000으로 변경됩니다. 같은 테이블에 대한 쿼리는 통합 문서 경우에도 작동합니다,

Debug.Print cnCaja.ConnectionString 

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin; Data Source=Danny_Diario.xlsm;Mode=Share Deny None; Jet OLEDB:System database="";Jet OLEDB:Registry Path=""; Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=35; Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2; Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=""; Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False; Jet OLEDB:Don't Copy Locale on Compact=False; Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False; Jet OLEDB:Support Complex Data=False; Jet OLEDB:Bypass UserInfo Validation=False;

그리고 :

'-2147217865 (8004e37)' The Microsoft Access database engine could not find the object '[Base$A3:T100000]'. Make sure the object exists and that you spell its name and the path name correctly. If '' is not a local object, check your network connection or contact the server administrator.

이 전체 연결 문자열은 다음과 같습니다하지만 같은 통합 문서에서 나는 오류가 발생했습니다 열다.

consCaja = "Select * from [Base$A3:T100000] Where Fecha = #" & fechaBase & "# and Empresa = ""Empresa"" and Banco = ""Banco""" 
rsCaja.Open consCaja, cnCaja, adOpenForwardOnly, adLockReadOnly 

Do While Not rsCaja.EOF 
    MsgBox (rsCaja("Empresa").Value & vbNewLine & rsCaja("Banco").Value & vbNewLine & rsCaja("INVERSIONES").Value) 
    rsCaja.MoveNext 
Loop 

마지막으로 통합 문서를 열어 ADODB로 Excel을 업데이트 할 수 있습니까? 예인 경우 무엇이 잘못 되었습니까, 아니면 어떻게 해결합니까?

+0

연결 문자열의 전체 경로가 필요합니다. 상단 행을'esteLibro = libro.FullName'으로 변경하십시오. 그래도 열어 본 통합 문서로 업데이트 할 수 있을지 의심 스럽습니다. – Parfait

+0

읽을 수 있으므로 전체 경로가 필요하지 않습니다. 하지만 전체 경로를 사용하더라도 여전히 동일한 오류가 발생합니다. 그리고 나는 이것을 할 수 없다는 소식을 발견 할 수 없었습니다. – Jedicillo

답변

0

열린 통합 문서의 기존 데이터 위에 읽기 전용 SELECT을 실행하는 것이 좋습니다. 파일 쓰기 액세스의 다양한 이유로, 플랫 파일 캐시 메모리 응용 프로그램 인 Excel에는 응용 프로그램을 열고 현재 데이터를 동 기적으로 업데이트 할 수있는 데이터베이스와 같은 기능이 없을 수 있습니다.

이 다음은 현재 열 위치에 열 별칭을 A, 일정한 1000을 통과하고 INVERSIONES에 할당 한 변화와 현재의 구조를 반영하기 위해 SELECT 쿼리를 설정합니다. 조건부 논리 IIF 문을 여기에 쉽게 배치 할 수 있습니다. 또는 쿼리를 실행하고 결과를 새 워크 시트에 덤프하십시오. 그런 다음 현재 워크 시트를 삭제/보관하고 통합 문서를 저장하십시오.

Dim cnCaja As New ADODB.Connection 
Dim rsCaja As New ADODB.Recordset 
Dim consCaja As String 

esteLibro = ActiveWorkbook.FullName 
cnCaja.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
      "Data Source='" & esteLibro & "';" & _ 
      "Extended Properties='Excel 12.0;HDR=Yes;';" 

consCaja = "SELECT Col1, Col2, Col3, '1000' AS INVERSIONES, Col4, Col5, Col6" & _ 
      " FROM [Base$A3:T100000]" 
rsCaja.Open consCaja, cnCaja 

Worksheets("Base").Range("A3").CopyFromRecordset rsCaja 

rsCaja.Close: cnCaja.Close 
Set rsCaja As Nothing: Set cnCaja As Nothing 
+0

간단한 쿼리입니다. 실제 검색어는 다음과 같습니다 : ''consUpdate = "업데이트 [Base $ A3 : T100000] INVERSIONES = prMonto"& _ ""Emperea = prEmpresa와 BANCO = prBanco 및 Fecha = prFecha를 설정하십시오 " 사용하고 싶습니다. SQL의 필터에 대한 매개 변수화 된 쿼리. ADODB가 필요한 이유입니다. 거기에 데이터를 업데이 트하려는 간격이있을 수 있으므로 range.copy를 사용할 수 없습니다 ... 다른 옵션은 지금 당장 데이터가 내 매개 변수와 일치하는지 확인하기 위해 행을 반복하는 것입니다. 그것은 시간과 데이터의 증가에 따라 훨씬 느려질 것입니다. – Jedicillo

+0

앞서 언급했듯이 로직을 설정하고 필요한 매개 변수를 전달하기 위해'IIF()'를 사용할 수 있습니다 :'Select Col1, Col2, Col3, IIF (Empresa =? AND BANCO =? AND Fecha = ?,? INVERSIONES) AS NewInversiones, Col4 , Col5, Col6 FROM [Base $ A3 : T100000]'. 그리고 왜'CopyFromRecordset'가'FROM' 절의 바로 테이블 범위의 정확한 복사본이 될지 이해하지 못합니다.'Base $ A3'에서 바로 시작합니다. – Parfait

+0

이제 알겠습니다. 그러나 여전히 나는 모든 것을 다시 쓰는 것에 만족하지 않습니다. 감사합니다. 나는하고 싶은 일을 할 수 없다고 생각합니다. 그래서 나는 오래된''각 ws.Range(). 행 '을 사용할 것입니다. – Jedicillo