使VBA表单只在其他工作簿打开时读取一个工作簿

时间:2018-02-27 16:07:34

标签: excel vba forms excel-vba

我是新来的,我已经阅读了规则,但如果我遗漏了任何内容或发布错误,请通知/原谅我。

现在,我的问题:

我在Visual Basic中创建了第一个表单,它允许我创建一个可搜索和可编辑的数据库。

在允许同事测试表单后,我很快发布他们不能使用他们已打开的任何其他Excel工作簿(其他工作簿与我的工作簿/表单没有任何关系)。

经过一番研究,我发现我可以添加(vbmodeless)打开表单的按钮。然后,这允许团队在表单之间轻弹并使用其他工作簿查看其他信息,然后返回到表单。

我现在唯一的问题是,当它们返回到表单时,它会在宏中读取错误,因为它试图在另一个工作簿上使用宏而不是我的工作簿。

简而言之,有什么方法可以使用(vbmodeless),但将表单宏锁定到我的特定工作簿?

如果有人能解决这个谜团,他们将成为我最好的朋友。我打算准备好在3月6日下周的演讲。

谢谢。

1 个答案:

答案 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