Сделай Сам Свою Работу на 5

Примеры обработки данных в ячейках рабочего листа MS Excel





Пример 5.3– Некоторый прямоугольный диапазон ячеек на рабочем листе Excel заполнен числами. Требуется вычислить средние значения каждой строки этого диапазона ячеек и вывести их справа от диапазона. Если, например, числами заполнен диапазон B1:E5, то требуется сначала вычислить среднее значение ячеек B1:E1 и вывести его в ячейку F1, затем вычислить среднее значение ячеек B2:E2 и вывести его в ячейку F2, и т.д.

Рассмотрим несколько случаев решения этой задачи в зависимости от того, как задан диапазон ячеек, для которого вычисляются средние значения строк.

a) Вычисления выполняются для диапазона ячеек B1:E5.

Sub primer5_3a_1()

Set d = Range("B1:E5")

m = d.Rows.Count

n = d.Columns.Count

For i = 1 To m

sum = 0

For j = 1 To n

sum = sum + d.Cells(i, j).Value

Next j

srednee = sum / n

d.Cells(i, n + 1).Value = srednee

Next i

End Sub

Здесь переменная d связывается с диапазоном ячеек B1:E5. Переменные m и n получают значения, равные количеству строк и столбцов этого диапазона. Затем вычисляется среднее по каждой строке этого диапазона. Важно обратить внимание, что ссылка Cells(i, j) – это ссылка на ячейку с номером строки i и номером столбца j, причем номера строк и столбцов отсчитываются от левого верхнего угла заданного диапазона (в данном случае – от ячейки B1).



Для вычисления среднего значения каждой строки используются вложенные циклы For (см. лабораторную работу 4).

В операторе d.Cells(i, n + 1).Value = srednee вычисленное среднее значение выводится в ячейку с номером строки i и номером столбца n+1 относительно диапазона d, т.е. в столбец справа от этого диапазона.

Примечание – Если бы в программе отсутствовал оператор Set d = Range("B1:E5"), то для ссылки на диапазон ячеек каждый раз требовалось бы указывать его. Например, для определения количества строк потребовалось бы указать: m = Range("B1:E5").Rows.Count.

Конечно, рассмотренную задачу можно было решить и многими другими способами. Например, можно было воспользоваться ссылкой на ячейки в форме Cells:

Sub primer5_3a_1()

Set d = Range(Cells(1, 2), Cells(5, 5))

Здесь вместо обозначения ячейки B1 использовано обозначение Cells(1, 2), а вместо E5 - Cells(5, 5).

Рассмотрим еще один способ решения рассмотренной задачи: содержимое ячеек вводится в массив, который затем обрабатывается.

Sub primer5_3a_2()



Dim a() As Single, srednie() As Single

Set d = Range("B1:E5")

m = d.Rows.Count

n = d.Columns.Count

ReDim a(1 To m, 1 To n), srednie (1 To m)

For i = 1 To m

For j = 1 To n

a(i, j) = d.Cells(i, j).Value

Next j

Next i

For i = 1 To m

sum = 0

For j = 1 To n

sum = sum + a(i, j)

Next j

srednie(i) = sum / n

Next i

For i = 1 To m

d.Cells(i, n + 1).Value = srednie(i)

Next i

End Sub

Здесь значения ячеек диапазона B1:E5 считываются в двумерный массив a. Затем вычисляются средние значения строк этого массива. Эти средние значения сохраняются в одномерном массиве srednie. Элементы этого массива затем выводятся в ячейки справа от диапазона B1:E5.

б) Вычисления выполняются для произвольного диапазона ячеек, выделенного с помощью мыши.

Программа для решения этой задачи отличается от приведенной в примере 5.3a только тем, что оператор Set d = Range("B1:E5") требуется заменить на Set d = Selection. Здесь переменной d присваивается диапазон ячеек, выделенный с помощью мыши. В операторах m = d.Rows.Count и n = d.Columns.Countпеременные m и n получают значения, равные количеству строк и столбцов этого диапазона. Дальнейшие действия выполняются аналогично примерам, рассмотренным выше.

в) Вычисления выполняются для произвольного прямоугольного диапазона ячеек. Известно, что одна из ячеек этого диапазона – B1.

