我是新来的,我已经阅读了规则,但如果我遗漏了任何内容或发布错误,请通知/原谅我。
现在,我的问题:
我在Visual Basic中创建了第一个表单,它允许我创建一个可搜索和可编辑的数据库。
在允许同事测试表单后,我很快发布他们不能使用他们已打开的任何其他Excel工作簿(其他工作簿与我的工作簿/表单没有任何关系)。
经过一番研究,我发现我可以添加(vbmodeless)打开表单的按钮。然后,这允许团队在表单之间轻弹并使用其他工作簿查看其他信息,然后返回到表单。
我现在唯一的问题是,当它们返回到表单时,它会在宏中读取错误,因为它试图在另一个工作簿上使用宏而不是我的工作簿。
简而言之,有什么方法可以使用(vbmodeless),但将表单宏锁定到我的特定工作簿?
如果有人能解决这个谜团,他们将成为我最好的朋友。我打算准备好在3月6日下周的演讲。
谢谢。
答案 0 :(得分:1)
嗯,让我们像tigeravatar一样说,你还没有宣布工作簿:
Dim ws As Workbook
ws = ActiveWorkbook
'instead of
Sheets("Sheet1").Range("A3") = 5 'for example
'you would have
ws.Sheets("Sheet1").Range("A3") = 5
您也可以使用工作表本身,但您必须使用参数并搜索每个参数:
Dim ws As Workbook
Dim sh, SpecificSheet1, SpecificSheet2 as Object 'To manipulate sheets
Dim Name_Sheet1, Name_Sheet2 As String
Set ws = ActiveWorkbook
Name_Sheet1= "Sheet1"
Name_Sheet2= "Sheet2"
For Each sh In Sheets
If InStr(sh.Name, Name_Sheet1) = 1 Then
Set SpecificSheet1 = sh
ElseIf InStr(sh.Name, Nom_Ref_Donnees) = 1 Then
Set SpecificSheet2 = sh
End If
Next
'而不是:
Sheets("Sheet1").Range("A3") = 5 'for example
'你会使用:
SpecificSheet1.Range("A3") = 5
根据你使用subs的方式,这两个解决方案可能需要使用这些对象的公共声明:
Option Explicit
Public ws As Workbook
Public SpecificSheet1, SpecificSheet2 as Object 'To manipulate sheets
Sub yoursub()
Dim sh, SpecificSheet1, SpecificSheet2 as Object 'To manipulate sheets
Dim Name_Sheet1, Name_Sheet2 As String
If (IsEmpty(ws)) Then
Set ws = ActiveWorkbook
Else
ws.activate
End If
Name_Sheet1= "Sheet1"
Name_Sheet2= "Sheet2"
For Each sh In Sheets
If InStr(sh.Name, Name_Sheet1) = 1 Then
Set SpecificSheet1 = sh
ElseIf InStr(sh.Name, Nom_Ref_Donnees) = 1 Then
Set SpecificSheet2 = sh
End If
Next
End Sub