Я создал книгу с несколькими листами, требующими многочисленных двусторонних связанных ячеек на разных листах в одной книге. Итак, если я отредактирую ячейку B5 на листе A, она автоматически обновит ячейку J2 на листе B с тем же значением. И наоборот, если я обновлю ячейку J2 на листе B, она автоматически обновит ячейку B5 на листе A. Чтобы реализовать двустороннюю связь, я включил следующий код в ThisWorkbook:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Smith,Joe" Then
If Not Application.Intersect(Target, Range("B4")) Is Nothing Then
Application.EnableEvents = False
If Target.Parent.Name = "SomeProject" Then
Sheets("Smith,Joe").Range("B4") = Target
Else
Sheets("SomeProject").Range("B10") = Target
End If
Application.EnableEvents = True
End If
End If
If Sh.Name = "SomeProject" Then
If Not Application.Intersect(Target, Range("B10")) Is Nothing Then
Application.EnableEvents = False
If Target.Parent.Name = "Smith,Joe" Then
Sheets("SomeProject").Range("B10") = Target
Else
Sheets("Smith,Joe").Range("B4") = Target
End If
Application.EnableEvents = True
End If
End If
If Sh.Name = "Smith,Joe" Then
If Not Application.Intersect(Target, Range("C4")) Is Nothing Then
Application.EnableEvents = False
If Target.Parent.Name = "SomeProject" Then
Sheets("Smith,Joe").Range("C4") = Target
Else
Sheets("SomeProject").Range("D10") = Target
End If
Application.EnableEvents = True
End If
End If
If Sh.Name = "SomeProject" Then
If Not Application.Intersect(Target, Range("D10")) Is Nothing Then
Application.EnableEvents = False
If Target.Parent.Name = "Smith,Joe" Then
Sheets("SomeProject").Range("D10") = Target
Else
Sheets("Smith,Joe").Range("C4") = Target
End If
Application.EnableEvents = True
End If
End IF
'This continues with for many different people/projects
End Sub
Это работало без проблем, пока процедура не натолкнулась на ограничение в 64 КБ (узнал об этом на форуме). Чтобы обойти ограничение, я создал несколько отдельных процедур, вызываемых из основного процесса, но ячейки больше не обновляются автоматически. После бесчисленных ошибок и посещений множества форумов я пришел к выводу, что WorkSheet_Change в ThisWorkbook вызывает управляющий процесс в модуле, и все ссылки на рабочие листы и ячейки передаются в качестве переменных. Он по-прежнему больше не обновляет ячейки ни на одном листе. В настоящее время я получаю ошибку времени выполнения 91 (переменная объекта или переменная блока не установлена), когда я прохожу код модуля в подразделе ChangeLogic.
Код ThisWorkbook:
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
В этот момент мои цвета новичка показывают, и я выше головы. Любые предложения о том, что я делаю неправильно и как я могу заставить это работать?
Спасибо.
POINT ONE
ВSub ChangeLogic(Sh, Target, ResourceSheet, ProjectSheet, ResourceCell, ProjectCell)
объявитеResourceSheet As Worksheet
и аналогичным образом объявите другие объекты/переменные.POINT TWO
код находится в основном модуле. Как он поймет, что такоеTarget
или что такоеSh
? Я вижу, вы установили другие объекты/переменные, но как насчет этих двух?POINT THREE
И как вам удалось достичь лимита в 64 КБ? Я вижу много ненужногоApplication.EnableEvents = False/True
Я уверен, что есть и другие ненужные фрагменты кода. - person Siddharth Rout   schedule 08.11.2013CONTD FROM ABOVE...
Ваш внутренний 5-строчный IF/ENDIF можно заменить на 2-строчный. Ваш основной IF/Endif может использовать ESLEIF. Это гарантирует, что вам не нужны дополнительные ENDIFS. В качестве альтернативы вы можете использовать SELECT CASE - person Siddharth Rout   schedule 08.11.2013