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

Вход

Регистрация

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

 

= Мир MS Excel/Получение значений из диапазона цифр - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Получение значений из диапазона цифр (Макросы/Sub)
Получение значений из диапазона цифр
AVI Дата: Четверг, 02.08.2018, 04:59 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
Добрый день!
Который день думаю, но даже не понимаю с чего начать ни формулами, ни, уж, тем более, макросами.
Задача такая: в таблицу1 добавляются диапазоны номеров. Они всегда цифровые. Конечный всегда больше начального. Диапазоны никогда не пересекаются.
В столбец F должны попадать как раз номера из этих диапазонов, как показано в столбце I
Так как эти диапазоны будут все добавляться, поэтому лучше, что бы это было реализовано с помощью макросов.
И еще просьба, если можно, то прокомментируйте, пожалуйста, коды.
К сообщению приложен файл: 5171463.xlsx(9.1 Kb)


Сообщение отредактировал AVI - Четверг, 02.08.2018, 06:13
 
Ответить
СообщениеДобрый день!
Который день думаю, но даже не понимаю с чего начать ни формулами, ни, уж, тем более, макросами.
Задача такая: в таблицу1 добавляются диапазоны номеров. Они всегда цифровые. Конечный всегда больше начального. Диапазоны никогда не пересекаются.
В столбец F должны попадать как раз номера из этих диапазонов, как показано в столбце I
Так как эти диапазоны будут все добавляться, поэтому лучше, что бы это было реализовано с помощью макросов.
И еще просьба, если можно, то прокомментируйте, пожалуйста, коды.

Автор - AVI
Дата добавления - 02.08.2018 в 04:59
nilem Дата: Четверг, 02.08.2018, 05:47 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1482
Репутация: 520 ±
Замечаний: 0% ±

Excel 2013
похоже, файл не тот прикрепили


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениепохоже, файл не тот прикрепили

Автор - nilem
Дата добавления - 02.08.2018 в 05:47
AVI Дата: Четверг, 02.08.2018, 06:13 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
nilem, Упс, точно. Исправил. Спасибо!
 
Ответить
Сообщениеnilem, Упс, точно. Исправил. Спасибо!

Автор - AVI
Дата добавления - 02.08.2018 в 06:13
Manyasha Дата: Четверг, 02.08.2018, 10:20 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2197
Репутация: 893 ±
Замечаний: 0% ±

Excel 2010, 2016
AVI, здравствуйте, например, так можно:
[vba]
Код
Sub test()
    Dim data, i&, j&, r&
    'Берем все значения таблицы в массив
    data = Range("Таблица1").Value
    'Очищаем старые значения в столбце I
    [i1].CurrentRegion.Offset(1).ClearContents
    r = 2
    'Цикл по строкам массива
    For i = 1 To UBound(data)
        'цикл от 1-го значения строки до 2-го
        For v = data(i, 1) To data(i, 2)
            'записываем в столбец I
            Cells(r, "i") = v
            r = r + 1
        Next v
    Next i
End Sub
[/vba]
К сообщению приложен файл: 5171463-1.xlsm(15.6 Kb)


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804


Сообщение отредактировал Manyasha - Четверг, 02.08.2018, 10:23
 
Ответить
СообщениеAVI, здравствуйте, например, так можно:
[vba]
Код
Sub test()
    Dim data, i&, j&, r&
    'Берем все значения таблицы в массив
    data = Range("Таблица1").Value
    'Очищаем старые значения в столбце I
    [i1].CurrentRegion.Offset(1).ClearContents
    r = 2
    'Цикл по строкам массива
    For i = 1 To UBound(data)
        'цикл от 1-го значения строки до 2-го
        For v = data(i, 1) To data(i, 2)
            'записываем в столбец I
            Cells(r, "i") = v
            r = r + 1
        Next v
    Next i
End Sub
[/vba]

Автор - Manyasha
Дата добавления - 02.08.2018 в 10:20
AVI Дата: Пятница, 03.08.2018, 08:02 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
Manyasha, Большое спасибо! Особенно за комментарии!

Правда я в них особо ничего не понял, к сожалению

Тут же встал вопрос: а почему если я делаю то же самое, но с еще одной табличкой параллельно, то работы первого макроса исчезает?

Очистка затрагивает прилегающие столбцы. Я не знаю как это убрать...
К сообщению приложен файл: 6798950.xlsm(16.2 Kb)


Сообщение отредактировал AVI - Пятница, 03.08.2018, 08:22
 
Ответить
СообщениеManyasha, Большое спасибо! Особенно за комментарии!

Правда я в них особо ничего не понял, к сожалению

Тут же встал вопрос: а почему если я делаю то же самое, но с еще одной табличкой параллельно, то работы первого макроса исчезает?

Очистка затрагивает прилегающие столбцы. Я не знаю как это убрать...

Автор - AVI
Дата добавления - 03.08.2018 в 08:02
Roman777 Дата: Пятница, 03.08.2018, 10:01 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 917
Репутация: 117 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
AVI, Видимо .CurrentRegion имеет другой смысл, чем планировалось в него вложить.

Проверьте разницу в выделении строк:
[vba]
Код
[j1].Offset(1).Resize([j1].CurrentRegion.Rows.Count - 1).Select
    [j1].CurrentRegion.Offset(1).Select
[/vba]


Много чего не знаю!!!!
 
Ответить
СообщениеAVI, Видимо .CurrentRegion имеет другой смысл, чем планировалось в него вложить.

Проверьте разницу в выделении строк:
[vba]
Код
[j1].Offset(1).Resize([j1].CurrentRegion.Rows.Count - 1).Select
    [j1].CurrentRegion.Offset(1).Select
[/vba]

Автор - Roman777
Дата добавления - 03.08.2018 в 10:01
amfor Дата: Пятница, 03.08.2018, 10:21 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 50 ±
Замечаний: 0% ±

Excel 2016
Добрый день. Посмотрите.
[vba]
Код
test()
    Dim data, i&, j&, r&, LastRow As Long
    Application.ScreenUpdating = False
    data = Range("Таблица1").Value
    LastRow = Cells(Rows.Count, 10).End(xlUp).Row
    Range(Cells(2, 10), Cells(LastRow + 1, 10)).ClearContents
    r = 2
    For i = 1 To UBound(data)
        For v = data(i, 1) To data(i, 2)
            Cells(r, "j") = v
            r = r + 1
        Next v
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: 6798950-1-.xlsm(18.4 Kb)


Семь бед - один RESET.

Сообщение отредактировал amfor - Пятница, 03.08.2018, 10:23
 
Ответить
СообщениеДобрый день. Посмотрите.
[vba]
Код
test()
    Dim data, i&, j&, r&, LastRow As Long
    Application.ScreenUpdating = False
    data = Range("Таблица1").Value
    LastRow = Cells(Rows.Count, 10).End(xlUp).Row
    Range(Cells(2, 10), Cells(LastRow + 1, 10)).ClearContents
    r = 2
    For i = 1 To UBound(data)
        For v = data(i, 1) To data(i, 2)
            Cells(r, "j") = v
            r = r + 1
        Next v
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - amfor
Дата добавления - 03.08.2018 в 10:21
Manyasha Дата: Пятница, 03.08.2018, 10:24 | Сообщение № 8
Группа: Модераторы
Ранг: Старожил
Сообщений: 2197
Репутация: 893 ±
Замечаний: 0% ±

Excel 2010, 2016
AVI, писала под пример, в нем не было ничего в соседних столбцах.
Замените строчку с currentRegion на
[vba]
Код
    lr = Cells(Rows.Count, "j").End(xlUp).Row
    If lr > 1 Then [j2].Resize(lr - 1).ClearContents
[/vba]

currentRegion -возвращает диапазон, ограниченный пустыми строками и колонками. Чтобы понять, встаньте на ячейку J1 и нажмите ctrl+A
К сообщению приложен файл: 6798950-1.xlsm(17.0 Kb)


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеAVI, писала под пример, в нем не было ничего в соседних столбцах.
Замените строчку с currentRegion на
[vba]
Код
    lr = Cells(Rows.Count, "j").End(xlUp).Row
    If lr > 1 Then [j2].Resize(lr - 1).ClearContents
[/vba]

currentRegion -возвращает диапазон, ограниченный пустыми строками и колонками. Чтобы понять, встаньте на ячейку J1 и нажмите ctrl+A

Автор - Manyasha
Дата добавления - 03.08.2018 в 10:24
AVI Дата: Суббота, 04.08.2018, 05:33 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
amfor,
Я попытался адаптировать ваш код под свою рабочую форму

[vba]
Код
Sub nalichie()
    Dim data, i&, j&, r&, LastRow As Long
    Application.ScreenUpdating = False
    data = Worksheets("Медикаменты").Range("БланкиРецСклад_tb").Value
    LastRow = Cells(Rows.Count, 10).End(xlUp).Row
    Range(Cells(2, "CK"), Cells(LastRow + 1, "CK")).ClearContents
    r = 2
    For i = 1 To UBound(data)
        For v = data(i, 1) To data(i, 2)
            Worksheets("Медикаменты").Cells(r, "CK") = v
            r = r + 1
        Next v
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]

Но у меня вылезла ошибка variable not defined на букву V в строке [vba]
Код
For v = data(i, 1) To data(i, 2)
[/vba].
Я не понимаю: в вашем файле изменения сработало, а когда я перенес к себе, то он не определили переменную...

В изначальном примере этого не было. Код правильно работает только если в таблице два столбца, А как коду указать конкретные столбцы, если придется таблицу расширять?


Сообщение отредактировал AVI - Суббота, 04.08.2018, 16:29
 
Ответить
Сообщениеamfor,
Я попытался адаптировать ваш код под свою рабочую форму

[vba]
Код
Sub nalichie()
    Dim data, i&, j&, r&, LastRow As Long
    Application.ScreenUpdating = False
    data = Worksheets("Медикаменты").Range("БланкиРецСклад_tb").Value
    LastRow = Cells(Rows.Count, 10).End(xlUp).Row
    Range(Cells(2, "CK"), Cells(LastRow + 1, "CK")).ClearContents
    r = 2
    For i = 1 To UBound(data)
        For v = data(i, 1) To data(i, 2)
            Worksheets("Медикаменты").Cells(r, "CK") = v
            r = r + 1
        Next v
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]

Но у меня вылезла ошибка variable not defined на букву V в строке [vba]
Код
For v = data(i, 1) To data(i, 2)
[/vba].
Я не понимаю: в вашем файле изменения сработало, а когда я перенес к себе, то он не определили переменную...

В изначальном примере этого не было. Код правильно работает только если в таблице два столбца, А как коду указать конкретные столбцы, если придется таблицу расширять?

Автор - AVI
Дата добавления - 04.08.2018 в 05:33
Hugo Дата: Суббота, 04.08.2018, 14:41 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2862
Репутация: 641 ±
Замечаний: 0% ±

[vba]
Код
data = Range("Таблица2").Columns(2).Resize(, 2).Value
[/vba]


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Суббота, 04.08.2018, 14:41
 
Ответить
Сообщение[vba]
Код
data = Range("Таблица2").Columns(2).Resize(, 2).Value
[/vba]

Автор - Hugo
Дата добавления - 04.08.2018 в 14:41
AVI Дата: Суббота, 04.08.2018, 18:06 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
Hugo, А что это значит? Я не понял.
 
Ответить
СообщениеHugo, А что это значит? Я не понял.

Автор - AVI
Дата добавления - 04.08.2018 в 18:06
Pelena Дата: Суббота, 04.08.2018, 18:45 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 13312
Репутация: 2932 ±
Замечаний: ±

Excel 2010, 2016 & Mac Excel
в вашем файле изменения сработало, а когда я перенес к себе, то он не определили переменную

