1

(4 ответов, оставленных в Готовые программы)

Версия 1.6

Основные изменения и дополнения по сравнению с предыдущей версией (1.5):
1.Работа в AutoCAD 2016 (64 bit)
2.Настройки приложения редактируются в специальном окне

Скачать приложение, а также все вопросы, замечания и предложения по адресу: Расчет длин

2

(5 ответов, оставленных в Готовые программы)

Версия 0.3

Основные изменения по сравнению с версией 0.2
1.Приложение работает под AutoCAD 2016 64 bit
2.Функция Редактирование точек – Поднять/Опустить изменяет не только значения атрибутов блока Высота и Точная высота, но и фактическую высоту точки вставки 3D блока.

Скачать приложение, а также все вопросы, замечания и пожелания по адресу: Планировка 0.3

3

(5 ответов, оставленных в Готовые программы)

> Valery
Brelovsky
Не проверял, но думаю, что нет.
Ответ на ваш вопрос

4

(5 ответов, оставленных в Готовые программы)

Версия 0.2

Основные изменения по сравнению с версией 0.1
1.Исправлена ошибка «424»
2.Исправлена ошибка потери пути к имени блока в AutoCAD 2008-2010
3.Исправлена ошибка сохранения параметров приложения в ini-файл
4.Исправлена ошибка импорта точек из текстового файла
5.Добавлена возможность вставки блока точки с соответствующей высотой (3D блоки)

Скачать приложение, а также все вопросы, замечания и пожелания по адресу: Планировка 0.2 или по электронной почте misha-tver@mail.ru

5

(4 ответов, оставленных в VBA)

> Been
Нет, использование оператора присваивания на уровне модуля недопустимо-это ограничение VBA :(
Справка по VBA:

Note   At module level, you can use only comments and declarative statements, such as Const, Declare, Deftype, Dim, Option Base, Option Compare, Option Explicit, Option Private, Private, Public, and Type.

Обычно поступаю следующим образом:

Dim n as Single
Public Sub Init
  n = 3.14
End Sub

Процедура Init должна быть запущена до процедур и функций, использующих переменную n
>>Gomer
:?:

6

(1 ответов, оставленных в VBA)

> Vadim
Возможно тебе поможет команда IMAGEFRAME (ИЗОБКОНТУР) значение 0

1.Файл меню грузится, но меню не появляется
2.Программа неверно определяет длины следующих примитивов:
-утолщенная полилиния: вместо длины определяется число сегментов полилинии
-окружность,эллипс и их дуги: вместо длины центральный угол в радианах
-сплайн - вместо длины не знаю что - не стал разбираться
-мультилинию не видит
Проверял в AutoCAD 2006
3.Длины отрезков определяет правильно:)
4.Код приложения закрыт...
5.Предлагаю обратить внимание на аналогичные программы для подсчета длин и сравнить с ними результат работы вашей программы:
-Расчет длин
-http://dwg.ru/dnl/2733
-https://www.caduser.ru/forum/topic47563.html

-FDist v1.0 - Расчет дистанций по точкам и элементам.
http://dwg.ru/dnl/486

-VetCAD++ v3.7 - утилиты для AutoCAD (2004-2010)
http://dwg.ru/dnl/206 (демо-версия)

-GeomProps - площадь, длина, объем выбранных примитивов
http://www.maestrogroup.com.ua/support/GeomProps.zip
https://www.caduser.ru/forum/topic36136.html

-Программа расчета длин и площадей генплана в Акаде v.2
http://dwg.ru/dnl/5763

-Программа LSV - предназначена для измерения и расчета длин, площадей, объемов и масс элементов
http://dwg.ru/dnl/1726

-Сумма длин elen.lsp
http://dwg.ru/dnl/5400

Список далеко не полный

8

(4 ответов, оставленных в VBA)

> airiz
Прошу прощения, невнимательно прочитал ваш первый пост и перепутал угол поворота с углом наклона

