Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Логика ВПР в Макросе - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Логика ВПР в Макросе (Макросы/Sub)
Логика ВПР в Макросе
Re:Я Дата: Пятница, 03.06.2016, 10:44 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
на просторах интернета нашел макрос, который очень мне подходит. ВПР Макросом. Побывал подогнать его совсем под свои нужды. Например, искать параметры из другого столбца, в других массивах.
Пробу пера начал с текущего макроса, что бы понять этапы. На текущем примере добавил на "Sheet 2" новый столбец "ЕЩЕ", внес данные. И хотел переписать макрос, что бы еще и искал значение в этом столбце. Т.к. с макросами на ВЫ, соответственно ни чего не получилось.
Вы сможете мне помочь? Объяснить, на примере этого макроса логику поиска? Есть ли она вообще? Если брать формулу, все понятно, (что ищем; в какой таблице; в каком столбце;0)
Возможна примерна такая же привязка?
Заранее благодарю.
К сообщению приложен файл: _2_H.zip(30Kb)
 
Ответить
СообщениеДобрый день!
на просторах интернета нашел макрос, который очень мне подходит. ВПР Макросом. Побывал подогнать его совсем под свои нужды. Например, искать параметры из другого столбца, в других массивах.
Пробу пера начал с текущего макроса, что бы понять этапы. На текущем примере добавил на "Sheet 2" новый столбец "ЕЩЕ", внес данные. И хотел переписать макрос, что бы еще и искал значение в этом столбце. Т.к. с макросами на ВЫ, соответственно ни чего не получилось.
Вы сможете мне помочь? Объяснить, на примере этого макроса логику поиска? Есть ли она вообще? Если брать формулу, все понятно, (что ищем; в какой таблице; в каком столбце;0)
Возможна примерна такая же привязка?
Заранее благодарю.

Автор - Re:Я
Дата добавления - 03.06.2016 в 10:44
_Boroda_ Дата: Пятница, 03.06.2016, 10:58 | Сообщение № 2
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
У Вас все нормально, кроме того, что массив "с" состоит из 3-х столбцов
[vba]
Код
ReDim c(1 To UBound(a), 1 To 3)
[/vba]
а выгружаете обратно на лист Вы ДВА столбца
[vba]
Код
.[B3].Resize(UBound(c), 2) = c
[/vba]
Замените 2 на 3 и будет Вам счастье. Вот так
[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеУ Вас все нормально, кроме того, что массив "с" состоит из 3-х столбцов
[vba]
Код
ReDim c(1 To UBound(a), 1 To 3)
[/vba]
а выгружаете обратно на лист Вы ДВА столбца
[vba]
Код
.[B3].Resize(UBound(c), 2) = c
[/vba]
Замените 2 на 3 и будет Вам счастье. Вот так
[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba]

Автор - _Boroda_
Дата добавления - 03.06.2016 в 10:58
Re:Я Дата: Пятница, 03.06.2016, 11:17 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_
Благодарю Вас. Работает. Счастье есть....
Все перебирал, ставил d3. Вот этот блок очень плохо понял. С помощью переводчика все понятия переводил)))
Вы не могли бы мне разъезживать суть этого.
[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba] (извините, наверное нарушил правила вставки, но не знаю как правильно.)
Что такое [ ]? B3 -это куда вставлять наверное. Bound "Связанный наверное массив" почему с и почему = с
[moder]В Правилах есть синяя ссылка на объяснялку пользования тегами. Для макросов - кнопка #. Поправил на первый раз[/moder]


Сообщение отредактировал _Boroda_ - Пятница, 03.06.2016, 11:22
 
Ответить
Сообщение_Boroda_
Благодарю Вас. Работает. Счастье есть....
Все перебирал, ставил d3. Вот этот блок очень плохо понял. С помощью переводчика все понятия переводил)))
Вы не могли бы мне разъезживать суть этого.
[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba] (извините, наверное нарушил правила вставки, но не знаю как правильно.)
Что такое [ ]? B3 -это куда вставлять наверное. Bound "Связанный наверное массив" почему с и почему = с
[moder]В Правилах есть синяя ссылка на объяснялку пользования тегами. Для макросов - кнопка #. Поправил на первый раз[/moder]

Автор - Re:Я
Дата добавления - 03.06.2016 в 11:17
_Boroda_ Дата: Пятница, 03.06.2016, 11:30 | Сообщение № 4
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba]
1) .(точка) - подразумевает, что выше есть по крайней мере один With ххххх. ".Что-то" - это короткая запись "ххххх.Что-то"
2) .[B3] - равносильно хххх.Range("B3")
3) ааа.Resize(h,w) - растяжение от ааа на h вниз и на w вправо
4) [vba]
Код
UBound(c)
[/vba] - последний индекс массива с. Равен количеству элементов массива с
5) все вместе -
В листе, который в With, в ячейки, начиная с ячейки В3 на количество элементов массива "с" вниз и на 3 вправо вставить то, что у нас находится в массиве "с"


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение[vba]
Код
.[B3].Resize(UBound(c), 3) = c
[/vba]
1) .(точка) - подразумевает, что выше есть по крайней мере один With ххххх. ".Что-то" - это короткая запись "ххххх.Что-то"
2) .[B3] - равносильно хххх.Range("B3")
3) ааа.Resize(h,w) - растяжение от ааа на h вниз и на w вправо
4) [vba]
Код
UBound(c)
[/vba] - последний индекс массива с. Равен количеству элементов массива с
5) все вместе -
В листе, который в With, в ячейки, начиная с ячейки В3 на количество элементов массива "с" вниз и на 3 вправо вставить то, что у нас находится в массиве "с"

Автор - _Boroda_
Дата добавления - 03.06.2016 в 11:30
Re:Я Дата: Пятница, 03.06.2016, 11:50 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Чуть-чуть понял. Еще раз БлагоДарю. Буду ковыряться, разбираться, учится.
Данный вопрос решен.
 
Ответить
СообщениеЧуть-чуть понял. Еще раз БлагоДарю. Буду ковыряться, разбираться, учится.
Данный вопрос решен.

Автор - Re:Я
Дата добавления - 03.06.2016 в 11:50
Re:Я Дата: Среда, 15.06.2016, 10:56 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Начинаю данный макрос подстраивать под свои конкретные цели. Но не выходит. Выдает ошибку 424 и выделяет желтым цветом строку где я указываю столбец в котором мне надо искать значение. Ищу я данные которые у меня находяться в 38-м столюце.
Что не так делаю? Благодарю!

[vba]
Код

Sub Макрос2 ()
    Dim a, b, c, d, iLastrow As Long, i As Long, ii As Long


    With Sheet1    
        [color=#FFFF00]iLastrow = .Cells(Rows.Count, 38).End(xlUp).Row[/color]
        a = Range(.[al2], .Range("AL" & iLastrow)).Value
    End With

    With Sheet2    
        iLastrow = .Cells(Rows.Count, 2).End(xlUp).Row
        b = Range(.[b2], .Range("B" & iLastrow)).Value
    End With


    ReDim c(1 To UBound(a), 1 To 3)

    With CreateObject("Scripting.Dictionary")
    
       
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = i
        Next

    
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 2)
                c(i, 2) = b(.Item(a(i, 1)), 3)
                c(i, 3) = b(.Item(a(i, 1)), 4)
            End If
        Next
    End With

    With Sheet1    
        .[AO3].Resize(UBound(c), 3) = c
        .Activate
    End With
    
End Sub
[/vba]
 
Ответить
СообщениеДобрый день.
Начинаю данный макрос подстраивать под свои конкретные цели. Но не выходит. Выдает ошибку 424 и выделяет желтым цветом строку где я указываю столбец в котором мне надо искать значение. Ищу я данные которые у меня находяться в 38-м столюце.
Что не так делаю? Благодарю!

[vba]
Код

Sub Макрос2 ()
    Dim a, b, c, d, iLastrow As Long, i As Long, ii As Long


    With Sheet1    
        [color=#FFFF00]iLastrow = .Cells(Rows.Count, 38).End(xlUp).Row[/color]
        a = Range(.[al2], .Range("AL" & iLastrow)).Value
    End With

    With Sheet2    
        iLastrow = .Cells(Rows.Count, 2).End(xlUp).Row
        b = Range(.[b2], .Range("B" & iLastrow)).Value
    End With


    ReDim c(1 To UBound(a), 1 To 3)

    With CreateObject("Scripting.Dictionary")
    
       
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = i
        Next

    
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 2)
                c(i, 2) = b(.Item(a(i, 1)), 3)
                c(i, 3) = b(.Item(a(i, 1)), 4)
            End If
        Next
    End With

    With Sheet1    
        .[AO3].Resize(UBound(c), 3) = c
        .Activate
    End With
    
End Sub
[/vba]

Автор - Re:Я
Дата добавления - 15.06.2016 в 10:56
_Boroda_ Дата: Среда, 15.06.2016, 11:05 | Сообщение № 7
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Надо бы посмотреть файл.
У Вас существует лист с кодовым именем Sheet1?
Что будет, если написать
[vba]
Код
With Лист1
[/vba]
или
[vba]
Код
With Sheets("Sheet1")
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеНадо бы посмотреть файл.
У Вас существует лист с кодовым именем Sheet1?
Что будет, если написать
[vba]
Код
With Лист1
[/vba]
или
[vba]
Код
With Sheets("Sheet1")
[/vba]

Автор - _Boroda_
Дата добавления - 15.06.2016 в 11:05
Re:Я Дата: Среда, 15.06.2016, 11:09 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Да существует. Файл не могу прикрепить. Не соответствует Правилам. Поле архивирования весит 138, а а не 100
[moder]Ну так откусите от него кусок[/moder]


Сообщение отредактировал _Boroda_ - Среда, 15.06.2016, 11:11
 
Ответить
СообщениеДа существует. Файл не могу прикрепить. Не соответствует Правилам. Поле архивирования весит 138, а а не 100
[moder]Ну так откусите от него кусок[/moder]

Автор - Re:Я
Дата добавления - 15.06.2016 в 11:09
Re:Я Дата: Среда, 15.06.2016, 11:15 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Попробую. Воспользовался подсказкой. Лист1 заменил. Лист 2 заменил. Как рекомендовалось.
Теперь ругается на это:
[vba]
Код
For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 2)
                c(i, 2) = b(.Item(a(i, 1)), 3)
                c(i, 3) = b(.Item(a(i, 1)), 4)
[/vba]
на 3-ю строку. Тут наверное, значение из какого в какой столбец подставлять? Все же нужен пример?
 
Ответить
СообщениеПопробую. Воспользовался подсказкой. Лист1 заменил. Лист 2 заменил. Как рекомендовалось.
Теперь ругается на это:
[vba]
Код
For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 2)
                c(i, 2) = b(.Item(a(i, 1)), 3)
                c(i, 3) = b(.Item(a(i, 1)), 4)
[/vba]
на 3-ю строку. Тут наверное, значение из какого в какой столбец подставлять? Все же нужен пример?

Автор - Re:Я
Дата добавления - 15.06.2016 в 11:15
Re:Я Дата: Среда, 15.06.2016, 11:20 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Откусил. Поместился в размер. Прошу помочь разобраться.
К сообщению приложен файл: 9398632.rar(94Kb)
 
Ответить
СообщениеОткусил. Поместился в размер. Прошу помочь разобраться.

Автор - Re:Я
Дата добавления - 15.06.2016 в 11:20
_Boroda_ Дата: Среда, 15.06.2016, 11:39 | Сообщение № 11
Группа: Модераторы
Ранг: Экселист
Сообщений: 10334
Репутация: 4357 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Обманывать нехорошо. нет у Вас листа с кодовым именем Sheet1, у Вас Лист1

переписывайте все Вичи вот так
[vba]
Код
With Лист1
[/vba]
И массив в у Вас как-то не так. Вот так нужно
[vba]
Код
b = .[b2].Resize(iLastrow - 1, 4).Value
[/vba]
К сообщению приложен файл: __-1.xlsm(64Kb) · 1493379.gif(5Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеОбманывать нехорошо. нет у Вас листа с кодовым именем Sheet1, у Вас Лист1

переписывайте все Вичи вот так
[vba]
Код
With Лист1
[/vba]
И массив в у Вас как-то не так. Вот так нужно
[vba]
Код
b = .[b2].Resize(iLastrow - 1, 4).Value
[/vba]

Автор - _Boroda_
Дата добавления - 15.06.2016 в 11:39
Re:Я Дата: Среда, 15.06.2016, 12:07 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
УФ.... И в мыслях обмана не было, что Вы....
Ведь, как писал, все ищу в нете, стараюсь под себя сделать. Где логика не работает, начинаю все выспрашивать. Даже ни разу не имея стеснения. Учится и постигать новое, ни когда не стыдно. (имхо). Особенно такому как я "...кудесник, любимец ба’гов..." в данном вопросе )))
Благодарю. Доработал по остальным столбцам. Работает.... Пошел дальше ба’гить....))) уж очень понравилось выражение....
 
Ответить
СообщениеУФ.... И в мыслях обмана не было, что Вы....
Ведь, как писал, все ищу в нете, стараюсь под себя сделать. Где логика не работает, начинаю все выспрашивать. Даже ни разу не имея стеснения. Учится и постигать новое, ни когда не стыдно. (имхо). Особенно такому как я "...кудесник, любимец ба’гов..." в данном вопросе )))
Благодарю. Доработал по остальным столбцам. Работает.... Пошел дальше ба’гить....))) уж очень понравилось выражение....

Автор - Re:Я
Дата добавления - 15.06.2016 в 12:07
alex808 Дата: Вторник, 16.08.2016, 18:26 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
For i = 1 To UBound(a)
If .exists(a(i, 1)) Then
c(i, 1) = b(.Item(a(i, 1)), 2)
c(i, 2) = b(.Item(a(i, 1)), 3)
c(i, 3) = b(.Item(a(i, 1)), 4)

Спасибо большое Александру, за хороший пример, что выложил, но как быть если данные в таблице стоят левее аргумента?..У меня в базовой таблице аргумент стоит в 89-м столбце, а все данные там левее. По коду, предоставленным Александром, находит аргумент и даже подтягивает данные, но все что правее. И я так понимаю, что у меня ошибка кроется именно в этом фрагменте. Пробовал ставить Минус типа :c(i, 1) = b(.Item(a(i, 1)), -2), но ругается...Как быть? Подскажите пожалуйста
К сообщению приложен файл: 1--.xlsm(19Kb)


Сообщение отредактировал alex808 - Вторник, 16.08.2016, 20:47
 
Ответить
Сообщение
For i = 1 To UBound(a)
If .exists(a(i, 1)) Then
c(i, 1) = b(.Item(a(i, 1)), 2)
c(i, 2) = b(.Item(a(i, 1)), 3)
c(i, 3) = b(.Item(a(i, 1)), 4)

Спасибо большое Александру, за хороший пример, что выложил, но как быть если данные в таблице стоят левее аргумента?..У меня в базовой таблице аргумент стоит в 89-м столбце, а все данные там левее. По коду, предоставленным Александром, находит аргумент и даже подтягивает данные, но все что правее. И я так понимаю, что у меня ошибка кроется именно в этом фрагменте. Пробовал ставить Минус типа :c(i, 1) = b(.Item(a(i, 1)), -2), но ругается...Как быть? Подскажите пожалуйста

Автор - alex808
Дата добавления - 16.08.2016 в 18:26
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Логика ВПР в Макросе (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!