Страницы: 1
RSS
Площадь многоугольника. пользовательская функция
 
Здравствуйте. Есть координаты вершин замкнутой фигуры (столбцы А и В). необходимо узнать ее площадь по формуле площади Гаусса. В ячейке В28 рузультат полученный с помощью пользовательской функции:
Код
Function PlMnUg(xy As Range) As Single
  Dim r As Long, s As Single
  ''s = 0
  With xy
    For r = 1 To .Rows.Count - 1
      s = s + (.Cells(r, 1) * .Cells(r + 1, 2) / 2 - .Cells(r + 1, 1) * .Cells(r, 2) / 2)
    Next
  End With
  PlMnUg = Abs(s)
End Function
В ячейке С26 та же площадь, но вычисленная с помощью промежуточного столбца С. Результаты разные. Не могу понять почему. Может кто нибудь помочь?
 
И еще сразу вопрос. Можно как то сделать, чтобы функцию можно было вызывать не
Код
=PERSONAL.XLSB!PlMnUg(A2:B25)
а вот так?
Код
=PlMnUg(A2:B25)
 
Ошибки:
- применение Single (надо Double);
- деление на 2 в каждом действии (или на листе неправильно - формулы Гаусса не знаю);
- исключение из расчетов последней строки диапазона (.Rows.Count-1).

Код
Function PlMnUg(xy As Range) As Double
Dim r As Long, s As Double
    With xy
        For r = 1 To .Rows.Count
            s = s + .Cells(r, 1) * .Cells(r + 1, 2) - .Cells(r + 1, 1) * .Cells(r, 2)
        Next
    End With
    
    PlMnUg = Abs(s) / 2
End Function
У Вас функция записана в личной книге макросов. Перенесите ее в общий модуль рабочей книги.
 
Спасибо. Помогло.
Цитата
vikttur написал: Перенесите ее в общий модуль рабочей книги.
А вот с этим возникли проблемы. Не пойму как. Пробовал сохранить как надстройку, но все равно недоступна функция.
 
Если сохранить как надстройку, то ее нужно подключить:
Файл-Параметры-Надстройки, внизу Надстройки-Перейти, в окне поставить галку возле надстройки, ОК. Если надстройки  перечне нет: Обзор- найт надстройку.

Если функция используется в одной книге, размещение кода отдельно не имеет смысла.
Alt+F11 - вход в редактор VBA. Слева найти дерево проекта. Вставить код в общий модуль.
Если в проекте нет общего модуля нет  - Insert-Module
 
Да, подключал. Все делал как Вы написали. Но при открытии какой-нибудь другой книги, эта функция остается недоступной. И приходится писать
Код
=PERSONAL.XLSB!PlMnUg(A2:B25)
В параметры заходил и проверял, подключена ли. Все ок, галочка напротив стоит. При запуске эксель загружает надстройку. Но если перейти в редактор VBA, то в этой надстройке нет модулей.

В том то и дело, что используется и в других книгах.
Изменено: serjloskut - 10.09.2017 11:20:41
 
PERSONAL - это личная книга макросов. Надстройка - сохранить книгу как надстройку Excel (.xlam) и подключить ее.
 
Вроде так и делал. ВОт по пунктам мои действия.
1. Сначала создал польз.функцию в личной книге макросов.
2. Сохраняем книгу: Файл - Сохранить как - Надстройка Excel (*.xlam)
3. Подключаем надстройку. Файл - Параметры - Надстройки. В управлении выбираем "Надстройки Excel", нажимаем перейти. Далее Обзор - Выбираем файл надстройки. Ставим галочку если не стоит. Жмем Ок. Закрываем Эксель.

Теперь когда открываю другую книгу (по идее) можно просто прописать
Код
=PlMnUg(A2:B25)
...но выдает ошибку. Работает только
Код
=PERSONAL.XLSB!PlMnUg(A2:B25)
Все правильно делаю? Такое ощущение, что где то какой то нюанс есть.
 
Все разобрался. Нужно было создавать модуль для польз.функции не в личной книге макросов, а непосредственно в книге. Поэтому и не было модулей в надстройке. Большое спасибо за помощь.
Изменено: serjloskut - 10.09.2017 11:35:14
 
Спасибо за функцию PlMnUg, проверил в AutoCAD - работает правильно!
Минус - PlMnUg нельзя разместить в ячейке A26, т.к. попадёшь в цикл, проблема в коде.
А функцию SquareMSK можно, а также она может считать площадь по GPS-координатам.

Синтаксис: =SquareM(XY,SK,SU), где
XY - диапазон ячеек с координатами
SK - тип координат (1 - метры, 2 - GPS)
SU - тип результата (1 - м2, 2 - км2)
Доп. ячейки не требуются, пустые ячейки игнорируются.
Изменено: Acid Burn - 17.12.2024 18:22:39
Страницы: 1
Читают тему
Наверх