Я пытаюсь использовать код VB из этого вопроса в Excel 2013, и он не работает. Я не знаком с VB и, скорее всего, пропускаю простой шаг.

Private Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range) 
If UCase(Sh.Name) = "sheet1" Or UCase(Sh.Name) = "sheet2" Then 
    If Not Application.Intersect(Target, Range("A1")) Is Nothing Then 
        Application.EnableEvents = False 
        If UCase(Target.Parent.Name) = "SHEET1" Then 
            Sheets("Sheet2").Range("A1") = Target 
        Else 
            Sheets("Sheet1").Range("A1") = Target 
        End If 
        Application.EnableEvents = True 
    End If 
 End If
End Sub

Используя новую рабочую книгу с листами Sheet1 и Sheet2, я попробовал следующее в Visual Basic:

  • вставка кода в объект: ThisWorkbook
  • вставка кода в объекты: Sheet1 (Sheet1) и Sheet2 (Sheet2)
  • вставка кода во все 3 объекта
  • Обеспечение сохранения рабочей книги в качестве макроса
  • убедитесь, что для параметров безопасности книги задан доверительный доступ к объектной модели VBA и включены макросы

Что мне нужно сделать, чтобы запустить этот код?

В ответ на предложение Мэтса Кружка:

Я поместил код в стандартный модуль, как вы предложили, изменил процедуру на Public и изменил диапазон. Тем не менее, я до сих пор не могу заставить его скопировать значения из диапазона на одном листе на другой. Код выглядит сейчас так:

Public Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range)
If UCase(Sh.Name) = "SHEET1" Or UCase(Sh.Name) = "SHEET2" Then
    If Not Application.Intersect(Target, Range("A1:J23")) Is Nothing Then
        Application.EnableEvents = False
        If UCase(Target.Parent.Name) = "SHEET1" Then
            Sheets("Sheet2").Range("A1:J23") = Target
        Else
            Sheets("Sheet1").Range("A1:J23") = Target
        End If
        Application.EnableEvents = True
    End If
 End If
End Sub

2 ответа2

1

Объекты ThisWorkbook и SheetX являются специальными модулями класса "документ"; Макросы легче выявляются в стандартных модулях, поэтому вместо вставки их везде, добавьте новый модуль кода (.bas) и вставьте его туда.

Самый простой способ добавить новый модуль кода - щелкнуть правой кнопкой мыши в любом месте Project Explorer (Ctrl+R) и выбрать « Вставка» > « Модуль».

Следующая проблема заключается в том, что процедура является Private . "Закрытый" означает, что любой код, который должен видеть и вызывать эту процедуру, должен находиться в той же области видимости, то есть в одном и том же модуле. Сделайте его Public и вы сможете звонить из любого места.

Следующая проблема, это параметры. Из реализации выглядит так, будто Sh - это объект Worksheet , а Target - объект Range : для запуска процедуры вам нужно будет предоставить параметры.

Есть много способов сделать это.

Один из них - вызвать непосредственную панель (Ctrl+G) и вызвать ее напрямую:

Module1.Workbook_TwoWayMatch Sheet42, Sheet42.Range("Z123")

Конечно, фактические параметры, которые вы передадите, будут варьироваться в зависимости от того, чего вы пытаетесь достичь, но я надеюсь, что вы поняли идею.

0

Проблема может быть в том, что UCase(Sh.Name) = "sheet1" в строке 2 никогда не произойдет.

Попробуйте изменить их на "SHEET1" и "SHEET2" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .