2015-11-17 2 views
1

У меня есть фрагмент кода, который ищет диапазон на текущем листе для определенного значения ячейки, а затем выполняет действие в этом столбце. Макрос запускается кнопкой управления формой на той же странице. Мне нужно переместить кнопку управления формой на другой рабочий лист, но я не уверен, как обмануть мой код только для поиска в листе1, а не на листе, где находится кнопка.Как найти конкретное значение ячейки в отдельном листе?

Ниже приведен мой код, который работает при использовании на том же рабочем листе, что и данные. Мне просто нужно посмотреть на лист1 вместо текущего листа.

Dim R1 As Range 
    Set R1 = Range(Range("A2:AX2").Find("BMA Authorization ID"), Range("A2:AX2").Find("BMA Authorization ID").End(xlDown)) 
    R1.Select 
    R1.Copy 
    R1.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
+3

Отметьте диапазон с нужным листом. – findwindow

ответ

5

Используйте With ... End With statement, чтобы установить диапазон/ячейки родительского листа.

with worksheets("Sheet1") '<~~change to suit 
    with .Range(.Range("A2:AX2").Find("BMA Authorization ID"), _ 
       .Range("A2:AX2").Find("BMA Authorization ID").End(xlDown)) 
     .value = .value 'same as .Copy .PasteSpecial xlPasteValues 
    end with 
end with 

Обратите внимание, что все Range(...) теперь .Range(...). Префиксный период (aka . или полная остановка) делает все родительские диапазоны листами, на которые ссылается внутри With .. End With.

+0

Ударьте меня на 20 секунд. –

+0

@ScottCraner, и вы двое избили меня на 1 минуту. Мне нужно быстрее, hmph! – BruceWayne

+0

Я не проверял синтаксис в VBE :) – Jeeped

1

Вы можете просто использовать Sheets(1).Range... или Sheets("Sheet1").Range...

Посмотрите здесь для получения более подробной информации о ссылках листов в VBA ... Trying to reference another worksheet in active workbook

EDIT: Пожалуйста, не принимайте это как аргумент против другие ответы здесь. Они отличные ответы для OP (часть того, почему я ждал, пока не будет принято). Я просто думаю, что это стоит упомянуть как соображение.

Я лично адаптированный, пришел к пониманию, и будет рекомендовать конвенции избежать with заявлений по возможности в соответствии со следующими настроениями ...

Почему не C# есть VB.NET на «с» оператор?

Многие люди, в том числе дизайнеры языка C#, считают, что «с» часто наносит ущерб читаемости и является скорее проклятием, чем благословением. Яснее объявить локальную переменную со значимым именем и использовать эту переменную для выполнения нескольких операций над одним объектом, чем для того, чтобы иметь блок с каким-то неявным контекстом.

по @Jon Skeet
https://stackoverflow.com/a/4174826/3546415

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

Dim S1 As Worksheet 
Set S1 = Sheets("Sheet1") 
S1.Range... blah blah 

Конечно, есть еще ситуации, в которых с помощью with это все еще имеет смысл. Например, когда переменная не может быть определена или при настройке большого количества свойств, но я согласен с тем, что читаемость обычно улучшается, когда вам не нужно беспокоиться о вложенности и проверке верхней части вашей структуры with, чтобы увидеть, что .Range на самом деле имеет в виду. Для простой программы это вряд ли проблема, но стоит помнить о чем-то более сложном.

+0

Просто примечание о том, что 'Sheets (1)' не обязательно совпадает с 'Sheets (" Sheet1 ")'. Как правило, они будут, но не всегда! В этом случае формат «Листы» ([индекс листа №]) «против» Листы («[имя листа]»). – BruceWayne

+0

@BruceWayne Да, хорошо прояснить, вот почему ссылка – u8it

+0

А, не проверял ссылку. Спасибо за это! – BruceWayne

5

В качестве предлагаемого поискового запроса; вам нужно квалифицировать лист. Normaly Я бы оставил это в комментариях, но строка слишком длинная, чтобы не использовать блок с блоком.

Dim R1 As Range 
Dim ws As Worksheet 

Set ws = Sheets("Sheet1")'Change this name to the sheet desired. 
'Use a with block. 
'When using a with block .Range = ws.Range 
With ws 
    Set R1 = .Range(.Range("A2:AX2").Find("BMA Authorization ID"), .Range("A2:AX2").Find("BMA Authorization ID").End(xlDown)) 
    R1.Value = R1.Value 
End With 
+0

Спасибо. Именно то, что мне нужно. – UnbrokenChain

Смежные вопросы