В программе, приведенной в примере 5.3a, требуется заменить оператор Set d = Range("B1:E5") на Set d = Range("B1").CurrentRegion. Здесь переменной d присваивается заполненный данными прямоугольный диапазон ячеек, одна из которых – B1.

г) Вычисления выполняются для произвольного прямоугольного диапазона ячеек, одна из которых выделена с помощью мыши.

В программе, приведенной в примере 5.3a, требуется заменить оператор Set d = Range("B1:E5") на Set d = Selection.CurrentRegion.



Пример 5.4 – На рабочем листе Excel в столбце C, начиная с ячейки C2 (т.е. в ячейках C2, C3 и т.д.), введены фамилии студентов, а в столбцах D, E, F, G – их оценки по четырем предметам. Требуется получить в столбце L (начиная с ячейки L1) список студентов, имеющих средний балл не ниже минимально допустимого. В столбце M рядом с фамилиями студентов должны выводиться их средние баллы. Минимально допустимый средний балл вводится с клавиатуры.

Sub primer5_4()

Dim min_ball As Single

min_ball = InputBox("Введите минимально допустимый средний балл: ")

Set d = Range("C2").CurrentRegion

m = d.Rows.Count

n = d.Columns.Count

k = 0

For i = 1 To m

sum = 0

For j = 2 To n

sum = sum + d.Cells(i, j).Value

Next j

srednee = sum / (n-1)

If srednee >= min_ball Then

k = k + 1

Cells(k, 12).Value = d.Cells(i,1).Value

Cells(k, 13).Value = srednee

End If

Next i

End Sub

Здесь в операторе Set d = Range("C2").CurrentRegion переменной d присваивается диапазон заполненных ячеек, заполненных данными (фамилиями и оценками); одна из этих ячеек – C2. Переменная m получает значение – количество строк диапазона d (в данном примере – количество студентов, для которых введены данные). Переменная n– количество столбцов диапазона d. Если данные введены в соответствии с постановкой задачи, то переменная n должна получить значение 5, так как диапазон данных в этом примере содержит пять столбцов: в столбце C – фамилии студентов, в столбцах D-G – их оценки.

Цикл For i = 1 To m предназначен для перебора строк (каждая строка содержит данные об одном студенте). Для каждого студента вычисляется средний балл. Цикл For j = 2 To n предназначен для перебора оценок студента (т.е. столбцов). Начальное значение переменной j, используемой в качестве номера столбца, равно двум (а не одному), так как оценки, по которым вычисляются среднее, начинаются со второго столбца в диапазоне данных (в первом столбце находятся фамилии, а не оценки). Величина d.Cells(i, j).Value – это значение ячейки с оценкой студента. Следует еще раз обратить внимание, что номера ячеек (значения i и j) отсчитываются для диапазона d, т.е. от ячейки C2.

Если вычисленный средний балл оказывается не ниже заданной минимальной величины (т.е. выполняется условие srednee >= min_ball), то фамилия студента выводится в столбец L (в 12-й столбец рабочего листа), а его средний балл – в столбец M (13-й столбец). Переменная k– номер строки рабочего листа, куда выводится фамилия студента; при выводе каждой фамилии она увеличивается на единицу.

Следует обратить внимание на строку Cells(k,12).Value=d.Cells(i,1).Value. Здесь Cells(k, 12).Value – ячейка, расположенная в k-й строке и 12-м столбце (т.е. столбце L) рабочего листа Excel. Этой ячейке присваивается значение d.Cells(i, 1).Value, т.е. содержимое ячейки, расположенной в i-й строке и первом столбце диапазона d (в этой ячейке находится фамилия студента).

Пример 5.5 – На рабочем листе Excel введены данные о студентах (см. исходные данные для примера 5.4). Требуется удалить данные обо всех студентах, имеющих средний балл ниже минимально допустимого.

Sub primer5_5()

Dim min_ball As Single

min_ball = InputBox("Введите минимально допустимый средний балл: ")

Set d = Range("C2").CurrentRegion

m = d.Rows.Count

n = d.Columns.Count

i = 1

Do While i <= m

sum = 0

For j = 2 To n

sum = sum + d.Cells(i, j).Value

Next j

srednee = sum / (n-1)

If srednee < min_ball Then

For k = i to m-1