видимо, в Вашем файле задан Option Explicit, поэтому требуется объявление всех переменных

как коду указать конкретные столбцы, если придется таблицу расширять?

если массив data захватывает всю таблицу, то в цикле For i=... вторым аргументом у data указывайте номера нужных столбцов в таблице


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщение
в вашем файле изменения сработало, а когда я перенес к себе, то он не определили переменную

видимо, в Вашем файле задан Option Explicit, поэтому требуется объявление всех переменных

как коду указать конкретные столбцы, если придется таблицу расширять?

если массив data захватывает всю таблицу, то в цикле For i=... вторым аргументом у data указывайте номера нужных столбцов в таблице

Автор - Pelena
Дата добавления - 04.08.2018 в 18:45
Hugo Дата: Суббота, 04.08.2018, 19:17 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2862
Репутация: 641 ±
Замечаний: 0% ±

что это значит? Я не понял.

прочитайте последнюю строку своего поста, который перед моим ответом на эту строку :)
И это относилось к коду из файла. Который вероятно Вы уже потёрли, ну или я не помню к какому...


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Суббота, 04.08.2018, 19:19
 
Ответить
Сообщение
что это значит? Я не понял.

прочитайте последнюю строку своего поста, который перед моим ответом на эту строку :)
И это относилось к коду из файла. Который вероятно Вы уже потёрли, ну или я не помню к какому...

Автор - Hugo
Дата добавления - 04.08.2018 в 19:17
AVI Дата: Суббота, 04.08.2018, 22:01 | Сообщение № 14
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
видимо, в Вашем файле задан Option Explicit, поэтому требуется объявление всех переменных

Спасибо за подсказку - заработало!

если массив data захватывает всю таблицу, то в цикле For i=... вторым аргументом у data указывайте номера нужных столбцов в таблице

как тут?
data = Range("Таблица2").Columns(2).Resize(, 2).Value


И это относилось к коду из файла. Который вероятно Вы уже потёрли, ну или я не помню к какому...


Я имел ввиду как это работает)) Просто я посмотрел справку по Columns.Resize и не понял как это работает....
 
Ответить
Сообщение
видимо, в Вашем файле задан Option Explicit, поэтому требуется объявление всех переменных

Спасибо за подсказку - заработало!

если массив data захватывает всю таблицу, то в цикле For i=... вторым аргументом у data указывайте номера нужных столбцов в таблице

как тут?
data = Range("Таблица2").Columns(2).Resize(, 2).Value


И это относилось к коду из файла. Который вероятно Вы уже потёрли, ну или я не помню к какому...


Я имел ввиду как это работает)) Просто я посмотрел справку по Columns.Resize и не понял как это работает....

Автор - AVI
Дата добавления - 04.08.2018 в 22:01
Hugo Дата: Суббота, 04.08.2018, 22:04 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2862
Репутация: 641 ±
Замечаний: 0% ±

Работает так - берёт второй столбец указанного диапазона, его "расширяет/переразмечает" на указанное число в любую сторону по принципу (вниз, вправо).
А подсказака Елены относится к другому - в массив берём всё, а при обращении к нему выбираем только нужное. Но зачем брать в массив лишнее?


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Суббота, 04.08.2018, 22:06
 
Ответить
СообщениеРаботает так - берёт второй столбец указанного диапазона, его "расширяет/переразмечает" на указанное число в любую сторону по принципу (вниз, вправо).
А подсказака Елены относится к другому - в массив берём всё, а при обращении к нему выбираем только нужное. Но зачем брать в массив лишнее?

Автор - Hugo
Дата добавления - 04.08.2018 в 22:04
AVI Дата: Воскресенье, 05.08.2018, 04:37 | Сообщение № 16
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 7 ±
Замечаний: 0% ±

Excel 2016
Hugo, спасибо за пояснение. Разобрался
 
Ответить
СообщениеHugo, спасибо за пояснение. Разобрался

Автор - AVI
Дата добавления - 05.08.2018 в 04:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Получение значений из диапазона цифр (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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