Excel VBA将数据写入第二个工作簿,但开始打开只读版本,因为“_”已经打开

我在一个Excel工作簿中有一些VBA脚本,每个工作簿都有三个从第二个工作簿中读取的子文件。 每个潜艇使用以下algorithm(简化提炼与第二本书的交互):

Public Sub EditRemote() Dim remoteDataSheet As Worksheet Dim source As String 'Source worksheet name Dim target As String 'Target worksheet name Dim path As String Dim wkbName As String source = "CountData" path = ThisWorkbook.Worksheets("Parameters").Range("B2").Value wkbName = ThisWorkbook.Worksheets("Parameters").Range("A2").Value target = "CountData" Application.EnableCancelKey = xlDisabled Set localDataSheet = ThisWorkbook.Sheets(source) If Not WorkbookIsOpen(wkbName) Then Workbooks.Open (path) End If Set remoteDataSheet = Workbooks(wkbName).Sheets(source) remoteDataSheet.Cells(1,1) = localDataSheet.Cells(1,1) remoteDataSheet.Cells(1,2) = localDataSheet.Cells(1,2) Workbooks(wkbName).Close SaveChanges:=True End Sub Function WorkbookIsOpen(targetWorkbook As String) As Boolean Dim testBook As Workbook On Error Resume Next Set testBook = Workbooks(targetWorkbook) If Err.Number = 0 Then WorkbookIsOpen = True Else: WorkbookIsOpen = False End If End Function 

在这个工作簿中还有一个数据透视表,通过外部数据连接从第二个文件中提取数据。 困扰着我的问题是,似乎并不是最初,而是经过几次操作后,这些子程序停止正确编辑,而是打开第二个工作簿的只读副本。 当我尝试手动打开第二个工作簿时,出现一条消息,指出该文件已经打开并被locking以进行编辑。 现在这两个文件都在我的电脑本地,不能被其他人打开。 我错过了什么,以确保我可以使代码按预期工作?

我对代码做了一些修改,运行了几次,没有得到“只读”消息。

在你的代码中,声明localDataSheet的行缺失,添加Dim localDataSheet As Worksheet ,还添加Dim remoteWb As Workbook for the remote workbook。

(没有修改您的Funtion WorkbookIsOpen代码)。

Sub EditRemote Code

 Option Explicit Public Sub EditRemote() Dim remoteDataSheet As Worksheet Dim localDataSheet As Worksheet Dim source As String 'Source worksheet name Dim target As String 'Target worksheet name Dim path As String Dim wkbName As String Dim remoteWb As Workbook source = "CountData" path = ThisWorkbook.Worksheets("Parameters").Range("B2").Value wkbName = ThisWorkbook.Worksheets("Parameters").Range("A2").Value target = "CountData" Application.EnableCancelKey = xlDisabled Set localDataSheet = ThisWorkbook.Sheets(source) ' check if workbbok already open If Not WorkbookIsOpen(wkbName) Then Set remoteWb = Workbooks.Open(path) Else Set remoteWb = Workbooks(wkbName) ' workbook is open >> set remoteWb accordingly End If Set remoteDataSheet = remoteWb.Sheets(source) remoteDataSheet.Cells(1, 1) = localDataSheet.Cells(1, 1) remoteDataSheet.Cells(1, 2) = localDataSheet.Cells(1, 2) Workbooks(wkbName).Close SaveChanges:=True End Sub 

只是为了validationExcel“参数”表中的数据,下面的屏幕截图显示了我用于testing的数据。

单元格A2包含“清洁”工作簿名称。

单元格B2包含workbbok“完整”名称 – path+“干净”工作簿名称。

在这里输入图像说明

经过一些进一步的testing来诊断问题,我发现VBA代码没有什么问题,而是远程Workbook的外部数据连接locking了Workbook,每次刷新使用外部数据的数据透视表中的数据连接作为其来源。 当刷新完成时,它不会解锁文件,并将文件locking,直到我closures带有数据透视表的工作簿。 现在我只需要解决这个问题。