2014-11-13 2 views
2

특정 기준이 충족되는 경우 .mdb 파일을 복사하는 VBA 함수를 작성하려고했습니다.왜 프로그래밍 방식으로 잠긴 .mdb를 복사 할 수 없지만 탐색기를 통해 복사 할 수 있습니까?

.mdb에 복사/붙여 넣기가 연결된 .ldb 파일이있는 경우 FileCopy 메서드에서 오류가 발생 함을 알았을 때로드 블록에 맞았습니다.

그러나 Windows 탐색기를 통해 .mdb을 수동으로 복사/붙여 넣기 할 수 있습니다.

복사하려고 시도하는 .mdb은 파일 복사 절차를 실행하는 DB에 참조를 추가했기 때문에 항상 잠겨 있습니다.

VBA를 사용하여 프로그래밍 방식으로 강제로 복제하는 방법을 보여 줄 수 있습니까? 검색을 시도했지만 DB 손상 등의 이유로이 작업을 수행하는 것에 대한 조언을 찾지 못했습니다. 그러나이 절차가 실행되는 동안 DB 개체가 조작되지 않으므로 문제가되지는 않습니다.

Function fn_ArchiveMonthEndDB() 

    'load INI data 
    fn_ReadINI 

    Dim asOfDate As Date 
    asOfDate = getAsOfDate() 
    Dim monthEndDate As Date 
    monthEndDate = fn_GetMonthEndDate() 


    sSQL = "SELECT CDate(Nz(LastRunDate,'1/1/1990')) as BackupDate FROM tbl_UseStats WHERE ProcessName = 'Archive Backend DB'" 
    Dim rs As Recordset 
    Set rs = CurrentDb.OpenRecordset(sSQL) 

    Dim dLastBackup As Date 
    dLastBackup = rs!BackupDate 

    rs.Close 
    Set rs = Nothing 

    If (dLastBackup <> monthEndDate) Then 

      'determine if it actually is month-end. if yes, then archive the DB. 
      If (asOfDate = monthEndDate) Then 
       'archive backend DB 
       sDir = iBackendArchive & "\" & CStr(Year(monthEndDate)) & CStr(Month(monthEndDate)) 

       'create dir if it does not exist 
       If (Dir(sDir, vbDirectory)) = "" Then 
        MkDir sDir 
       End If 

       FileCopy iBackendPath & "\ETL_be.mdb", sDir & "\ETL_be.mdb" 

      Else 
       'if no, do nothing 
      End If 

    ElseIf (dLastBackup = monthEndDate) Then 
     'do nothing, because we already took a backup of the backend DB. 
    End If 

End Function 

답변

3

마이크로 소프트가 KB article 꽤 간단히 설명 : 사람이 호기심 경우

, 여기 내 절차입니다.


- 모듈을 만들고 선언 구역에 다음 줄을 입력 : -

Option Explicit 

Declare Function apiCopyFile Lib "kernel32" Alias "CopyFileA" _ 
(ByVal lpExistingFileName As String, _ 
ByVal lpNewFileName As String, _ 
ByVal bFailIfExists As Long) As Long 



다음 절차에 따라 입력 :

Sub CopyFile(SourceFile As String, DestFile As String) 
'--------------------------------------------------------------- 
' PURPOSE: Copy a file on disk from one location to another. 
' ACCEPTS: The name of the source file and destination file. 
' RETURNS: Nothing 
'--------------------------------------------------------------- 
    Dim Result As Long 
    If Dir(SourceFile) = "" Then 
     MsgBox Chr(34) & SourceFile & Chr(34) & _ 
     " is not valid file name." 
    Else 
     Result = apiCopyFile(SourceFile, DestFile, False) 
    End If 
End Sub 



을 -이를 테스트하기를 절차에서 직접 실행 창에 다음 줄을 입력 한 다음 Enter 키를 누릅니다.

CopyFile "<path to Northwind.mdb>", "C:\Northwind.mdb" 
+0

조니 본즈 FTW! +1 –

관련 문제