2013-10-03 2 views
0

Access 테이블의 값과 일치하는 경우 Excel에서 행을 삭제하는 것이 액세스 VBA : 셀 값은 내가 액세스 VBA 스크립트가

  • 루프 각 스프레드 시트의 각 시트를 통해 디렉토리에 Excel 스프레드 시트의 목록을

    • 루프

      ,691 :
    싶습니다

    가 한 단계를 추가하는 Access 테이블에 시트에서 데이터를 가져옵니다

    • Field1의 Excel 값을 액세스 테이블 Exclude의 값 목록과 비교하고 일치하는 항목이 있으면 Excel에서 전체 행을 삭제하십시오.

      Dim rs As Recordset 
      Set rs = CurrentDb.OpenRecordset("SELECT * FROM FileList") 
      rs.MoveFirst 
      
      Dim appExcel As Excel.Application 
      Set appExcel = New Excel.Application 
      Dim objWorkbook As Excel.Workbook 
      Dim objSheet As Excel.Worksheet 
      
      Do Until rs.EOF = True 
          strFilePath = rs!FilePath 
          Set objWorkbook = appExcel.Workbooks.Open(strFilePath) 
          For Each objSheet In objWorkbook.Sheets 
           objSheet.Select 
           strQuery = 
            "INSERT INTO tblImport (Field1) 
            SELECT [Field1] 
            FROM [Excel 8.0;HDR=YES;DATABASE=" & strFilePath & "].[" & objSheet.Name & strRange & "]" 
           CurrentDb.Execute strQuery, dbFailOnError 
           ***Add Code Here to Delete Rows in Excel where value found in Exclusion table*** 
           Next objSheet 
          Set objSheet = Nothing 
          objWorkbook.SaveAs FileName:=strFilePath, FileFormat:=xlExcel8 
          objWorkbook.Close SaveChanges:=False 
          Set objWorkbook = Nothing 
          rs.MoveNext 
          Loop 
      

      을 내가 다른 레코드 집합 어둡게해야합니다 확신합니다 : : 그런 다음

      Dim rsExclude AS Recordset 
      Set rsExclude = CurrentDb.OpenRecordset("SELECT * FROM Exclude") 
      

    여기에 새로운 코드 가야 나타내는 메모와 함께 단순화 된 코드입니다 뭐? 또는 누군가 다른 방법을 추천 할 수 있습니까?

  • 답변

    1

    좋아, I는 해결책을 제공했다. 나는 그것이 "최적"이라고 확신하지는 않는다. (나는이 반복적 인 해결책 대신에 Set-Based 솔루션을 기대하고 있었다.) 그러나 그것은 충분히 빠르게 작동한다. 기본적으로, 나는 다음을 수행 할 - 동안 루프 추가 : 범위

  • 을 DLookup 액세스 테이블 필드
  • 없이 일치하는 경우에 대한 값의 각 행 번호를 통해

    • 반복 처리를, 카운터를 반복
    • 일치하는 행을 삭제하고, 감소하는 경우
    • 총 행은 계산
    아래

    추가 코드 :

    Do While intRow <= strLastRow 
        If IsNull(DLookup("Field1", "Exclude", "Field1 = '" & objSheet.Range("A" & intRow).Value & "'")) Then 
         intRow = intRow + 1 'No match, move to next row 
        Else 
         objSheet.Rows(intRow).Delete 'Match found, delete row 
         strLastRow = strLastRow - 1 'Decrease the number of rows in range 
        End If 
        Loop 
    
  • 0

    다른 방법은 제외 테이블을 조건으로 사용하여 Access에서 삭제 쿼리를 만드는 것입니다. 그런 다음 모든 스프레드 시트를 가져온 후에 코드에서 쿼리를 실행하십시오. 각 스프레드 시트 다음에 실행할 필요가 없으며 매크로 속도가 느려집니다.

    또는 당신을 위해 그것을 할 당신의 삽입 쿼리를 수정 ...

    "INSERT INTO tblImport (Field1) 
    SELECT [Field1] 
    FROM [Excel 8.0;HDR=YES;DATABASE=" & strFilePath & "].[" & objSheet.Name & strRange & "] 
    WHERE [Field1] NOT IN (SELECT [yourFieldInExclusion] FROM Exclusion)" 
    
    +0

    오해. Access 테이블에서 데이터를 삭제하고 싶지 않습니다. Excel 스프레드 시트에서 관련 행을 삭제하려고합니다. (더 명확하게하기 위해 설명이 업데이트되었습니다.) – Matt

    +1

    Access로 가져 오기 전에 데이터를 삭제하여 데이터베이스에 없거나 이후에 없으므로 db에 레코드 사본이 있습니까? – APrough

    +0

    제 의도는 영구적 인 레코드를 유지하기 위해 모든 데이터를 가져온 다음 수정 된 데이터를 클라이언트에 전달해야하는 Excel 쪽 레코드를 삭제하는 것입니다. – Matt