我已经制作了一个宏来打开两个工作簿并用它们做一些事情。此宏从第三个工作簿运行,该工作簿调用任何其他两个用户选择的工作簿,在它们打开之前,我不知道他们的名字。
所以!我知道Excel 2010没有内置函数来检查工作簿是否处于打开状态,所以我一直在尝试将工作簿与Nothing
进行比较,但它并不起作用。我在不同站点发现的解决方法倾向于使用工作簿的名称
还有另一种方法吗?
我们的想法是使用两个用户定义的工作簿运行一个宏,然后,可能在相同的工作簿中重新运行它,但Excel让我感到温暖,因为我放弃了更改。
也许一个解决方法可能是告诉excel何时提示重新打开,而不是重新打开并处理该错误只是使用相同的工作簿,至少,我知道部分或名称将如何。
例如,一个人将有文本" cluster"在其中,另一个词是"翻译"所以,也许在下一个循环中,我可以找到并使用我需要的工作簿,但只是如果我已经检查过它是否打开。或者,这种方式是否有效,看它是否已经打开?
For each wbk in Application.Workbooks
If wbk.Name Like "*cluster*" Then
WorkingWorkbook = wbk.Name
End If
next
我的代码如下:
Sub structure()
Application.ScreenUpdating = False
Dim translationWorkbook As Worksheet
Dim clusterWorkbook As Workbook
If Not clusterWorkbook Is Nothing Then
Set clusterWorkbook = Application.Workbooks.Open(ThisWorkbook.Sheets(1).Range("E5").Value2)
Else
Set clusterWorkbook = Application.Workbooks(parseFilePath(ThisWorkbook.Sheets(1).Range("E5")))
End If
Set translationWorkbook = Application.Workbooks.Open(ThisWorkbook.Sheets(1).Range("E6").Value2).Worksheets("String_IDs_Cluster") 'Translation table target for completing
End Sub
传递给Workbooks.Open
的参数是我的下一个函数写在工作表中的参数:
Private Sub MS_Select_Click()
Dim File As Variant
Dim Filt As String
Filt = "Excel 97-2003 File(*.xls), *.xls," & "Excel File(*.xlsx),*.xlsx," & "Excel Macro File (*.xlsm),*.xlsm"
File = Application.GetOpenFilename(FileFilter:=Filt, FilterIndex:=2, Title:="Select Menu Structure File")
If File = False Or File = "" Then
MsgBox "No File Selected"
Exit Sub
End If
ThisWorkbook.ActiveSheet.Range("E5").Value2 = File
End Sub
对于translationWorkbook也是如此,但是在不同的单元格中,我也试图创建一个函数来解析并在完整路径中使用文件名(然后我发现了命令Dir
lol)但是当我传递文件名时,没有Application.Workbooks(file)
的xls扩展名,它会向我发送"下标范围错误"。
为什么会这样?
基本上我的问题是:
Application.Workbooks()
打开工作簿并返回我的函数失败?在这里我的问题分成两部分......首先:有了我的功能,如果我给一个字符串作为参数,它是否会起作用?或者,在将它作为参数传递之前,我需要将函数的结果赋给变量? Application.Workbooks("clusterworkbook")
工作簿,它会向我发送另一个"下标错误"但是,在我使用文件对话框提示之前,我就这样做了并且工作正常。任何帮助将不胜感激。
修改
添加了ParseFilePath函数:
Function parseFilePath(fullpath As Range) As String
Dim found As Boolean
Dim contStart As Integer
Dim contEnd As Integer
contEnd = InStr(fullpath, ".") - 1
contStart = contEnd
found = False
Do While found = False
If fullpath.Characters(contStart, 1).Text = "\" Then
found = True
Else
contStart = contStart - 1
End If
Loop
parseFilePath = fullpath.Characters(contStart + 1, (contEnd - contStart)).Text
End Function
答案 0 :(得分:1)
- 如何检查打开的工作簿并使用它?通过处理excel提示错误或不尝试重新打开同一文件。
醇>
对您的程序进行了一些小的修改structure
。类似于您尝试测试工作簿变量是什么,只有您必须首先尝试设置变量,您执行它的方式将始终返回空,因为您之前没有尝试设置它。我也测试了翻译工作簿,因为它也可能是开放的。
我假设E5
和E6
中的值包含工作簿的FullName
(即路径+文件名),而parseFilePath
是提取来自FullName
。
Sub structure()
Application.ScreenUpdating = False
Dim clusterWorkbook As Workbook
Dim translationWorkbook As Workbook
Dim translationWorksheet As Worksheet
With ThisWorkbook.Sheets(1)
On Error Resume Next
Set clusterWorkbook = Application.Workbooks(parseFilePath(.Range("E5").Value2))
On Error GoTo 0
If clusterWorkbook Is Nothing Then Set clusterWorkbook = Application.Workbooks.Open(.Range("E5").Value2)
'Set Translation table target for completing
On Error Resume Next
Set translationWorkbook = Application.Workbooks(parseFilePath(.Range("E6").Value2))
On Error GoTo 0
If translationWorkbook Is Nothing Then
Set translationWorksheet = Application.Workbooks.Open(.Range("E6").Value2).Sheets("String_IDs_Cluster")
Else
Set translationWorksheet = translationWorkbook.Sheets("String_IDs_Cluster")
End If
End With
End Sub
- 为什么尝试使用Application.Workbooks()打开工作簿 我的功能返回失败了吗?在这里我的问题分成两部分...... 第一:用我的功能,如果我把一个字符串作为一个字符串,它是否会起作用 争论?或者,在将其作为参数传递之前,我需要分配 我的函数对变量的结果?
醇>
不确定为什么它不起作用,按照指示更改程序。
我使用此函数测试了上述过程,从Filename
中提取Fullname
并且它有效:
Function parseFilePath(sFullName As String) As String
parseFilePath = Right(sFullName, Len(sFullName) - InStrRev(sFullName, "\"))
End Function
- 第二:如果我尝试打开像这个Application.Workbooks(“clusterworkbook”)这样的工作簿,它会发给我另一个 “下标错误”但是,在我使用文件对话框提示之前,我做到了 这样,工作得很好。
醇>
请记住,您没有单独使用该行,它很可能具有以下内容:
set Workbook = Application.Workbooks("clusterworkbook")
因此命令是设置一个变量,而不是打开工作簿,因此这种情况的唯一情况是工作簿已经打开,因此变量已设置。失败的时间是当工作簿未打开并且您尝试设置变量时,给出错误。
建议访问这些页面 Excel Objects,On Error Statement
答案 1 :(得分:1)
我一直在使用以下代码来确定excel工作簿是否已打开。如果是,那么我激活它并做一些事情。如果没有,我打开它并做一些事情。
sub test()
Dim Ret
Ret = IsWorkBookOpen("Your excel workbook full path")
If Ret = False Then
Workbooks.Open FileName:="Your excel workbook full path", UpdateLinks:=False
Else
Workbooks("Workbook name").Activate
End If
end sub
Function IsWorkBookOpen(FileName As String)
Dim ff As Long, ErrNo As Long
On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: IsWorkBookOpen = False
Case 70: IsWorkBookOpen = True
Case Else: Error ErrNo
End Select
End Function