Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从工作簿中调用过程时出现问题\u SheetChange_Vba_Excel_Worksheet Function - Fatal编程技术网

Vba 从工作簿中调用过程时出现问题\u SheetChange

Vba 从工作簿中调用过程时出现问题\u SheetChange,vba,excel,worksheet-function,Vba,Excel,Worksheet Function,我创建了一个包含多个工作表的工作簿,在同一工作簿的不同工作表中需要大量双向链接的单元格。因此,如果我编辑工作表中的单元格B5,它将自动使用相同的值更新工作表中的单元格J2。相反,如果我更新工作表TB中的单元格J2,它将自动更新工作表TA中的单元格B5。为了完成双向链接,我在该工作簿中包含了以下代码: 这项工作没有问题,直到程序遇到64k限制(在论坛上发现)。为了绕过这个限制,我创建了多个从主进程调用的独立过程,但是单元格不再自动更新。在无数次错误和访问无数论坛之后,我终于在这个工作簿中找到了工作

我创建了一个包含多个工作表的工作簿,在同一工作簿的不同工作表中需要大量双向链接的单元格。因此,如果我编辑工作表中的单元格B5,它将自动使用相同的值更新工作表中的单元格J2。相反,如果我更新工作表TB中的单元格J2,它将自动更新工作表TA中的单元格B5。为了完成双向链接,我在该工作簿中包含了以下代码:

这项工作没有问题,直到程序遇到64k限制(在论坛上发现)。为了绕过这个限制,我创建了多个从主进程调用的独立过程,但是单元格不再自动更新。在无数次错误和访问无数论坛之后,我终于在这个工作簿中找到了工作表\u Change,在一个模块中调用一个控制过程,所有工作表和单元格引用都作为变量传入。它仍然不会再更新任一工作表上的单元格。现在,当我在ChangeLogic子模块中单步执行模块代码时,我得到一个运行时错误91(对象变量或未设置块变量)

此工作簿代码:

“主”模块中的代码:

在这一点上,我的新手颜色显示,我在我的头。有没有关于我做错了什么以及如何让它发挥作用的建议


谢谢。

我已经厌倦了输入评论,所以我不妨在这里输入,让我说的更清楚

我不确定您是如何达到64k限制的。正如上面的评论所提到的,您可以以更结构化/紧凑的方式编写代码。当前您的代码有
44行
不包括
Sub/End Sub/Comments
相同的代码可以写在
24行

所以这是直接节省20行

想象一下,当您删除所有不必要的
应用程序时,最终代码将减少多少。EnableEvents
/
IF-ENDIF

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    On Error GoTo Whoa

    Application.EnableEvents = False

    Select Case Sh.Name
    Case "Smith,Joe"
        If Not Application.Intersect(Target, Range("B4")) Is Nothing Then _
        If Target.Parent.Name = "SomeProject" Then Sheets("Smith,Joe").Range("B4") = Target Else _
        Sheets("SomeProject").Range("B10") = Target

        If Not Application.Intersect(Target, Range("C4")) Is Nothing Then _
        If Target.Parent.Name = "SomeProject" Then Sheets("Smith,Joe").Range("C4") = Target Else _
        Sheets("SomeProject").Range("D10") = Target
    Case "SomeProject"
        If Not Application.Intersect(Target, Range("B10")) Is Nothing Then _
        If Target.Parent.Name = "Smith,Joe" Then Sheets("SomeProject").Range("B10") = Target Else _
        Sheets("Smith,Joe").Range("B4") = Target

        If Not Application.Intersect(Target, Range("D10")) Is Nothing Then _
        If Target.Parent.Name = "Smith,Joe" Then Sheets("SomeProject").Range("D10") = Target Else _
        Sheets("Smith,Joe").Range("C4") = Target

        'This continues with for many different people/projects
    End Select
LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