For j = 1 to n

d.Cells(k, j).Value = d.Cells(k+1, j).Value

Next j

Next k

For j = 1 to n

d.Cells(m, j).Value = Empty

Next j

m = m-1

Else

i = i+1

End If

Loop

End Sub

В данном случае количество строк в диапазоне с данными (переменная m) не является постоянной величиной, а может изменяться, так как некоторые строки (данные о студентах) будут удаляться. Поэтому для перебора строк использован цикл Do While.

Если для i-го студента (т.е. в i-й строке) вычисленный средний балл оказывается ниже заданной минимальной величины, то данные об этом студенте требуется удалить. Следующая группа операторов смещает все последующие данные, начиная с i+1-й строки, на одну строку выше:

For k = i to m-1

For j = 1 to n

d.Cells(k, j).Value = d.Cells(k+1, j).Value

Next j

Next k

Другими словами, в i-ю строку записываются данные из i+1-й строки, в i+1-ю – из i+2-й строки, …, в m-1-ю – из m-й (т.е. из последней) строки. Затем последняя (m-я) строка очищается: ее ячейкам присваивается значение Empty.

После этого общее количество строк в диапазоне (или, другими словами, номер последней строки) уменьшается на единицу: m = m-1.

Если же для i-го студента средний балл оказался не ниже минимально необходимого, то просто выполняется переход к данным о следующем студенте (к следующей строке диапазона данных): i = i+1.

Примечание – В этом примере показано, как очистить ячейку. Если требуется проверить, пуста ли ячейка, то используется функция IsEmpty. Например, функция IsEmpty(Cells(1,5).Value) возвращает значение True, если ячейка E1 пуста, и значение False, если в этой ячейке есть какая-либо величина.

Пример 5.6 – На рабочем листе Excel введены данные о контрактах на поставку некоторых товаров (по каждому контракту поставляется один товар). Для каждого контракта в столбце A указан его номер, в столбце B – название поставляемого товара, в столбце C – количество товара. Один и тот же товар может поставляться по нескольким контрактам, но цена товара во всех контрактах одинакова. В столбце F перечислены названия товаров, в столбце G – цены на них. Фрагмент исходных данных для задачи приведен на рисунке 5.1. Требуется вычислить и вывести в столбец D стоимость каждого контракта. В конце столбца стоимостей требуется вывести сумму стоимостей всех контрактов.

Рисунок 5.1 – Фрагмент исходных данных для примера 5.6

Sub primer5_6()

Set d1 = Range("A1").CurrentRegion ‘d1 – диапазон ячеек с данными о контрактах

Set d2 = Range("F1").CurrentRegion ‘d2 - диапазон ячеек с данными о товарах

m1 = d1.Rows.Count ‘ Количество контрактов

m2 = d2.Rows.Count ‘ Количество товаров

For i = 1 To m1 ‘ Перебор всех контрактов

nazv = d1.Cells(i,2).Value ‘ Переменной nazv присваивается название товара, поставляемого

‘ по контракту

kol = d1.Cells(i,3).Value ‘ Переменной kol присваивается количество поставляемого товара

For j = 1 To m2 ‘ Перебор данных о товарах (поиск цены на товар)

If nazv = d2.Cells(j,1).Value then ‘Если товар найден

cena = d2.Cells(j,2).Value ‘Цена на товар присваивается переменной cena

stoimost = cena*kol ‘ Вычисление стоимости контракта

d1.Cells(i,4).Value = stoimost ‘ Стоимость выводится в i-ю строку, столбец D

sum_stoimost = sum_stoimost + stoimost ‘Суммируется стоимость всех контрактов

End If

Next j

Next i

d1.Cells(m1+1,4).Value = sum_stoimost ‘В строку m1+1 (в конце столбца стоимостей)

‘выводится сумма стоимостей всех контрактов

End Sub

В данном примере используются два диапазона: d1 – диапазон ячеек с данными о контрактах, d2 – с данными о товарах и ценах на них. Если считать, что на рисунке 5.1 показаны все данные, то диапазон d1 содержит ячейки A1:C7, а d2 – ячейки F1:G4. Переменная i используется в качестве номера строки в диапазоне d1, переменная j – также номер строки, но в диапазоне d2.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.