2017-03-02 214 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

相關問題