Шаг 70 - Нефть, таблицы и как делать не надо

Вот такое письмо.

Добрый день Артем. 
Дело в том что с этими данными также нужно производить 
другие расчеты и представлять их геологам, в Access'e по 
моему это сделать будет немного проблематично да и неудобно 
для передачи. так что лучше наверное все же в Excel'e. Ну ты 
понял в чем именно суть проблемы да? еще раз повторюсь чтобы 
уж не было непоняток, а то может объяснил я не так. имеется таблица. 
1 столбец имя скважины, второй насыщение пропластка. 
Выглядит это следующим образом: 
1210k	Нефть
1210k	Нефть
1210k	НВ
1210k	Неясно
1231	Вода
1231	Вода
1231	Вода
1231	Вода
По скважине 1210к есть насыщение нефть, нв и неясно. соответственно тип 
скважины нефтенасыщенный 1231 только вода значит водо-насыщенная и т.д. 
в таком же духе. Вот. 
С уважением Рустам Сафиуллин
mailto: rustam@geodata.ru

Первая мысль которая родилась у меня после этого письма послать все к черту вмеcте с автором. Это классическая задача баз данных. Любые расчеты и все такое можно решить с помощью того же ACCESS и намного проще. Кроме того большая часть кода ниже будет просто реализация стандартного SQL запроса. Кроме того, код подвержен ошибкам в данных ведь Нефт и Нефть не одно и тоже. Но мой опыт работы с геологами показывает что объяснять им что то бесполезно. Можно и на EXCEL сделать. Можно неправильно но можно. Итак таблица выгляди вот так.

70_1.gif (2762 b)

Сначала нужно определить где начинаются и заканчиваться данные, это написано в "Шаг 45 - Начало и конец данных".

Dim allbore As Range ' здесь будет храниться диапазон скважин
' выбрать колонку
Set allbore = Range("A:A")
' только с данными
Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
' выделить
allbore.Select

А вот результат:

70_2.gif (3054 b)

Теперь нам нужно создать список скважин которые есть, способ один перебрать все записи и уникальные поместить у коллекцию. Как двигаться по диапазону написано в шаге "Шаг 66 - Движение по диапазону".

Dim borename As New Collection ' это набор скважин

Sub FindOil()
	Dim allbore As Range ' здесь будет храниться диапазон скважин
	Set allbore = Range("A:A") ' выбрать колонку
	' только с данными
	Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
	allbore.Select 		 	' выделить
	For Each bore In allbore 	' бежим по диапазону скважин
	    bore.Select  		' выделяем ячейку
	    borename.Add (bore.Value)   ' добавить к коллекцию
	Next bore
End Sub

Вот теперь у нас в коллекции все имена скважин. Но они повторяться же. Надо при добавлении проверять есть такое имя в коллекции или нет. Напишем функцию.

Function FindElement(name As String) As Boolean
	' бежим по коллекции
	For Each elem In borename
		' если имя совпадает вернуть FALSE
		If elem = name Then
			FindElement = False
			Exit Function
		End If
	Next elem
	' нет имени
	FindElement = True
End Function

И применим ее:

Dim allbore As Range ' здесь будет храниться диапазон скважин

Sub FindOil()
	Set allbore = Range("A:A") ' выбрать колонку
	' только с данными
	Set allbore = Range(allbore.Columns.End(xlUp).Address, allbore.Columns.End(xlDown).Address)
	allbore.Select ' выделить
	For Each bore In allbore ' бежим по диапазону скважин
	    bore.Select  ' выделяем ячейку
	    If FindElement(bore.Value) = True Then
		' если скважины нет в коллекции
			borename.Add (bore.Value)   ' добавить к коллекцию
		End If
	Next bore
End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.