VBA访问/ Excel - 切换读/写

时间:2015-05-25 11:48:13

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

使用VBA访问

是否有更有效的方法将开放式只读excel文件设置为读/写模式? 或者检查read read是否为true,等待读/写激活

我创建了一个连续循环,打开和关闭文件,直到读/写处于活动状态。然而,有时它有时会起作用,但并不令人沮丧。

我已经研究过切换读/写还有Changefileaccess甚至是SETATTR函数

Dim xl As Object

Set xl = CreateObject("Excel.Application")


Do Until xl.ActiveWorkbook.ReadOnly = False
xl.Quit
xl.Workbooks.Open ("C:\TEST\Test.xlsb")
If xl.ActiveWorkbook.ReadOnly = False Then Exit Do
Loop

2 个答案:

答案 0 :(得分:1)

很少有观察结果:

  1. 您的代码有可能进入无限循环。再次重新检查之前,请等待一段时间。
  2. 定义代码重新打开的次数。
  3. 不要使用CreateObjectCreateObject创建了一个新的应用程序。如果您要使用已打开的文件,请使用GetObject
  4. 在重新打开文件之前,检查属性是否只读。
  5. 请参阅此示例(未经测试

    Sub Sample()
        Dim objxlAp As Object, objxlWb As Object
        Dim FlName As String
        Dim NumberOfAttempt As Long
    
        FlName = "C:\TEST\Test.xlsb"
    
        Set objxlAp = GetObject(, "Excel.Application")
        Set objxlWb = objxlAp.ActiveWorkbook
    
        Do Until objxlWb.ReadOnly = False
            objxlWb.Close (False)
    
            If GetAttr(FlName) = vbReadOnly Then _
            SetAttr FlName, vbNormal
    
            objxlAp.Workbooks.Open (FlName)
    
            If objxlWb.ReadOnly = False Then Exit Do
    
            Wait 60 '<~~ Wait for 60 seconds. Change as Applicable
            NumberOfAttempt = NumberOfAttempt + 1
    
            If NumberOfAttempt > 5 Then
                MsgBox "Tried reopening the file 5 times. Unable to do it. Exiting the loop"
                Exit Do
            End If
        Loop
    End Sub
    
    Private Sub Wait(ByVal nSec As Long)
        nSec = nSec + Timer
        While nSec > Timer
            DoEvents
        Wend
    End Sub
    

    重要提示:我可以使用这两种方式将工作簿设为只读

    1. 右键单击该文件并将属性设置为ReadOnly
    2. 文件另存为 - 只读推荐。以上代码不适用于此方法。
    3. 我的假设

      您不在其他用户打开过该文件的网络上。

答案 1 :(得分:0)

您可以使用GetAttr检查:

If ((GetAttr("C:\tmp\Test.xlsb")) And vbReadOnly) Then
Debug.Print "Do something, file is read only"
End If

也许在打开文件之前更改此属性?

Sub OpenRW()

Dim wb As Workbook

Set wb = Workbooks.Open("C:\tmp\Test.xlsb")
Debug.Print "1. ReadOnly? " & ActiveWorkbook.ReadOnly 'read only
wb.Close
SetAttr "C:\tmp\Test.xlsb", vbNormal
Set wb = Workbooks.Open("C:\tmp\Test.xlsb") 'read/write
Debug.Print "2. ReadOnly? " & ActiveWorkbook.ReadOnly
wb.Close
SetAttr "C:\tmp\Test.xlsb", vbReadOnly
Set wb = Workbooks.Open("C:\tmp\Test.xlsb")
Debug.Print "3. ReadOnly? " & ActiveWorkbook.ReadOnly 'read only
wb.Close

End Sub

结果:

OpenRW
1. ReadOnly? True
2. ReadOnly? False
3. ReadOnly? True