Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2011, 03:22   #1
Parabellum
 
Регистрация: 12.01.2011
Сообщений: 7
По умолчанию Указание диапазонов при обращении к функции

Есть определенная функция Linterp. Из подпрограммы Middle (отдельный модуль) происходит вызов этой функции. Функция использует данные типа Range в виде одномерных массивов-столбцов. Однако работают не все способы указания диапазонов. Почему - непонятно. Те, которые работают, являются для меня не оптимальными (приходится создавать временные диапазоны, необходимо знать точное количество ячеек,и так далее). Однако в одном из неработающих способов (RRRX и RRRY) другим диапазонам (RRX и RRY) можно присвоить значения, которые совпадают с необходимыми для обработки функцией. В связи с этой проблемой также возникли вопросы - можно ли как-то задать (средствами VBA) диапазон (Range), включающий в себя все ячейки, кроме первой (или заранее определенной)? Как нужно правильно указывать на определенную колонку или ряд диапазона (что-то вида ИмяДиапазона(*,номер_столбца), где * - все ряды)? Возможно ли использование таких методов задания диапазонов при работе с функцией?
Вложения
Тип файла: zip Book3.zip (30.7 Кб, 16 просмотров)

Последний раз редактировалось Parabellum; 12.01.2011 в 03:25.
Parabellum вне форума Ответить с цитированием
Старый 12.01.2011, 11:08   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Возможно мой вариант вам немного поможет
Вложения
Тип файла: rar вариант.rar (14.7 Кб, 19 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 12.01.2011, 13:49   #3
Parabellum
 
Регистрация: 12.01.2011
Сообщений: 7
По умолчанию

Спасибо. Интересный вариант. Изучаю. Жаль, что в VBA нет более простых методов.
Parabellum вне форума Ответить с цитированием
Старый 12.01.2011, 14:20   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
(что-то вида ИмяДиапазона(*,номер_столбца), где * - все ряды)?
Columns(3), Range("C:C"), [c:c] - это 3 варианта обращение к колонке 3 (она же колонка С)
Цитата:
можно ли как-то задать (средствами VBA) диапазон (Range), включающий в себя все ячейки, кроме первой
Range(cells(2,3), cells(rows.count,3) или Range("C2:C" & rows.count) - все ячейки 3-й колонки, кроме первой
Цитата:
(или заранее определенной)?
допустим из колонки В исключить ячейку в i-ом ряду
set Rg = union(range("B1:B" & i-1), range(cells(i+1,2), cells(rows.count, "B"))) - надо обьединить все ячейки из колонки В до i-го ряда и после него.

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

Последний раз редактировалось IgorGO; 12.01.2011 в 14:57.
IgorGO вне форума Ответить с цитированием
Старый 12.01.2011, 16:07   #5
Parabellum
 
Регистрация: 12.01.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
...надеюсь, я смог все без очепяток написать
Уважаемый IgorGO, большое вам спасибо.

Уважаемый doober, переделал функцию в соответствии с вашим предложением. Считаю, что получилось лучше, чем было. Однако снова всплыла та же ошибка. При использовании функции в таблице и указании непосредственно нужных диапазонов (например, (A1:A701;B1:B701;C1)) - все отлично. Результаты правильные. Но при вызове функции из программы (не до конца ясен синтаксис) или использовании именованного диапазона (Peak) - опять та же ошибка. Перепробовал все известные методы. Похоже, что накосячил с синтаксисом вызова. Не могли бы вы посмотреть еще раз, так как желательно работать с заранее заданными именованными диапазонами?
Вложения
Тип файла: zip Book3.zip (30.1 Кб, 10 просмотров)
Parabellum вне форума Ответить с цитированием
Старый 12.01.2011, 16:46   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а что Вы вообще пытаетесь получить с этих данных?
Lint обьявлена как Function Lint(Rng) As Double
=Lint(Peak;RC[-2]) - вы ей передаете два параметра, уже на этой стадии функция не работает, потому что не нуждается в 2-м параметре

в коде обращение к областям диапазона, а диапазок Peak состоит только из одной области, так что даже при вызове =Lint(Peak) выполнение кода прекращается на второй строке
Set DRange = Rng.Areas
X = DRange(3)(1, 1)
в DRange - 1 область, обращение к DRange(3) - это обращение в никуда
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.01.2011, 22:40   #7
Parabellum
 
Регистрация: 12.01.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
а что Вы вообще пытаетесь получить с этих данных?
Спасибо за разъяснения. Однако я также пытался передать ей объединенный с помощью Union диапазон (насколько я понял, именно так это работает при вызове функции в таблице).

С самого начала (первое вложение) мне нужно было как-то обратиться к функции , используя именованный двумерный диапазон (Peak) и одну переменную, но функция Linterp использует два одномерных диапазона и одну переменную (Double). Насколько я понимаю синтаксис, обращение должно быть корректным во всех случаях (R, S, Q, U, T), однако работают только первые три (R, S, Q). Не могу понять почему не работают U и T. Когда присваиваю массивам RRX и RRY значения RRRX и RRRY - все в порядке. Но напрямую использовать их нельзя. Также нельзя использовать вот такую форму записи - (Peak.Columns(1), Peak.Columns(1), X). Я бы ограничился использованием RX и RY, однако в этом случае приходится строго указывать диапазон, но это не всегда возможно, так как неизвестна точная размерность массива входных данных.

Последний раз редактировалось Parabellum; 12.01.2011 в 22:44.
Parabellum вне форума Ответить с цитированием
Старый 12.01.2011, 23:14   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а можно без этих всех VBA терминов, человеческим или математическим языком обьяснить какая задача перед Вами стоит.
(мы, видимо, разговариваем на разных VBA диалектах, у Вас Оксфордский а уменя Жмеринский, вот и не понимаем друг друга). А когда говорим по-русски - вроде все нормально.
давайте продолжим по-русски.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.01.2011, 16:51   #9
Parabellum
 
Регистрация: 12.01.2011
Сообщений: 7
По умолчанию

Извините, пожалуйста, за неправильную терминологию. Постараюсь объяснить, что я хочу.

Есть функция (function) Linterp. Она выполняет кусочно-линейную интерполяцию. Работает с двумя колонками значений X0 и Y0, и ячейкой со значением X, для которого необходимо рассчитать Y. Для удобства работы создан диапазон, состоящий из двух колонок, который включает значения X0 и Y0, ему присвоено имя "Peak". Поскольку длина этого диапазона может изменяться (больше или меньше значений X0 и Y0), то хотелось бы использовать именно такой вариант. При использовании функции Linterp в подпрограмме (Sub) возникают трудности. Я считаю, что правильно указываю какие данные функции обрабатывать. Однако не все варианты приносят результат. Такие не работают:
  1. Y=Linterp(Peak.Columns(1), Peak.Columns(2), X)
  2. Y=Linterp(Peak.Columns(1).Value, Peak.Columns(2).Value, X)
  3. использование промежуточных диапазонов RRRX и RRRY не помогает:
    Set RRRX = Workbooks("Книга3.xlsm").Worksheets ("Лист1").Range("Peak").Columns( 1)
    Set RRRY = Workbooks("Книга3.xlsm").Worksheets ("Лист1").Range("Peak").Columns( 2)
    Y=Linterp(RRRX, RRRY, X)
Работает только вариант, когда я беру диапазон и указываю точный его размер (например, "P1:P701"). Когда я записываю в такие (четко заданные) диапазоны значения RRRX и RRRY (указанные выше), то все в порядке. Это действительно правильные значения.

Также уважаемый doober привел пример с использованием RNG. Насколько я понял из описания - это некая область произвольного размера, куда могут входить как целые столбцы и строки, так и отдельные ячейки. Использование функции Linterp, переписанной под Rng, в таблице работает прекрасно (=Lint((A1:A701;B1:B701;C18))). Но использование ее в подпрограмме (Sub) не работает. Вызываю я ее по разному, в том числе использую объединенный с помощью Union диапазон, состоящий из двух столбцов и одной ячейки.

Единственное, что могу предположить - неправильное обращение к функции (то есть неверное указание данных, с которыми функция должна работать) и в первом, и во втором случае.
Parabellum вне форума Ответить с цитированием
Старый 14.01.2011, 00:30   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

однако... извиняться не надо, надо по-русски написать, або українською - мені все рівно.
Пытался у Даля и Ожегова отыскать такие слова (перечисляю в порядке, в котором встретил в тексте): Linterp, Peak, Columns, Value, RRRX, RRRY, Set, Workbooks, Worksheets, Range. То ли Даль с Ожеговым русского не знали, то ли у меня смазка на лыжах неудачно подобрана...
вам интерполяция нужна?
если в колонке А значения х, а в к колонке В значения у, то без всяких формул и ВБА могу Вам сказать, что для любого х, у будет равно 0. там четкая и однозначная зависимость. Там интерполяция не нужна, достаточно здравого смысла.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при обращении эксель к ворду. RGZZ Microsoft Office Excel 0 16.06.2010 17:17
Ошибка при обращении к интернет странице Alter Свободное общение 2 06.08.2008 22:25
Связанные таблицы - проблема при обращении к полю БД nataly_ukr БД в Delphi 7 13.11.2007 10:47
Пропадает картинка на форме при обращении к цвету dimfil Общие вопросы Delphi 1 10.11.2007 11:58
не хавает русского шрифта из Delphi при обращении к БД Pitbull БД в Delphi 4 11.06.2007 09:57