Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/142: Рейтинг темы: голосов - 142, средняя оценка - 4.58
4 / 4 / 0
Регистрация: 12.06.2010
Сообщений: 18

Работа процедуры с ячейками таблицы

13.06.2010, 17:48. Показов 27419. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята помогите выполнить задачу!
Откройте новую рабочую книгу. Введите следующие значения в первый лист рабо¬чей книги.
Ячейки Значения
————————————————————
А1 Товар
А2:А6 Названия каких-либо товаров
B1 Цена
B2 15
B4 3
B5 7
B6 9

Создайте процедуру с именем СнижениеЦен. Процедура должна уменьшить значения всех ячеек из диапазона В2:В6 на 5. Если цена будет меньше или равна нулю, вы¬делите ее и название товара красным полужирным шрифтом. Также в этом случае (цена меньше или равна нулю) процедура должна вывести окно сообщения с соответ¬ствующим текстом предупреждения. Выполните процедуру.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2010, 17:48
Ответы с готовыми решениями:

Работа с ячейками таблицы Word
нужно из документа Excel скопировать текст в ячейки таблицы WORD Как вставить текст в ворд подскажите пожалуйста?? клетку выделяет, но...

Граница между ячейками таблицы
Помогите, как сделать чтобы разделение между ячейками таблицы было не белым а черным, одной линией

Расстояние между ячейками таблицы.
Есть таблица. Вот самый простой пример: <table> <tr> <td></td> <td></td> <td></td> ...

9
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.06.2010, 18:11
serb,
а к какой это теме по VBA относится (что вы изучали). И почему нет в задании B3?
0
4 / 4 / 0
Регистрация: 12.06.2010
Сообщений: 18
13.06.2010, 22:27  [ТС]
Объект Range
Объект Range (Диапазон), наиболее часто используемый в процедурах VBA объект Excel.
Цель: Изучить различные методы работы с диапозонами.
Задачи:
1. Рассмотреть роль объекта Range в VBA
2. Освоить использование оператора With
3. Освоить использование оператора For Each
4. Выполнить анализ процедур, использующих оператор Range

Описание объекта Range
Поскольку вы создаете приложение для Excel, то естественно ваше внимание к ячейкам рабочего листа. В VBA ячейки трактуются как объект Range
В качестве объекта Range могут выступать:
 отдельная ячейка;
 выделенный диапазон ячеек;
 несколько выделенных диапазонов ячеек (т.е. совокупность несмежных диапазонов);
 строка и столбец;
 трехмерный диапазон (т.е. состоящий из диапазонов, расположенных на разных рабочих листах).

Свойства объекта Range
Изучение любого объекта — это, прежде всего изучение его свойств и методов. Среди всех свойств объекта Range выделим следующие.
 Address (Адрес) — возвращает текущее положение диапазона.
 Count (Счет) — возвращает количество ячеек в диапазоне.
 Formula (Формула) - возвращает формулу, по которой вычисляется значение, отображаемое в ячейке.
 Offset (Смещение) — возвращает величину смещения одного диапазона относительно другого.
 Resize (Изменение размеров) — позволяет изменять текущее выделение диа¬пазона.
 Value (Значение) — возвращает значения ячеек, составляющих диапазон.

