Как ограничить код VBA для конкретного листа? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь ограничить макрос определенным тестом! рабочий лист Когда я активирую макрос, вставленный ниже, и я нахожусь в тесте! лист, макрос работает. Однако, когда я пытаюсь активировать макрос на другом листе, я получаю сообщение об ошибке. Любая идея о том, что мне нужно сделать, чтобы изменить код VBA для того, чтобы он работал любой другой лист в книге? Спасибо

Sub Test ()
' Test Macro
'
' Keyboard Shortcut: Ctrl+Shift+B
'
  Range ("Test!B1").Select 
  Selection.ClearContents
  Range ("Test!B2").Select
  Selection.ClearContents
  Range ("Test!B3").Select
  Selection.ClearContents
End Sub

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Если лист существует во время компиляции в ThisWorkbook (то есть в том же файле, в котором размещен код VBA), вам не нужно извлекать лист вообще - не по имени, не по индексу.

VBA уже объявляет глобальную переменную объекта Worksheet для этого листа (и каждого листа в ThisWorkbook). Проверьте свойство листа (Name); измените его на TestSheet, тогда вы можете использовать TestSheet в качестве идентификатора в любом месте вашего кода для ссылки на этот лист.

TestSheet.Range("B1:B3").ClearContents

И этот код будет работать независимо от того, переместил ли пользователь лист в другой индекс / позицию в книге или переименовал ли пользователь «вкладку» листа во что-то другое.

ThisWorkbook.Worksheets(1).Range("B1:B3").ClearContents ' breaks if sheet is moved
ThisWorkbook.Worksheets("Test").Range("B1:B3").ClearContents ' breaks if sheet/tab is renamed
0 голосов
/ 03 ноября 2018

Основы

Если вы хотите чему-то научиться, вы должны изучить версии 1 и 2, которые являются тщательно разработанными версиями версий 3 и 4 соответственно.

Используйте Option Explicit для быстрого поиска ошибок.
Используйте константы, чтобы иметь возможность быстро изменять значения.
Используйте ссылки на объекты, чтобы не вводить и не вводить имена.

Предполагается, что вы скопируете эти коды в любой модуль рабочей книги, где находится рабочая таблица «Тест».

Option Explicit

Sub Test1()

  Const cStrWs As String = "Test" 'Worksheet Name
  Const cStrRng As String = "B1:B3" 'Range to 'DEL'

  Dim oWs As Worksheet 'Worksheet Object
  Dim oRng As Range 'Range Object

  Set oWs = ThisWorkbook.Worksheets(cStrWs) 'Create a reference to the worksheet
  Set oRng = oWs.Range(cStrRng) 'Create a reference to the range

  oRng.ClearContents

End Sub

Sub Test2()

  Const cStrWs As String = "Test" 'Worksheet Name
  Const cStrCell As String = "B1" 'Cell to 'DEL'
  Const cLngCells As Long = 3 'Number of cells

  Dim oWs As Worksheet 'Worksheet Object
  Dim oRng As Range 'Range Object

  Set oWs = ThisWorkbook.Worksheets(cStrWs) 'Create a reference to the worksheet
  Set oRng = oWs.Range(cStrCell) 'Create a reference to the cell range

  oRng.Resize(3, 1).ClearContents

End Sub

Sub Test3()
  ThisWorkbook.Worksheets("Test").Range("B1:B3").ClearContents
End Sub

Sub Test4()
  ThisWorkbook.Worksheets("Test").Range("B1").Resize(3, 1).ClearContents
End Sub
0 голосов
/ 02 ноября 2018

Вы должны ссылаться на рабочий лист напрямую:

Dim ws as worksheet
set ws = Thisworkbook.Worksheets("Test")

with ws
  .Range("B1:B3").ClearContents  
end with

Другие заметки: Не используйте .Select или Selection. Просто работайте с объектами напрямую. У вас есть проблемы со строкой в ​​вашем исходном коде, которые могут вызвать ошибки во время компиляции (исправлено в моем коде) Вы можете очистить весь диапазон в одной строке кода, а не по ячейке за ячейкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...