Страницы: 1
RSS
Подскажите, как можно в VBA использовать переменные в диапазоне функции Range ?
 
Подскажите, как можно в VBA использовать переменные в диапазоне функции Range ?
Например, выражение 1 работает корректно.
Код
1). Range(Cells(1, 10), Cells(1, 10)).Value = 300
Далее вместо Cell (1,10) хотел бы использовать Cell (I,K) ....
Код
Пытаюсь по аналогии заменить Range("$A2:$D$61") на Range(Cells(2, 1), Cells(61, 4)) - вылетает ошибка 1004
Применяю совместно с LOOKUP. Выражение 2 работает корректно, выражение 3 с ошибкой 1004.
Код
2). Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), Workbooks("bill.xlsx").Sheets("Phone").Range("$A2:$D$61"), 4, 0)
Код
3). Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), Workbooks("bill.xlsx").Sheets("Phone").Range(Cells(2, 1), Cells(61, 4)), 4, 0)
При этом доступ к файлу и листу есть.
Код
Workbooks.Open "D:\Test\Bill.xlsx"
ActiveSheet.Name = "Phone"
Может есть какие идеи?
Спасибо!
Изменено: YGrigor18 - 22.06.2021 10:19:26 (получил замечание)
 
Код
  Dim Rezult3
  Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), _
  Workbooks("bill.xlsx").Sheets("Phone").Range("$A2:$D$61"), 4, 0)
  With Workbooks("bill.xlsx").Sheets("Phone")
    Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), _
    .Range([COLOR=#ff0000].[/COLOR]Cells(2, 1), [COLOR=#ff0000].[/COLOR]Cells(61, 4)), 4, 0)
  End With

увеличу немного:
.Range(.Cells(2, 1), .Cells(61, 4)), 4, 0)
и отвечая на ваш вопрос "как использовать?", ответ: используйте корректно
Изменено: vikttur - 26.06.2021 00:16:10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Подробнее о проблеме …
Коротко: коллекция Cells всегда ссылается на активный лист, даже, если она находится внутри Range, лист для которого указан  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Спасибо за помощь,  строка работает.
Остался один момент ...
Есть в VLOOKUP  фрагмент, где указывается  Range(Cells(7, 4), Cells(7, 4)
Нужно ли прописать в полном формате (книга, лист), откуда взяты эти ячейки?
И как, по аналогии ?
Код
Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), _
 Workbooks("bill.xlsx").Sheets("Phone").Range("$A2:$D$61"), 4, 0)
 With Workbooks("bill.xlsx").Sheets("Phone")
   Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), _
   .Range(.Cells(2, 1), .Cells(61, 4)), 4, 0)
 End With
Изменено: vikttur - 26.06.2021 00:16:30
 
Yuri Kr [ Женщина ] создавая тему на другом форуме, информируйте об этом
http://www.excelworld.ru/forum/10-47757-1
 
YGrigor18, не нужно писать через строку (#1).
Код (#4) следует оформлять соответствующим тегом: найдите кнопку <...> и исправьте свой сообщение.
 
Добрый день!
Подскажите как представить Range("I9:I600,K9:K600,M9:M600") к виду Range(Cells(9, 9), Cells(600, 9)......... ? если перечисляю диапазон через запятую выдает ошибку.
 
Это? Метод Application.Union (Excel) | Microsoft Learn
 
Дмитрий Богданович, здравствуйте
"A1" — это адрес
Range("A1") — диапазон(одна ячейка)

"A1:A10" — это адрес
Range("A1:A10") — диапазон(одна область, 10 ячеек)

Cells(1, 1) — диапазон (одна ячейка). То же что и Range("A1")
Cells(1, 1).Resize(10,0) — диапазон(одна область, 10 ячеек). То же, что и Range("A1:A10")
Range(Cells(1, 1), Cells(10, 1) ) — диапазон(одна область, 10 ячеек). То же, что и Range("A1:A10"). Cells задают координаты [начала и конца] левого верхнего и правого нижнего углов диапазона.

Соответственно, отвечая на ваш вопрос "как представить Range", в общем виде:
Range( Range(Cells(9, 9), Cells(600, 9)).Address, Range(), Range(), …)
или покороче
Union( Cells(9, 9).Resize(592,0), Cells().Resize(), … )

"Зачем" и "можно ли как-то иначе" — уже совсем другая история  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Огромное спасибо буду пробовать, можно ещё один вопрос:
К примеру диапазон ячеек меняется, в первом случае он Range("I9:I600,K9:K600,M9:M600"), во втором он Range("I9:I600,K9:K600), в третьем он Range("I9:I600,K9:K600,M9:M600",O9:O600") как выразить такой диапазон в переменную циклом?
 
Дмитрий Богданович, очевидно, нужно собрать эти адреса в строку и передать в Range. Собирать проще всего в массив (лучше строковый), который потом сцепить с помощью Join(aStr, ",").
    Важно! Если длина строки с адресами будет более 255 символов, то Range её обрежет (или будет ошибка). Путь решения — тут.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
открывайте файл
пишите сколько колонок нужно
жмите кнопку
листайте вниз не отмечено-ли там чего-то лишнего)
Код
Function I9_600(kc&)
  Dim c&, rg As Range, rg1 As Range
  Set rg = Cells(9, 9).Resize(592, 1): Set rg1 = rg
  For c = 2 To (kc - 1) * 2 Step 2
    Set rg = Union(rg, rg1.Offset(0, c))
  Next
  Set I9_600 = rg
End Function

Sub Banzay()
  Dim c&
  'используйте функцию I9_600 везде где нужно обратиться к I9...600
  c = [i3]: If c = 0 Then c = 5
  I9_600(c).Select
  MsgBox "Range " & I9_600(c).Address(0, 0) & " selected"
End Sub
Изменено: Ігор Гончаренко - 24.10.2023 13:17:42
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Огромное спасибо за помощь!
Страницы: 1
Наверх