Public Sub SelectObliqueAngleText()
'Процедура выбора примитивов TEXT стиль SN с углом НАКЛОНА в заданном интервале (30 < ObliqueAngle  < 45)
'Важно: из-за ошибок округления (усечения) при работе с действительными числами
'для граничных значений угла результат работы функции может быть ошибочным.
'Для исключения этих ошибок введена постоянная eps
Const pi = 3.141592654
Const eps = 0.000000001
Dim FilterType(0 To 7) As Integer
Dim FilterData(0 To 7) As Variant
Dim ss As AcadSelectionSet
Dim MinAngle As Double
Dim MaxAngle As Double

'Углы в радианах
MinAngle = 30 * pi / 180 + eps
MaxAngle = 45 * pi / 180 - eps
'Тип объекта
FilterType(0) = 0
FilterData(0) = "TEXT"

'MinAngle< НАКЛОН <MaxAngle
FilterType(1) = -4
FilterData(1) = "<AND"

    FilterType(2) = -4
    FilterData(2) = ">"
    FilterType(3) = 51
    FilterData(3) = MinAngle
    
    FilterType(4) = -4
    FilterData(4) = "<"
    FilterType(5) = 51
    FilterData(5) = MaxAngle

FilterType(6) = -4
FilterData(6) = "AND>"
'Текстовый стиль
FilterType(7) = 7
FilterData(7) = "SN"
'Создаем SelectionSet
On Error Resume Next
    ThisDrawing.SelectionSets.Item("RText").Delete
    Set ss = ThisDrawing.SelectionSets.Add("RText")
    Err.Clear
On Error GoTo 0
'Выбираем объекты на экране
ss.Select acSelectionSetAll, , , FilterType, FilterData
'ss.SelectOnScreen FilterType, FilterData
'Подсвечиваем объекты
Dim obj As AcadEntity
For Each obj In ss
    obj.Highlight True
Next obj
'Число выбранных объектов
Debug.Print "Найдено примитивов: " & ss.count
MsgBox "Найдено примитивов: " & ss.count, vbInformation, "SelectNotHorText"

'Удаляем набор
On Error Resume Next
    ss.Delete
    Err.Clear
On Error GoTo 0
End Sub

9

(4 ответов, оставленных в VBA)

Option Explicit

Public Sub SelectNotHorText()
'Процедура выбора примитивов TEXT стиль SN с углом поворота не равным нулю
Dim FilterType(0 To 3) As Integer
Dim FilterData(0 To 3) As Variant
Dim ss As AcadSelectionSet

'Тип объекта
FilterType(0) = 0
FilterData(0) = "TEXT"
'Текстовый стиль
FilterType(1) = 7
FilterData(1) = "SN"
'Поворот <> 0
FilterType(2) = -4
FilterData(2) = "/="
FilterType(3) = 50
FilterData(3) = 0#
'Создаем SelectionSet
On Error Resume Next
    ThisDrawing.SelectionSets.Item("RText").Delete
    Set ss = ThisDrawing.SelectionSets.Add("RText")
    Err.Clear
On Error GoTo 0
'Выбираем объекты на экране
ss.Select acSelectionSetAll, , , FilterType, FilterData
'ss.SelectOnScreen FilterType, FilterData
'Число выбранных объектов
Debug.Print "Найдено примитивов: " & ss.count
MsgBox "Найдено примитивов: " & ss.count, vbInformation, "SelectNotHorText"

'Удаляем набор
On Error Resume Next
    ss.Delete
    Err.Clear
On Error GoTo 0
End Sub

10

(4 ответов, оставленных в Готовые программы)

> Vitaly
С помощью функции _DataExtraction можно извлечь информацию о примитивах, расположенных в одном и даже нескольких чертежах. Но:
1.С ее помощь нельзя в одну таблицу свести несколько более менее сложных запросов выбора объектов по нескольким параметрам (возможно я просто не знаю как это сделать и вы меня поправите). В архиве приложения "Расчет длин" в папке Test расположен файл Test.dwg с таблицей расчета. Если точно-такую же таблицу вы сможете создать с помощью _DataExtraction, то ... то это действительно полезная для меня функция, которую я недооценил:)
2.С помощь приложения "Расчет длин" можно загрузить условия выбора и последовательно выбирая объекты на экране создать сразу несколько таблиц (например для каждой строительной площадки). С помощью _DataExtraction перед каждым выбором придется загружать набор,отвечать на кучу вопросов и нажимать много раз далее.
3.Различный подход к выбору объектов: в приложении "Расчет длин" вы задаете требуемые вам свойства примитивов (Слой, Цвет, Тип Линии, Типы объектов) и на основании этого выбираются объекты, которые удовлетворяют этим требованиям (их количество может быть равным нулю, что тоже результат). В функции _DataExtraction по сути объекты выбираются только по типу примитива (Отрезок, Линия, Блок и т.п.) и в таблицу заносятся их характеристики (которые вы пожелаете).Затем вам придется каким-то образом анализировать полученные данные (скорее всего в Excel). Возможностей самой таблицы для этого недостаточно.
4.В качестве примера использования функции _DataExtraction приводится простейший расчет длин трубопроводов, расположенных в разных слоях. Ту же самую задачу гораздо быстрее я решу с помощью "Расчет длин" применив фильтр Слой.
5.В таблицу _DataExtraction можно добавить столбец с функцией пользователя. Набор функций скуден, и использовать их неудобно. Открытый код приложения "Расчет длин" в этом плане позволяет сделать гораздо больше.
6.Использование _DataExtraction мне показалось очень неудобным.
7.В основном работаю в AutoCAD 2006, поэтому могу многого не знать о возможностях функции  _DataExtraction, при определении Длин и Площадей примитивов. Буду признателен, если вы мне об этом раскажете.

11

(4 ответов, оставленных в Готовые программы)

РАСЧЕТ ДЛИН 1.6

Приложение «Расчет длин» предназначено для определения суммарной длины и площади примитивов AutoCAD. Поддерживается выбор примитивов по слою, по цвету, по типу линии и по виду примитивов. Виды примитивов, длины которых могут быть определены:
1.Дуга
2.Окружность
3.Эллипс
4.Сплайн
5.Отрезок
6.Утолщенная полилиния
7.Полилиния
8.Мультилиния

Приложение может определить площади следующих примитивов:
1.Дуга
2.Окружность
3.Эллипс
4.Сплайн
5.Утолщенная полилиния
6.Штриховка
7.Регион

В отличие от множества аналогичных программ, приложение позволяет одновременно задать несколько условий выбора объектов на чертеже и свести результаты расчета в виде таблицы, которая затем может быть либо вставлена в чертеж в виде объекта Таблица, либо передана в MS Excel для дальнейшей обработки. Данная возможность позволяет создавать всевозможные ведомости объемов работ, определяемых своей длиной или площадью.
В первую очередь приложение предназначено для получения информации с топографических планов оформленных в AutoCAD: площади существующих и проектных покрытий, длины коммуникаций, ограждений, объемы по разборке существующих сооружений, объемы рубки леса, кустарника и т.п., но может быть использовано и в других отраслях.

Версия 1.6 написана и протестирована под AutoCAD 2016 64-bit, Windows 10

Основные изменения и дополнения по сравнению с предыдущей версией (1.5):
1.Работа в AutoCAD 2016 (64 bit)
2.Настройки приложения редактируются в специальном окне

Подробные сведения об установке и использовании приложения находятся в файле Справка.pdf

Скачать приложение, а также все вопросы, замечания и предложения по адресу: Расчет длин

12

(4 ответов, оставленных в VBA)

Пример от Ingwar показывает работу с цветом в формате RGB. Помимо этого цвет может быть (свойство ColorMethod):

acColorMethodByACI
acColorMethodByBlock
acColorMethodByLayer
acColorMethodByRGB
acColorMethodForeground

О разных видах цветов в AutoCAD и выборе объектов по цвету можно посмотреть в теме Цвет Foreground

13

(3 ответов, оставленных в VBA)

> Максим
Захаров
Без приведенного кода вряд ли тебе кто-то сможет помочь.
Чтобы попытаться выловить ошибку используй возможности меню Debug: точки останова, пошаговое выполнение, контроль за значением переменных

Valery Brelovsky пишет:

Mikha,

А для 2000 эта программа пойдёт.

Приложение написано и протестировано под AutoCAD 2006. Проверить работу в более поздних версиях нет возможности (и необходимости), но в принципе должно работать как минимум вплоть до 2010 в том случае, если установлена поддержка VBA. Работу в более ранних версиях я также не проверял.
Как выглядит AutoCAD 2000 помню смутно, если верить Википедии, поддержка VBA в нем уже была, но вряд ли предложенная мною программа будет работать в нем без "доработки напильником"

Еще один вариант Планировка

16

(4 ответов, оставленных в VBA)

Файл частичной адаптации может быть загружен программно.
А вот выгрузить его программно без участия пользователя(правда минимального) у меня тогда не получилось.

'ФУНКЦИЯ ПРОВЕРКИ, ЗАГРУЖЕНА ЛИ ОПРЕДЕЛЕННАЯ ГРУППА МЕНЮ
Private Function MenuGroupExist(MenuName As String) As Boolean
Dim MenuGroup As AcadMenuGroup
MenuGroupExist = False
MenuName = UCase(MenuName)
For Each MenuGroup In Application.MenuGroups
    If MenuGroup.Name = MenuName Then
        MenuGroupExist = True
        Exit Function
    End If
Next
End Function

'ФУНКЦИЯ ЗАГРУЗКИ ГРУППЫ МЕНЮ
Private Function AddMenuGroup(MenuName As String, MenuFileName As String) As Long
'MenuName - имя группы меню
'MenuFileName - полный путь файла группы меню (.cui файл)
'Результат:
'AddMenuGroup = -1 - не удалось загрузить файл частичной адаптации
'AddMenuGroup =  0 - файл частичной адаптации уже загружен
'AddMenuGroup =  1 - удачная загрузка файла частичной адаптации

Dim MenuGroupObject As AcadMenuGroup
If MenuGroupExist(MenuName) Then
    AddMenuGroup = 0
Else
    On Error Resume Next
    Set MenuGroupObject = Application.MenuGroups.Load(MenuFileName, False)
    If Err.Number = 0 Then AddMenuGroup = 1 Else AddMenuGroup = -1
    On Error GoTo 0
End If
End Function

'ФУНКЦИЯ ВЫГРУЗКИ ГРУППЫ МЕНЮ
Private Function DelMenuGroup(MenuName As String) As Long
'MenuName - имя группы меню
'Результат:
'DelMenuGroup = -1 - не удалось выгрузить файл частичной адаптации
'DelMenuGroup =  0 - файл частичной адаптации незагружен
'DelMenuGroup =  1 - удачная выгрузка файла частичной адаптации
Dim MenuGroupObject As AcadMenuGroup
If MenuGroupExist(MenuName) Then
    On Error Resume Next
    Application.MenuGroups.Item(MenuName).Unload
    If Err.Number <> 0 Then
        DelMenuGroup = -1
        Exit Function
    End If
    On Error GoTo 0
    DelMenuGroup = 1
Else
    DelMenuGroup = 0
End If
End Function

Код был написан под AutoCAD 2006.Полностью его можно посмотреть здесь Расчет длин 1.4
Другой вариант загрузки приложения и создания своего меню - Планировка 0.1

17

(4 ответов, оставленных в VBA)

Почему только на Lisp? На VBA это тоже несложно. Пример из Help:

Sub Example_AddSubMenu()
    ' This example creates a new menu called TestMenu and ins erts a submenu item
    ' called NewFile. It then creates a menu item, called open,
    ' on the submenu.
    
    ' The menu is then displayed on the menu bar.
    ' To remove the menu after execution of this macro, use the Customize Menu
    ' option from the Tools menu.
    
    Dim currMenuGroup As acadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    
    ' Create the new menu
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    
    ' Add the submenu
    Dim FileSubMenu As AcadPopupMenu
    Set FileSubMenu = newMenu.AddSubMenu("", "NewFile")
    
    
    ' Add a menu item to the sub menu
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    
    ' Assign the macro string the VB equivalent of "ESC ESC _open "
    openMacro = Chr(3) & Chr(3) & Chr(95) & "open" & Chr(32)
    
    Set newMenuItem = FileSubMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro)
    
    ' Display the menu on the menu bar
    newMenu.InsertInMenuBar (ThisDrawing.Application.MenuBar.count + 1)
    
End Sub

Данный код не учитывает возникновении ошибки при попытке повторного создания существующего меню.Чтобы ее избежать можно либо проверить существование меню перед его созданием, либо заключить код по созданию меню в блок On Error Resume Next ... On Error GoTo 0

Да.Например, так:

'ФУНКЦИЯ ПРОВЕРКИ, ВХОДИТ ЛИ КАТАЛОГ В SupportPath
Private Function SupportPathExist(SuppPath As String) As Boolean
Dim FullSupportPath As String
Dim OnePath As String
Dim Ch As String
Dim i As Long
'Строка .SupportPath содержит пути файлов разделенных символом ";"
'в конце строки символ ";" отсутствует (см Help), поэтому добавим его сами
'и получим строку, значения в которой разделены символом ";"
FullSupportPath = Application.Preferences.Files.SupportPath + ";"

For i = 1 To Len(FullSupportPath)
    Ch = mid(FullSupportPath, i, 1)
    If Ch <> ";" Then
        OnePath = OnePath + Ch
    Else
        If OnePath = SuppPath Then
            SupportPathExist = True
            Exit Function
        End If
        OnePath = ""
    End If
Next i
SupportPathExist = False
End Function

'ФУНКЦИЯ ДОБАВЛЕНИЯ КАТАЛОГА В SupportPath
Private Function AddSupportPath(SuppPath As String) As Long
'=-1 не удалось добавить путь в SupportPath
'=1 путь добавлен в SupportPath
'=0 путь уже содержится в SupportPath

If SupportPathExist(SuppPath) Then
    AddSupportPath = 0
    Exit Function
Else
    On Error Resume Next
    Application.Preferences.Files.SupportPath = Application.Preferences.Files.SupportPath + ";" + SuppPath
    If Err.Number <> 0 Then AddSupportPath = -1 Else AddSupportPath = 1
    On Error GoTo 0
End If
End Function

'ФУНКЦИЯ УДАЛЕНИЯ КАТАЛОГА ИЗ SupportPath
Private Function DelSupportPath(SuppPath As String) As Long
'=-1 не удалось удалить путь из SupportPath
'=1 путь удален из SupportPath
'=0 путь не содержится в SupportPath
Dim FullSupportPath As String
If SupportPathExist(SuppPath) Then
    FullSupportPath = Application.Preferences.Files.SupportPath + ";"
    FullSupportPath = Replace(FullSupportPath, SuppPath + ";", "")
    On Error Resume Next
    Application.Preferences.Files.SupportPath = mid(FullSupportPath, 1, Len(FullSupportPath) - 1)
    If Err.Number <> 0 Then
        DelSupportPath = -1
        Exit Function
    End If
    On Error GoTo 0
    DelSupportPath = 1
Else
    DelSupportPath = 0
End If
End Function

19

(4 ответов, оставленных в VBA)

> Alexandr
Какое значение переменной SDI на компьютере,на котором возникает эта ошибка?
Лучше выложи полностью код процедуры, в которой возникает ошибка,будет проще понять что к чему.

20

(4 ответов, оставленных в VBA)

Одна из возможных проблем - значение системной переменной SDI - Управляет режимом работы программы (одно- или многодокументный интерфейс)
Цитаты из Help:

Documents collection: You cannot use the Add method for the Documents collection
while in SDI mode. When in SDI mode, use the Open method on the Document object.

When working in MDI mode, you should always use the Open method from the Documents collection.
When working in SDI mode, use the Open method from the Document object.

Возможное решение проблемы:

Public Sub testAdd()
Dim newODwg As AcadDocument
Dim TemplatePath As String
'Путь к файлу,который будет открыт в случае SDI<>0
TemplatePath = "D:\Рабочая\NewDoc.dwg"

On Error Resume Next
    Set newODwg = Application.Documents.Add()
    If newODwg Is Nothing Then 'SDI<>0
        Set newODwg = ThisDrawing.Open(TemplatePath) '!Текущий рисунок при этом будет закрыт без предупреждения о сохранении изменений
    End If
    
    If newODwg Is Nothing Then
        MsgBox "Не удалось создать новый документ" + vbCr + "Дальнейшая работа невозможна"
        Exit Sub
    End If
On Error GoTo 0
end sub

21

(4 ответов, оставленных в VBA)

> Alexandr
Параметры в процедуры и функции можно передать напрямую.Для этого вместо метода RunMacro нужно использовать метод Eval.
К сожалению формат форума не позволяет прикрепить файлы, поэтому придется тебе их создать самому.

1.Данный код помещаешь в модуль EXcel:

Option Explicit

Public Sub RunAcadMacro()
Dim AcadApp As Object
Dim AcadDoc As Object
Dim dvb_path As String

'Путь к файлу *.dvb, который необходимо загрузить
dvb_path = Application.ActiveWorkbook.Path + "\MyProject.dvb"

'Процедуры и функции которые нужно запустить:
'ЗАПУСК ПРОЦЕДУРЫ БЕЗ ПАРАМЕТРА
Const macro_string_1 = "MyLib.AnyFuns.EmptySub"
'ЗАПУСК ФУНКЦИИ БЕЗ ПАРАМЕТРА
Const macro_string_2 = "MyLib.AnyFuns.EmptyFun"
'ЗАПУСК ПРОЦЕДУРЫ С 2-МЯ ПАРАМЕТРАМИ
Const macro_string_3 = "MyLib.AnyFuns.MySub 3,4"
'Const macro_string_3 = "Call MyLib.AnyFuns.MySub(3,4)"'Можно и так запустить
'ЗАПУСК ФУНКЦИИ С 2-МЯ ПАРАМЕТРАМИ
Const macro_string_4 = "Call MyLib.AnyFuns.MyFunction(3.256,4.123)"

On Error Resume Next
    'Присоединяемся к AutoCAD
    Set AcadApp = GetObject(, "AutoCAD.Application")
    If AcadApp Is Nothing Then
        Set AcadApp = CreateObject("AutoCAD.Application")
    End If
    AcadApp.Visible = True
    'Загружаем *.dvb проект
    AcadApp.LoadDVB dvb_path
    'Запускаем требуемые функции
    AcadApp.Eval (macro_string_1)
    AcadApp.Eval (macro_string_2)
    AcadApp.Eval (macro_string_3)
    AcadApp.Eval (macro_string_4)
On Error GoTo 0
End Sub 

2.В той же папке, сохраняешь VBA проект (AutoCAD):
Файл проекта: MyProject.dvb
Имя проекта: MyLib
Модуль: AnyFuns
В модуле пишешь:

Option Explicit

Public Function MyFunction(ByVal A As Double, ByVal B As Double)
Dim C As Double
    C = (A * A + B * B) ^ (1 / 2)
    MsgBox CStr( C ), vbInformation, "TestRunMacro"
End Function

Public Sub MySub(ByVal A As Double, ByVal B As Double)
Dim C As Double
    C = (A * A * A + B * B * B) ^ (1 / 3)
    MsgBox CStr( C ), vbInformation, "TestRunMacro"
End Sub

Public Sub EmptySub()
    MsgBox "EmptySub", vbInformation, "TestRunMacro"
End Sub

Public Function EmptyFun()
    MsgBox "EmptyFun", vbInformation, "TestRunMacro"
End Function

3.При запуске из Excel процедуры RunAcadMacro загрузится AutoCAD (если был не загружен),загрузится проект MyLib и последовательно появятся 4 окна с результатами работы процедур и функций.

22

(5 ответов, оставленных в Готовые программы)

ПЛАНИРОВКА – приложение для AutoCAD, предназначенное для создания цифровой модели местности на основании «плоского» чертежа, а также для решения простейших задач вертикальной планировки проектной поверхности.
Приложение написано и протестировано под AutoCAD 2006. Проверить работу в более поздних версиях нет возможности (и необходимости), но в принципе должно работать как минимум вплоть до 2010 в том случае, если установлена поддержка VBA.

Основные функции приложения:
1.Создание точек и групп точек из текста
2.Создание точек по превышению, уклону, интерполяции относительно предварительно созданных точек; создание точек в заданной плоскости
3.Измерение параметров взаимного расположения двух точек: расстояние, уклон, превышение, дирекционный угол.
4.Построение горизонталей с заданным шагом между тремя выбранными точками
5.Импорт точек из текстового файла и из точек AutoCAD
6.Экспорт точек в текстовый файл и в точки AutoCAD
7.Настройка внешнего вида вновь создаваемых и уже созданных точек (видимость отдельных параметров точки, точность отображения координат и высот)
8.Возможность создания и использования пользовательских блоков для отображения точек

Порядок установки приложения, подробное описание всех функций и примеры использования подробно изложены в прилагающейся справке.

Исходный код приложения написан в основном на VBA. В процессе работы программа создает новые файлы, производит запись и чтение данных из них. Данные операции могут восприниматься некоторыми антивирусными программами (например, Антивирус Касперского), как потенциально опасные. В действительности, приложение не содержит в себе вирусов и любого другого вредоносного кода. Убедиться в этом можно, просмотрев исходный код, который является открытым.
Приложение распространяется бесплатно. Автор с удовольствием примет все пожелания и замечания по поводу идеи и ее реализации.

Скачать приложение, а также все вопросы, замечания и пожелания по адресу: ПЛАНИРОВКА 0.1 или по электронной почте misha-tver@mail.ru

> SmeL
Извини, зря сомневался в правильности предложенного тобой способа решения задачи. Он не только верен, но и гораздо быстрее того, что предложил я. Если их сравнить, то получаем следующее:
1.Способ SmeL
+гораздо быстрее
-находит одно решение
-/+ не верен, если в наборе есть отрицательные числа (по условию задачи их быть не должно)
2.Способ Mikha
-работает очень медленно,при N>30 человек может и не дождаться результатов
+работает с отрицательными числами
+находит все возможные решения

> SmeL

Пример ряда в студию

Сначала Вы пишете код,реализующий предложенный Вами алгоритм, а затем я постараюсь найти ряд, доказывающий правомерность моих сомнений.
Подставляем мой тест в Ваш код и видим результат.
Но для начала нужно все-таки решить вопрос о возможности изменения первоначального порядка следования элементов в исходном наборе. Считаю, что изменять порядок можно и нужно, иначе задача становится слишком простой и недостойной нашего внимания:)

> Гость

второй алгоритм по сути является оптимизацией вашего

Не могу с Вами согласиться.
Во-первых, Ваш алгоритм не проверяет все возможные варианты
Во-вторых, результат работы у алгоритмов различный (пост 28.05.2009 14:13:15)

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