你想让它做什么,它在做什么?嗨,山姆。很抱歉在帖子里说不清楚。我试图在同一工作簿中不同工作表中的单元格之间创建双向链接。因此,如果我编辑工作表中的单元格B5,它将自动使用相同的值更新工作表中的单元格J2。相反,如果我更新工作表TB中的单元格J2,它将自动更新工作表TA中的单元格B5。我将把这个添加到帖子中。感谢它所做的一切。。。一旦我开始从proc中调用proc,它就不会在任何一个工作表上更新。我已经根据不同的问题对代码进行了多次更改。现在,当我在ChangeLogic sub中单步执行模块代码时,我得到了一个运行时错误91(对象变量或未设置块变量)。Birds视图:
sub ChangeLogic(Sh、目标、ResourceSheet、ProjectSheet、ResourceCell、ProjectCell)中的第一点
资源表声明为工作表
,并同样声明其他对象/变量<代码>第二点代码位于主模块中。它将如何理解什么是
Target
或什么是
Sh
?我看到您设置了其他对象/变量,但是这2个呢<代码>第三点您是如何达到64k限制的?我可以看到很多不必要的
Application.EnableEvents=False/True
我确信还有其他不必要的代码。
CONTD从上面…
可以将内部5行IF/ENDIF更改为2行。主IF/Endif可以使用ESLEIF。这将确保您不需要额外的endif。或者,您可以使用SELECT case,这本质上就是我在初始代码示例中所做的(尽管没有您的示例那么有效)。问题是我有太多的案例(8个项目工作表*20人工作表*12个单元格),这就是我如何碰到64k限制的原因。刷新页面。如果有8个工作表,则不能有超过8个案例;)你需要像我上面所做的那样对它们进行分组…一个范围的父名称是工作表,在已经得到一个真实的陈述,即案例是
Smith,Joe
@user2140261:true之后,测试工作表是否是
SomeProject
的目的是什么。事实上,如果Target.Parent.Name=“SomeProject”然后是Sheets(“Smith,Joe”).Range(“B4”)=Target-Else(“SomeProject”).Range(“B10”)=Target,那么整个
就没有意义了,但这与问题无关。我正在演示如何压缩代码,使其不会达到64k限制。嗨,Siddharth。我感谢你花时间写出上面的例子。我用你的代码替换了我的代码,虽然我能通过比以前更多的案例,但我仍然达到了64k的极限。事实上,我只是有太多的案件为一个单一的过程。对于将案例正确拆分为可从此工作簿中调用的模块的原始问题,有何建议?又是Thx。
Option Explicit

Public Sh As Object
Public Target As Range
Public ResourceSheet As Object
Public ProjectSheet As Object
Public ResourceCell As String
Public ProjectCell As String

Private Sub Worksheet_Change(ByVal Sh As Object, ByVal Target As Range)

   Run "Main"

End Sub
Sub Main()

    Call JoeMain

End Sub

Sub JoeMain()

    Set ResourceSheet = Sheets("Smith,Joe")
    Set ProjectSheet = Sheets("SomeProject")

    Call Joe1
    Call ChangeLogic(Sh, Target, ResourceSheet, ProjectSheet, ResourceCell, ProjectCell)

    Call Joe2
    Call ChangeLogic(Sh, Target, ResourceSheet, ProjectSheet, ResourceCell, ProjectCell)

    'Continues on for all cases involing Joe Smith.  I haven't gotten to iterating through project names as of yet

End Sub

Sub Joe1()

    ResourceCell = "B4"
    ProjectCell = "B10"

End Sub

Sub Joe2()

    ResourceCell = "C4"
    ProjectCell = "D10"

End Sub

Sub ChangeLogic(Sh, Target, ResourceSheet, ProjectSheet, ResourceCell, ProjectCell)
    If Sh.Name = ResourceSheet.Name Then
        If Not Application.Intersect(Target, Range(ResourceCell)) Is Nothing Then
            Application.EnableEvents = False
            If Target.Parent.Name = ProjectSheet.Name Then
                Sheets(ResourceSheet.Name).Range(ResourceCell) = Target
            Else
                Sheets(ProjectSheet.Name).Range(ProjectCell) = Target
            End If
            Application.EnableEvents = True
        End If
    End If
    If Sh.Name = ProjectSheet.Name Then
        If Not Application.Intersect(Target, Range(ProjectCell)) Is Nothing Then
            Application.EnableEvents = False
            If Target.Parent.Name = ResourceSheet.Name Then
            Sheets(ProjectSheet.Name).Range(ProjectCell) = Target
            Else
                Sheets(ResourceSheet.Name).Range(ResourceCell) = Target
            End If
            Application.EnableEvents = True
        End If
    End If
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    On Error GoTo Whoa

    Application.EnableEvents = False

    Select Case Sh.Name
    Case "Smith,Joe"
        If Not Application.Intersect(Target, Range("B4")) Is Nothing Then _
        If Target.Parent.Name = "SomeProject" Then Sheets("Smith,Joe").Range("B4") = Target Else _
        Sheets("SomeProject").Range("B10") = Target

        If Not Application.Intersect(Target, Range("C4")) Is Nothing Then _
        If Target.Parent.Name = "SomeProject" Then Sheets("Smith,Joe").Range("C4") = Target Else _
        Sheets("SomeProject").Range("D10") = Target
    Case "SomeProject"
        If Not Application.Intersect(Target, Range("B10")) Is Nothing Then _
        If Target.Parent.Name = "Smith,Joe" Then Sheets("SomeProject").Range("B10") = Target Else _
        Sheets("Smith,Joe").Range("B4") = Target

        If Not Application.Intersect(Target, Range("D10")) Is Nothing Then _
        If Target.Parent.Name = "Smith,Joe" Then Sheets("SomeProject").Range("D10") = Target Else _
        Sheets("Smith,Joe").Range("C4") = Target

        'This continues with for many different people/projects
    End Select
LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub