Board logo

標題: [發問] 違反共用原則 [打印本頁]

作者: cowww    時間: 2023-8-10 10:06     標題: 違反共用原則

請問論壇的大大們
"違反共用原則"是甚麼意思
[attach]36765[/attach]

加入底下的語法就會出現"違反共用原則"
Private Sub Workbook_Open()
Application.OnTime TimeValue("17:00:00"), "full_calc"
End Sub

語法的來源
https://learn.microsoft.com/zh-tw/office/vba/api/excel.application.ontime
作者: cowww    時間: 2023-8-11 10:51

回復 1# cowww

Function IsFileOpen(filePath As String) As Boolean
    Dim fileNum As Integer
    fileNum = FreeFile()

    On Error Resume Next
    Open filePath For Binary Access Read Write Lock Read Write As fileNum
    If Err.Number <> 0 Then
        IsFileOpen = True
    End If
    Close fileNum
    On Error GoTo 0
End Function

Dim targetFilePath As String
    targetFilePath = "\\shl-group.com\dept\MFMG\對外單位開放資料\會議室模具追蹤資訊\急件專案狀態追蹤_v2_1.xlsm"
   
If IsFileOpen(targetFilePath) Then
    ' 檔案已被開啟,執行另存新檔的動作
    Dim currentDate As String
    currentDate = Format(Date, "yyyymmdd") ' 取得當天日期的字串表示,例如:20230522
   
    Dim newFileName As String
    newFileName = "\\shl-group.com\dept\MFMG\對外單位開放資料\會議室模具追蹤資訊\急件專案狀態追蹤_v2_1_" & currentDate & ".xlsm"
   
    ThisWorkbook.SaveAs filename:=newFileName, WriteResPassword:="6112", ReadOnlyRecommended:=True

Else
    ThisWorkbook.SaveAs filename:=targetFilePath, WriteResPassword:="6112", ReadOnlyRecommended:=True

End If
============================================================================================
Private Sub Workbook_Open()

'指定07:45開始執行"full_calc"
    Application.OnTime TimeValue("17:00:00"), "full_calc"
   
End Sub

測試發現上述兩段語法好像會造成"違反共用原則"的異常出現

請問這個問題有辦法解決嗎??
作者: singo1232001    時間: 2023-8-11 13:07

回復 2# cowww


    若我沒記錯 這裡可能有兩個錯誤
1.時間等待 我建議是 Application.OnTime date+TimeValue("17:00:00"), "full_calc"


2.由於這裡的書寫方式與call 的方式不同  比較類似vb
例如說 某個模組 moduel1 當中的 sub test() 程序
那就該寫成
Application.OnTime date+TimeValue("17:00:00"), "moduel1.test"
而不能寫成
Application.OnTime date+TimeValue("17:00:00"), "test"
作者: cowww    時間: 2023-8-11 13:56

回復 3# singo1232001

非常感謝singo1232001大大的解惑

還是會出現"違反共用原則"的錯誤訊息
作者: singo1232001    時間: 2023-8-11 14:05

本帖最後由 singo1232001 於 2023-8-11 14:08 編輯

回復 4# cowww


因為沒有看到full_calc的模組  所以無法判斷

但我不建議 把ontime 寫在Thisworkbook模組內
應改寫在自訂模組下
而在open的時候 去call呼叫這個模組
作者: cowww    時間: 2023-8-12 11:30

回復 5# singo1232001

我也是覺得寫在open底下比較好
但是我在公司電腦的權限只有使用者
沒辦法做Windows工作排程器

所以才會想到用ontime
作者: singo1232001    時間: 2023-8-12 16:08

回復 6# cowww


感覺上 ontime這句語法沒問題

而是在這 full_calc 個程序裡面出錯

在full_calc出錯 被彈出來 ontime這邊 會誤認以為是ontime出錯  

應該先另外寫一個直接測試不要用ontime的方式 call full_calc 逐行F8看看

sub testcall
call full_calc
end sub
作者: goner    時間: 2023-8-13 18:14

回復 1# cowww


    可能是資料夾共用、檔案共用權限問題,
可以試試複製一個檔案到另處,資料夾、檔案皆不能是共用。
作者: cowww    時間: 2023-8-14 09:15

回復 7# singo1232001


非常感謝singo1232001大大的解惑
下面的寫法並沒有出現"違反共用原則"
Sub 專案_按鈕22_Click()
Call full_calc
End Sub
作者: cowww    時間: 2023-8-14 09:17

回復 8# goner

非常感謝goner大大的解惑

我是另存一個檔案做修改
也很確定檔案並沒有開起共用
作者: cowww    時間: 2023-8-14 10:12

非常感謝singo1232001大大的解惑
非常感謝goner大大的解惑

將語法改成這樣就沒有出現"違反共用原則"的錯誤訊息了
Function IsFileOpen(filePath As String) As Boolean
    Dim fso As Object
    Dim file As Object
   
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    Set file = fso.OpenTextFile(filePath, 1)
    If Err.Number = 0 Then
        IsFileOpen = False
        file.Close
    Else
        IsFileOpen = True
    End If
    On Error GoTo 0
    Set file = Nothing
    Set fso = Nothing
End Function
======================================
Private Sub Workbook_Open()
Application.OnTime TimeValue("17:00:00"), "full_calc"
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)