2017-03-02 100 views
0

我正在使用一个工作簿打开事件下面的VBA代码:VBA自动每10秒钟保存工作簿而不激活工作簿?

Private Sub Workbook_Open() 
On Error GoTo Message 

Application.AskToUpdateLinks = False 
ThisWorkbook.UpdateLinks = xlUpdateLinksNever 
ActiveSheet.DisplayPageBreaks = False 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 



    Dim currentTime As Date 
    currentTime = DateAdd("s", 10, Now) 
    Call CurUserNames 
    Application.OnTime currentTime, "SaveFile" 

Exit Sub 
Message: 
Application.DisplayAlerts = False 
Exit Sub 

End Sub 

我也有这样的代码模块中:

Public Sub SaveFile() 

On Error GoTo Message 


    ThisWorkbook.Save 

    Dim currentTime As Date 
    currentTime = DateAdd("s", 10, Now) 

    Application.OnTime currentTime, "SaveFile" 

    Exit Sub 
Message: 
Application.DisplayAlerts = False 
Exit Sub 

End Sub 

我所试图做的是自动保存我的工作簿每10秒。

This Works。

但是,我注意到了一些令人讨厌的事情。如果用户在后台打开此工作簿并正在处理另一个Excel工作簿,那么此工作簿将在保存时激活并显示在其他工作簿的顶部。

这对于用户来说可能很烦人。 有没有办法让我的工作簿在不激活工作簿的情况下保存?

P.S: 由于某些未知原因,这也会导致工作簿在关闭时重新打开。

编辑:

名单簿代码活跃用户:

Sub CurUserNames() 

Dim str As String 
Dim Val1 As String 

str = "Users currently online:" & Chr(10) 

For i = 1 To UBound(ThisWorkbook.UserStatus) 
    str = str & ThisWorkbook.UserStatus(i, 1) & ", " 
Next 

Val1 = DeDupeString(Mid(str, 1, Len(str) - 2)) 


Worksheets("Delivery Tracking").Range("F4").Value = Val1 


End Sub 


Function DeDupeString(ByVal sInput As String, Optional ByVal sDelimiter As String = ",") As String 

    Dim varSection As Variant 
    Dim sTemp As String 

    For Each varSection In Split(sInput, sDelimiter) 
     If InStr(1, sDelimiter & sTemp & sDelimiter, sDelimiter & varSection & sDelimiter, vbTextCompare) = 0 Then 
      sTemp = sTemp & sDelimiter & varSection 
     End If 
    Next varSection 

    DeDupeString = Mid(sTemp, Len(sDelimiter) + 1) 

End Function 
+0

10秒非常频繁,为什么不添加一个条件来查看工作簿实际*是*活动,并跳过保存,否则?这样,如果工作簿实际上发生了变化,它就会处于活动状态,然后每隔10秒就会保存一次。出于兴趣,为什么如此频繁? – Wolfie

+0

@Wolfie我需要它频繁,因为用户可以访问该工作簿,因为它共享和单元格我列出所有活动用户。但是,除非工作簿经常保存,否则不会更新 – user7415328

+1

Re:未知原因:除非您在Workbook_Close事件触发时清除“OnTime”事件计划,否则它将重新打开以继续计划。有数百个如何做到这一点的例子。另外,不要每隔10秒就盲目地保存文件,为什么不测试一下是否已经改变,并保存它是否存在?如果文件已经改变,'ThisWorkbook.Saved'将被设置为'False'。 – CLR

回答

0

Th9is例子来自How can I get list of users using specific shared workbook?

这是一个有点矫枉过正。它会创建一个新的工作簿来放置用户名。但是您可以修改它以将名称放在任何表单中以及您想要的单元格中。

将它放在选择更改模块下的工作表模块中。然后每次用户移动到不同的单元时它都会更新。如果它是开放的,他不在他的办公桌前 - 它什么也不做。

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

End Sub 

底部是上面链接的代码,您可以根据自己的需要进行修改。这比每十秒钟保存一次工作簿要好1000倍。实际上它本身可能需要3或4秒。

如果您不想在工作表模块中使用选择更改,那么您可以将代码放入工作簿模块Private Sub Workbook_Open() 中,并将其放置在定时器上以每10秒运行一次。它只需要几分之一秒而不是几秒钟。共享工作簿的

users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
     .Cells(row, 1) = users(row, 1) 
     .Cells(row, 2) = users(row, 2) 
     Select Case users(row, 3) 
      Case 1 
       .Cells(row, 3).Value = "Exclusive" 
      Case 2 
       .Cells(row, 3).Value = "Shared" 
     End Select 
    Next 
End With 
1

用户可以看到Who has this workbook open now:只需在Ribbon要去Review选项卡并单击Changes组中的Shared Workbook图标。这将打开Shared Workbook对话框,其中的选项卡Editing' shows *此工作簿现已打开:*。此外,该选项卡“高级功能”可以用来更新设置处理:

  • 跟踪更改
  • 更新变化
  • 用户之间出现冲突的变更
  • 个人观点包括

enter image description here

相关问题