锁定Access表以防止在特定时间写入

时间:2016-03-17 13:39:05

标签: excel excel-vba ms-access access-vba vba

我正在进行每周预测,人们将在Excel中使用模板输入数据。一旦他们输入了所有数据,他们就会点击Excel中的一个按钮,将数据放入Access数据库的表中。

星期五上午10:30我想锁定表格,以便人们将数据输入数据库的时间很长。那时周预测是最终的,然后我希望数据库能够在星期五下午5点之后再次写入(不再锁定)。

这可能吗?即使可能有一个单独的按钮,我可以在上午10:30点击自己锁定桌子,然后我可以在下午5点再次点击它以使其解锁桌子(或者单独的按钮)。另外,我怎样才能创建一个消息框,只有在表被锁定时才会告诉用户截止日期已经发生且没有更多的写入表格?

我从Excel模板中将数据注入Access数据库表的代码是:

 Sub ADOFromExcelToAccess()

 If MsgBox("This Button Will Submit all Data in the Table to the Right & Clear the Table! Are you sure?", vbYesNo) = vbNo Then Exit Sub


 ' exports data from the active worksheet to a table in an Access database
 ' this procedure must be edited before use
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
' connect to the Access database
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=DatabasePath;"
' open a recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "Forecast_Items", cn, adOpenKeyset, adLockBatchOptimistic, adCmdTable
' all records in a table
On Error GoTo transerror

cn.BeginTrans
r = 17 ' the start row in the worksheet
Do While Len(Range("D" & r).Formula) > 0
' repeat until first empty cell in column D table
    With rs
        .AddNew ' create a new record
        ' add values to each field in the record
        .Fields("UserName") = Range("B" & r).Value
        .Fields("Forecast_Date") = Range("C" & r).Value
        .Fields("Area") = Range("D" & r).Value
        .Fields("Description_Item") = Range("E" & r).Value
        .Fields("Account") = Range("F" & r).Value
        .Fields("RRDD") = Range("G" & r).Value
        .Fields("CostCenter") = Range("H" & r).Value
        .Fields("Fleet") = Range("I" & r).Value
        .Fields("ForecastAmount") = Range("J" & r).Value
        .Fields("PlanAmount") = Range("K" & r).Value
        .Fields("VarianceForecast") = Range("L" & r).Value
        .Fields("Explanation") = Range("M" & r).Value



        ' add more fields if necessary...

    End With
    r = r + 1 ' next row
Loop
rs.UpdateBatch 'injects full table from excel into access at the same time, eliminating possible errors with inserting certain rows over others
cn.CommitTrans 'makes sure that there were no errors before sending off all of the data
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

MsgBox ("Data was Submitted Successfully! A copy of your submitted data is on tab Submitted Information")
ActiveSheet.Unprotect "password"
     Sheets("Forecast Form").Select
Range("B16:M100").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Submitted Information").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
     Sheets("Forecast Form").Protect Password:="password", DrawingObjects:=False, AllowFormattingCells:=True
     Sheets("Forecast Form").Range("D17:M100").ClearContents
        Exit Sub
       transerror:
    cn.RollbackTrans
     rs.Close
     Set rs = Nothing
     cn.Close
     Set cn = Nothing
      MsgBox ("Required Fields are: Area/Description Item/Fleet (Use Drop Down Box to Find Appropriate Naming or N/A)/Forecast Amt/Plan Amt/Variance Amt/Explanation."), , "Data Input Error"
     MsgBox ("Data Was Not Submitted"), , "Data Input Error"

      End Sub

4 个答案:

答案 0 :(得分:2)

关于锁定表格的问题,请在Access中打开一个表单,并检查锁定和解锁的日期和时间Timer event。 使用桌面上的交易锁定:

Workspaces(0).BeginTrans
CurrentDB.Execute "Update MyTable SET MyField=MyField & ''"

通过回滚此交易解锁:

Workspaces(0).Rollback

这可以在Access中实现而不更改Excel代码,更新锁定的表将导致错误。

如果计时器事件从Access中的表中获取锁定和解锁时间,则Excel中的错误处理程序可以创建指向此表的链接,并检查锁是否由于时间而实现,或者它是一些其他错误......基于此,您可以创建您的消息。

答案 1 :(得分:2)

我看到您当前正在使用旧的Jet.OLEDB提供程序,但如果您曾将数据库文件升级到.accdb for Access 2010或更高版本(并使用ACE.OLEDB或ACE ODBC),那么您可以创建一个Before Change data macro锁定表:

BeforeChange.png

答案 2 :(得分:1)

.OpenRecordSet有一个dbDenyWrite参数。我不确定它是否适用于这种情况,但它可能会让你走上正确的道路。至于时间间隔,还有另一个问题可能有助于编写关于何时自动锁定表的规则。 link

Wayne关于存储当前锁定状态的管理员表的评论将允许您创建消息框。

答案 3 :(得分:0)

AFAIK,如果您在代码中使用DAO记录集打开表: CODE

设置r = CurrentDB.OpenReocrdset(SomeTable,dbOpenTable,dbDenyRead)

使用Windows任务计划程序运行此简单脚本。以下是描述如何安排任务的链接。

http://windows.microsoft.com/en-us/windows/schedule-task#1TC=windows-7