Function VPR(ByRef cell As Range, ByRef rng As Range, col& VPR = rng.Find(cell, , xlValues, 1).Offset(0, IIf(col + Abs(col), col - 1, 1 + col)) End Function.
[/vba]
Как я ее понимаю 1. Функция имеет 3 переменных: cell и rng типов range и col (какой тип данных у col и зачем стоит знак "&", что будет если его ("&") убрать. 2. rng - диапазон в котором производится поиск 3. Далее метод Find (cell - то что ищем, lookIn=xlValues (по значениям), а 1 это что? lookAt=xlWhole или matchCase= true. 4. В функции IIf должно сначала идти условие но там стоит col + Abs(col) - возвращает либо ноль либо удвоенное col. насколько я понимаю. Что это за условие? 5. Что такое col в этой функции? 6. Как мне сделать так чтобы она работала для моего случая. (вставила значения толщины на первый лист "MaterialsNorms" из листа "справочник" поиск по диаметру)
Встретил на форуме такую функцию-аналог ВПР.
[vba]
Код
Function VPR(ByRef cell As Range, ByRef rng As Range, col& VPR = rng.Find(cell, , xlValues, 1).Offset(0, IIf(col + Abs(col), col - 1, 1 + col)) End Function.
[/vba]
Как я ее понимаю 1. Функция имеет 3 переменных: cell и rng типов range и col (какой тип данных у col и зачем стоит знак "&", что будет если его ("&") убрать. 2. rng - диапазон в котором производится поиск 3. Далее метод Find (cell - то что ищем, lookIn=xlValues (по значениям), а 1 это что? lookAt=xlWhole или matchCase= true. 4. В функции IIf должно сначала идти условие но там стоит col + Abs(col) - возвращает либо ноль либо удвоенное col. насколько я понимаю. Что это за условие? 5. Что такое col в этой функции? 6. Как мне сделать так чтобы она работала для моего случая. (вставила значения толщины на первый лист "MaterialsNorms" из листа "справочник" поиск по диаметру)moland
moland, прочитайте правила форума и оформите код тегами (кнопка #) 1. Знак & определяет тип данных - Long 2. Да 3. lookAt=xlWhole 4. col + Abs(col) даст ноль для отрицательного col и НЕ ноль для положительного - ноль - это False, не ноль - True 5. как и в обычном ВПР - номер столбца, только может быть отрицательным 6.
Код
=ЕСЛИ(D10;VPR(D10;Справочник!$A$2:$B$12;2);"")
Только не ясно, чем обычный ВПР() не угодил?
moland, прочитайте правила форума и оформите код тегами (кнопка #) 1. Знак & определяет тип данных - Long 2. Да 3. lookAt=xlWhole 4. col + Abs(col) даст ноль для отрицательного col и НЕ ноль для положительного - ноль - это False, не ноль - True 5. как и в обычном ВПР - номер столбца, только может быть отрицательным 6.
Код
=ЕСЛИ(D10;VPR(D10;Справочник!$A$2:$B$12;2);"")
Только не ясно, чем обычный ВПР() не угодил?buchlotnik
Причина по которой я ищу замену функции ВПР. Это дальнейшая интеграция кода из эксель в аксесс. 1. Вышеприведенный код тоже использует встроенные функции в эксель? 2. И его нельзя будет добавить в аксесс, просто заменив объекты эксель (воркшитс, селлс и прочее)?
Причина по которой я ищу замену функции ВПР. Это дальнейшая интеграция кода из эксель в аксесс. 1. Вышеприведенный код тоже использует встроенные функции в эксель? 2. И его нельзя будет добавить в аксесс, просто заменив объекты эксель (воркшитс, селлс и прочее)?moland
moland, 1 - нет не использует (функции), но использует константы и метод VBA. В Access вроде .FindRecord 2 - а зачем? какова конечная цель? У СУБД есть встроенные средства, зачем там вообще ВПР()?
moland, 1 - нет не использует (функции), но использует константы и метод VBA. В Access вроде .FindRecord 2 - а зачем? какова конечная цель? У СУБД есть встроенные средства, зачем там вообще ВПР()?buchlotnik
Сообщение отредактировал buchlotnik - Пятница, 10.11.2017, 17:07
должно сначала идти условие но там стоит col + Abs(col)
эт просто настроение было игривое VBA любое числовое значение<>0 при преобразовании в логический тип данных интерпретирует как True, а 0 соответственно - False. Т.е. [vba]
Номер столбца в диапазоне, содержащий возвращаемое значение если номер столбца не отрицательный, можно пользовать встроенную функцию VLookup [vba]
Код
Sub макрос()
Dim sh_mat As Worksheet, sh_spravka As Worksheet Dim i As Long, lr As Long
'1. Отключение монитора, чтобы ускорить макрос. Application.ScreenUpdating = False
'2. Присваиваем имена листам, с которыми надо работать, чтобы по этим именам обращаться к листам. Set sh_mat = Worksheets("MaterialsNorms") Set sh_spravka = Worksheets("Справочник") '3. Удаление строк на листе "MaterialsNorms", у которых пусто в столбце 4. ' Поиск последней строки. Не должно быть скрытых строк, т.к. End не ищет в скрытых строках. lr = sh_mat.Cells(sh_mat.Rows.Count, 2).End(xlUp).row With sh_mat.Range("D10:D" & lr) ' Удаление. .SpecialCells(xlCellTypeBlanks).EntireRow.Delete '4. Заполнение столбца 6 на листе "MaterialsNorms". .Offset(0, 2).Value = Application.VLookup(.Value, sh_spravka.UsedRange.Columns("A:B"), 2, 0) End With
'5. Вкл. монитора. Application.ScreenUpdating = True
должно сначала идти условие но там стоит col + Abs(col)
эт просто настроение было игривое VBA любое числовое значение<>0 при преобразовании в логический тип данных интерпретирует как True, а 0 соответственно - False. Т.е. [vba]
Номер столбца в диапазоне, содержащий возвращаемое значение если номер столбца не отрицательный, можно пользовать встроенную функцию VLookup [vba]
Код
Sub макрос()
Dim sh_mat As Worksheet, sh_spravka As Worksheet Dim i As Long, lr As Long
'1. Отключение монитора, чтобы ускорить макрос. Application.ScreenUpdating = False
'2. Присваиваем имена листам, с которыми надо работать, чтобы по этим именам обращаться к листам. Set sh_mat = Worksheets("MaterialsNorms") Set sh_spravka = Worksheets("Справочник") '3. Удаление строк на листе "MaterialsNorms", у которых пусто в столбце 4. ' Поиск последней строки. Не должно быть скрытых строк, т.к. End не ищет в скрытых строках. lr = sh_mat.Cells(sh_mat.Rows.Count, 2).End(xlUp).row With sh_mat.Range("D10:D" & lr) ' Удаление. .SpecialCells(xlCellTypeBlanks).EntireRow.Delete '4. Заполнение столбца 6 на листе "MaterialsNorms". .Offset(0, 2).Value = Application.VLookup(.Value, sh_spravka.UsedRange.Columns("A:B"), 2, 0) End With
'5. Вкл. монитора. Application.ScreenUpdating = True