Чтобы поэкспериментировать со свойствами объекта Range, создадим процедуру
Сначала закройте все открытые рабочие книги, а затем откройте новую рабочую книгу. Будем считать, что текущий рабочий лист у вас Лист1.
1. Введите число 100 в ячейку В1, число 200 — в ячейку В2 и 300 — в ячейку ВЗ.
2. В ячейку В4 введите формулу =СУММ (В1: ВЗ).
3. Нажмите комбинацию клавиш <Alt+Fll>, чтобы открыть редактор Visual Basic, и вставьте модуль в текущую рабочую книгу.
4. Создайте новую процедуру и назовите ее СвойстваДиапазона.
5. Введите код процедуры
Visual Basic
1
2
3
4
5
ThisWorkbook.Worksheets("Лист1").Range("A1").Activate 
ActiveCell.Offset(2,2).Activate 
MsgBox "Текущая ячейка - " & ActiveCell.Address
MsgBox "Значение ячейки В4 = " & Range("В4").Value
MsgBox "Формула в ячейке В4: " & Range("В4").Formula
6. Перейдите на Лист1 рабочей книги и выполните процедуру СвойстваДиа¬пазона. Появится первое окно с сообщением, что текущей ячейкой является ячейка СЗ.
7. Щелкните на кнопке ОК. Следующее окно сообщения покажет значение, отображаемое в ячейке В4.
8. Щелкните на кнопке ОК. Последнее окно покажет формулу, содержащуюся в ячейке В4. (Обратите внимание, что хотя формула в ячейке В4 введена русскими буквами, процедура корректно ее обработала и преобразовала в формулу англоязычной версии Excel)
9. Щелкните на кнопке ОК для закрытия окна сообщения.
Рассмотрим эту процедуру подробнее.
Процедура начинается с активизации ячейки A1 (т.е. установки на ней табличного курсора):
Visual Basic
1
ThisWorkbook.Worksheets("Лист1").Range("Al").Activate
После активизации ячейки Al свойство Offset перемещает табличный курсор на ячейку СЗ, процедура показывает адрес новой активной ячейки в окне сообщения:
Visual Basic
1
2
ActiveCell.Offset(2,2).Activate
MsgBox "Текущая ячейка - " & ActiveCell.Address
Свойство Offset позволяет перемещаться от одного диапазона к другому и имеет следующий синтаксис:
имя_диапазона..Offset(смещ_строк, смещ_ столбцов)
Аргументы смещ_строк и смещ_столбцов задают направление перемещения табличного курсора. В нашей процедуре оба аргумента принимают значение 2, что позволяет перейти из ячейки А1 в ячейку С3.
Последние два оператора процедуры с помощью окон сообщения отображают зна¬чение и формулу ячейки В4:
Visual Basic
1
2
МsgВох "Значение ячейки В4 = " & Range("В4").Value
MsgBox "Формула в ячейке В4: " & Range("В4").Formula
Эти операторы показывают различие между свойствами Value и Formula. Свойст во Value возвращает то, что отображается в ячейке, а свойство Formula — то, что на¬ходится в ячейке.
Методы объекта Range
Объект Range имеет много методов, среди которых следующие.
 Activate (Активизировать) — активизирует (выделяет) диапазон.
 Clear (Очистить) — очищает содержимое диапазона.
 Copy (Копировать) — копирует содержимое диапазона в буфер обмена.
 Cut (Вырезать) — перемещает содержимое диапазона в буфер обмена.
 PasteSpecial (Специальная вставка) — вставляет содержимое буфера обмена в диапазон, используя при этом различные аргументы.
 Select (Выделить) — выделяет диапазон.
Использование оператора With
Изучим несколько конст¬рукций языка VBA, значительно облегчающих работу с объектами. Одна из задач, которую часто придется решать с помощью VBA, - задание различных параметров форматирова¬ния объекта. В листинге 10.1 показан пример форматирования диапазона ячеек.
Листинг 10.1. Пример форматирования диапазона
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Range("Al:A6").NumberFormat = "#,##0.00"
Range("Al :A6").Font.Name = "Courier New"
Range("Al: A6").Font.FontStyle = "Regular"
Range("Al :A6").Font.Size = 11
Range("Al :A6").Font.Strikethrough = False
Range("Al :A6").Font.Superscript = False
Range("Al :A6").Font.Subscript = False
Range("Al :A6").Font.OutlineFont = False
Range("Al :A6").Font.Shadow = False
Range("Al :A6").Font.Underline = xlUnderlineStyleNone
Range("Al :A6").Font.Colorlndex = xlAutomatic
Чтобы ввести код этого листинга, вам надо снова и снова набирать Range ("А1:А6"). Конечно, можно использовать переменную-объект для ссылки на объект Range ("А1:А6"), но в этом случае вам столько же раз придется вводить имя переменной. Из подобных ситуаций VBA предлагает другой выход — оператор With, который применяется тогда, когда необходимо задать много свойств или выполнить большое количество методов одного объекта. Листинг 10.2 показывает тот же код лис-тинга 10.2, но с использованием оператора with.
Листинг 10.2. Пример использования оператора With
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
With Range ("А1:А6)
.NumberFormat = "#,##0.00"
With.Font
.Name = "Courier New"
.FontStyle = "Regular"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.Font.Colorlndex = xlAutomatic
End With
End With
Оператор With имеет следующий синтаксис:
With объект
[опера торы]
End With
Объект — это тот объект, чьи свойства и методы указаны в секции операторы. Каждая строка в этой секции начинается с точки, как показано в листинге 10.2. Операторы With можно вкладывать друг в друга. В нашем листинге оператор With объекта Font вложен в оператор With объекта Range. В листинге 10.3 приведен другой пример использования оператора With.
Листинг 10.3. Оператор With, содержащий оператор и метод
Visual Basic
1
2
3
4
5
6
Sub WithWorksheet()
With ThisWorkbook
. SaveAs "IIpимepWith"
MsgBox "Статус сохранения: " & .Saved
End With
End Sub
Оператор For Each
Если оператор With используется для выполнения нескольких операторов для од¬ного объекта, то оператор For Each применяется для выполнения одного и того же набора операторов для нескольких объектов. Этот оператор дает возможность повто¬рить набор операторов для всех элементов коллекции.
Оператор For Each можно применять к массивам Оператор For Each имеет следующий синтаксис:
For Each элемент In группа
[Опера торы]
[Exit For]
[Опера торы]
Next
Отметим, что синтаксис предусматривает выражение Exit For. Так же, как и в других подобных выражениях Exit, для организации досрочного выхода из оператора For Each обычно применяется оператор If.
В листинге 10.4 оператор For Each применяется для изменения значений всех ячеек диапазона.
Листинг 10.4. Пример использования оператора For Each____
Visual Basic
1
2
3
4
5
6
 Sub ПримерFог_Еасh()
       Dim x As Range
       For Each x In ThisWorkbook..Worksheets("Лист1").Range("A1:A6")
       x.Value = x.Value + 10
       Next
 End Sub
Использование объекта Range
В первом примере выполняется форматирование определенных строк диапазона. По¬добная операция часто применяется перед выводом на печать различных списков. Предпо¬ложим, что первая строка вашего рабочего листа содержит заголовки столбцов. Необходимо сделать полужирным шрифт в каждой второй строке. Процедура, выполняющая эту задачу, представлена в листинге 10.5.
Листинг 10.5. Применение объекта Row и оператора цикла
Visual Basic
1
2
3
4
5
6
7
Sub Полужирный()
Dim iCounter As Integer
For  iCounter = 3 To ThisWorkbook.Worksheets("Лист1").Range("A1:C25").Rows.Count Step 2 
ThisWorkbook.Worksheets("Лист1"). 
Range("A1:C25").Font.Bold = True
Next 
End Sub
Основным в этой процедуре является оператор цикла For... Next. Отметим, что переменная-счетчик этого цикла iCounter имеет начальное значение 3, а затем уве¬личивается с шагом 2, обеспечивая тем самым выделение полужирным начертанием каждой второй строки.
Очевиден недостаток приведенной выше процедуры: здесь заранее указывается размер диапазона. На практике размер диапазона может часто изменяться, например в результате импорта данных из какой-либо базы данных или в результате внесения новых либо удаления старых данных. Другими словами, в процедуре не должен быть указан конкретный размер диапазона. Код листинга 10.6 выполняет выбор диапазона без указания его размера и местоположения.

Листинг 10.6. Выделение диапазона
Visual Basic
1
2
3
4
5
Sub ВыделениеДиапазона()
ThisWorkbook.Worksheets("Лист1").Range("A1").Activate
ActiveCell.CurrentRegion.Select
MsgBox "Выделен диапазон " & Selection.Address
End Sub
Ключевой элемент в этой процедуре - свойство CurrentRegion (Текущая об¬ласть). Это свойство возвращает диапазон ячеек, содержащий активную ячейку и ог¬раниченный пустыми строками и пустыми столбцами. При выделении диапазона с помощью свойства CurrentRegion нет необходимости заранее знать размер и место¬положение выделяемого диапазона.
Пример следующей процедуры показывает выполнение операции "копировать и вставить". Код листинга 10.7 копирует любой заранее выделенный объект в буфер обмена, а затем вставляет его в новое положение на рабочем листе.
Листинг 10.7. Копирование и вставка диапазонов
Visual Basic
1
2
3
4
5
6
Sub Копировать_Вставить()
    Selection.Copy
    Range("F3").Select
   ActiveSheet.Paste
   Application.CutCopyMode = False
End Sub
Оператор Selection. Copy помещает выделенный диапазон в буфер обмена. Сле¬дующий оператор перемещает табличный курсор в ту ячейку, начиная с которой будет вставлен скопированный диапазон. Вставка диапазона из буфера обмена осуществля¬ется оператором ActiveSheet. Paste. Последний оператор устанавливает значение свойства CutCopyMode (Режим вырезать-вставить) объекта Application как False (Ложь). Если не выполнить этот оператор, то вокруг исходного диапазона (того, что копировался) сохранится пунктирная рамка выделения, а в строке состояния будет по-прежнему отображаться инструкция по копированию диапазона.
2
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.06.2010, 22:29
Цитата Сообщение от Busine2009 Посмотреть сообщение
И почему нет в задании B3?
И ещё вот это.
0
4 / 4 / 0
Регистрация: 12.06.2010
Сообщений: 18
13.06.2010, 22:45  [ТС]
А1 Товар
А2:А6 Названия каких-либо товаров
B1 Цена
B2 15
B3 5
B4 3
B5 7
B6 9
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
14.06.2010, 19:09
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

serb,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub СнижениеЦен()
Dim oCell As Range
For Each oCell In ThisWorkbook.Worksheets("Лист1").Range("B2:B6")
    oCell.Value = oCell.Value - 5
    If oCell.Value <= 0 Then
        oCell.Select
        With oCell.Font
            .Bold = True
            .Color = vbRed
        End With
        oCell.Offset(0, -1).Activate
        With ActiveCell.Font
            .Bold = True
            .Color = vbRed
        End With
        MsgBox "Для товара " & Chr(34) & ActiveCell.Value & Chr(34) & " (Ячейка " & ActiveCell.Address & ")" & " цена меньше или равна нулю!"
    End If
Next
End Sub
1
1 / 1 / 0
Регистрация: 14.06.2011
Сообщений: 71
05.07.2011, 06:55
как поместить таблицу excel внутри процедуры или функции
и использовать ее для решения(задачи)
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 2
25.04.2016, 17:22
Возможно ли в VBA обращение к заголовку именованного диапазона?
Задача следующая:
Нужно найти номер столбца заголовка по его имени("количество")


В ячейке это выглядит так: =ПОИСКПОЗ("Количество";Фрукты[#Заголовки];0) это работает
но в VBA не может распознать диапазон Range("Фрукты[#Заголовки]")

Код VBA:
Sub Кнопка1_Щелчок()
Имя_диапазона = "Фрукты"
Искомое = "Яблоко"
Set r = Range(Имя_диапазона + "[#Заголовки]") 'как задать диапазон из заголовка в таблице Фрукты?' здесь ошибка
номер_заголовка = WorksheetFunction.Match("Количество", "Экспедиторы[#Заголовки]", 0)
значение = WorksheetFunction.VLookup(Искомое, Range(Имя_диапазона), номер_заголовка, False)
Set r = Nothing
End Sub
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
25.04.2016, 21:40
Цитата Сообщение от jinix Посмотреть сообщение
но в VBA не может распознать диапазон Range("Фрукты[#Заголовки]")
Если заголовок(шапка) это одна строка, то можно и так :

Visual Basic
1
Set r = Range("Фрукты").Rows(0)
Если количество строк неизвестно, то :

Visual Basic
1
Set r = Range("Фрукты[#Headers]")
Или

Visual Basic
1
Set r = ActiveSheet.ListObjects("Фрукты").HeaderRowRange
1
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 2
26.04.2016, 08:44
Цитата Сообщение от pashulka Посмотреть сообщение
Если заголовок(шапка) это одна строка, то можно и так :

Visual Basic
1
Set r = Range("Фрукты").Rows(0)
Если количество строк неизвестно, то :

Visual Basic
1
Set r = Range("Фрукты[#Headers]")
Или

Visual Basic
1
Set r = ActiveSheet.ListObjects("Фрукты").HeaderRowRange
Ход мыслей у меня был правильный. Ошибка была в том что VBA воспринимает заголовки на английском языке, а в экселе они прописаны на русском.
Range("Фрукты[#Headers]")= Range("Фрукты[#Заголовки]")

Огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2016, 08:44
Помогаю со студенческими работами здесь

Вычислительные операции с ячейками таблицы
Суть проблемы: соединил БД Access и Delphi и выяснилось что на Access 2007 нельзя делать вычисляемые поля в таблицах. Переделывать уже не...

Сортировка таблицы с объединенными ячейками
Есть таблица в которой обеднены ячейки, хочу сделать кнопку которая будет сортировать по № позиции эту таблицу. Но такую таблицу не могу...

Цвет между ячейками таблицы
Как окрасить расстояние между ячейками? У меня получается вот так:

про Tаble1 - работаем с ячейками таблицы
Есть таблица Table1 состоящая из 8 столбцов с 40 заполненными записями. нажимаем на кнопку 'проверить'. Начинается проверка на...

Данные из таблицы с объединенными ячейками в Массив
Добрый день! Товарищи, прошу помощи: Есть таблица в Excel, я копирую данную область (только видимые ячейки) и засовываю их в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru