|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.01.2011, 03:22 | #1 |
Регистрация: 12.01.2011
Сообщений: 7
|
Указание диапазонов при обращении к функции
Есть определенная функция Linterp. Из подпрограммы Middle (отдельный модуль) происходит вызов этой функции. Функция использует данные типа Range в виде одномерных массивов-столбцов. Однако работают не все способы указания диапазонов. Почему - непонятно. Те, которые работают, являются для меня не оптимальными (приходится создавать временные диапазоны, необходимо знать точное количество ячеек,и так далее). Однако в одном из неработающих способов (RRRX и RRRY) другим диапазонам (RRX и RRY) можно присвоить значения, которые совпадают с необходимыми для обработки функцией. В связи с этой проблемой также возникли вопросы - можно ли как-то задать (средствами VBA) диапазон (Range), включающий в себя все ячейки, кроме первой (или заранее определенной)? Как нужно правильно указывать на определенную колонку или ряд диапазона (что-то вида ИмяДиапазона(*,номер_столбца), где * - все ряды)? Возможно ли использование таких методов задания диапазонов при работе с функцией?
Последний раз редактировалось Parabellum; 12.01.2011 в 03:25. |
12.01.2011, 11:08 | #2 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
Возможно мой вариант вам немного поможет
Анализ,обработка данных Недорого
|
12.01.2011, 13:49 | #3 |
Регистрация: 12.01.2011
Сообщений: 7
|
Спасибо. Интересный вариант. Изучаю. Жаль, что в VBA нет более простых методов.
|
12.01.2011, 14:20 | #4 | |||
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
Цитата:
Цитата:
Цитата:
set Rg = union(range("B1:B" & i-1), range(cells(i+1,2), cells(rows.count, "B"))) - надо обьединить все ячейки из колонки В до i-го ряда и после него. ...надеюсь, я смог все без очепяток написать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
Последний раз редактировалось IgorGO; 12.01.2011 в 14:57. |
|||
12.01.2011, 16:07 | #5 |
Регистрация: 12.01.2011
Сообщений: 7
|
Уважаемый IgorGO, большое вам спасибо.
Уважаемый doober, переделал функцию в соответствии с вашим предложением. Считаю, что получилось лучше, чем было. Однако снова всплыла та же ошибка. При использовании функции в таблице и указании непосредственно нужных диапазонов (например, (A1:A701;B1:B701;C1)) - все отлично. Результаты правильные. Но при вызове функции из программы (не до конца ясен синтаксис) или использовании именованного диапазона (Peak) - опять та же ошибка. Перепробовал все известные методы. Похоже, что накосячил с синтаксисом вызова. Не могли бы вы посмотреть еще раз, так как желательно работать с заранее заданными именованными диапазонами? |
12.01.2011, 16:46 | #6 |
Новичок
СтарожилДжуниор
Регистрация: 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) - это обращение в никуда
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
12.01.2011, 22:40 | #7 |
Регистрация: 12.01.2011
Сообщений: 7
|
Спасибо за разъяснения. Однако я также пытался передать ей объединенный с помощью 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. |
12.01.2011, 23:14 | #8 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
а можно без этих всех VBA терминов, человеческим или математическим языком обьяснить какая задача перед Вами стоит.
(мы, видимо, разговариваем на разных VBA диалектах, у Вас Оксфордский а уменя Жмеринский, вот и не понимаем друг друга). А когда говорим по-русски - вроде все нормально. давайте продолжим по-русски.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
13.01.2011, 16:51 | #9 |
Регистрация: 12.01.2011
Сообщений: 7
|
Извините, пожалуйста, за неправильную терминологию. Постараюсь объяснить, что я хочу.
Есть функция (function) Linterp. Она выполняет кусочно-линейную интерполяцию. Работает с двумя колонками значений X0 и Y0, и ячейкой со значением X, для которого необходимо рассчитать Y. Для удобства работы создан диапазон, состоящий из двух колонок, который включает значения X0 и Y0, ему присвоено имя "Peak". Поскольку длина этого диапазона может изменяться (больше или меньше значений X0 и Y0), то хотелось бы использовать именно такой вариант. При использовании функции Linterp в подпрограмме (Sub) возникают трудности. Я считаю, что правильно указываю какие данные функции обрабатывать. Однако не все варианты приносят результат. Такие не работают:
Также уважаемый doober привел пример с использованием RNG. Насколько я понял из описания - это некая область произвольного размера, куда могут входить как целые столбцы и строки, так и отдельные ячейки. Использование функции Linterp, переписанной под Rng, в таблице работает прекрасно (=Lint((A1:A701;B1:B701;C18))). Но использование ее в подпрограмме (Sub) не работает. Вызываю я ее по разному, в том числе использую объединенный с помощью Union диапазон, состоящий из двух столбцов и одной ячейки. Единственное, что могу предположить - неправильное обращение к функции (то есть неверное указание данных, с которыми функция должна работать) и в первом, и во втором случае. |
14.01.2011, 00:30 | #10 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
однако... извиняться не надо, надо по-русски написать, або українською - мені все рівно.
Пытался у Даля и Ожегова отыскать такие слова (перечисляю в порядке, в котором встретил в тексте): Linterp, Peak, Columns, Value, RRRX, RRRY, Set, Workbooks, Worksheets, Range. То ли Даль с Ожеговым русского не знали, то ли у меня смазка на лыжах неудачно подобрана... вам интерполяция нужна? если в колонке А значения х, а в к колонке В значения у, то без всяких формул и ВБА могу Вам сказать, что для любого х, у будет равно 0. там четкая и однозначная зависимость. Там интерполяция не нужна, достаточно здравого смысла.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема при обращении эксель к ворду. | 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 |