Страницы: 1 2 След.
RSS
VBA пример функции минимум
 
Добрый вечер! Я начал изучать VBA, и столкнулся с рядом проблем. Поэтому обращаюсь к вам с просьбой помочь мне разобраться.  
Я хочу получить функцию Минимум из диапазона ячеек, которые можно указать с помощью открывающегося окна 1)с помощью циклов, и 2)с помощью функции min.  
Также не  могу понять что нужно писать в inputBox.  
 
Заранее багодарю за помощь:)
 
Примените метод InputBox    
объекта Application с параметром Type:=8
 
Я использую функцию рабочего листа:  
MsgBox Application.WorksheetFunction.Min(Range("A1:A10"))  
А что нужно писать в InputBox - Вам решать. Посмотрите справку
 
{quote}{login=Юрий М}{date=27.03.2011 10:59}{thema=}{post}Я использую функцию рабочего листа:  
MsgBox Application.WorksheetFunction.Min(Range("A1:A10"))  
А что нужно писать в InputBox - Вам решать. Посмотрите справку{/post}{/quote}  
да, так работает, но я хочу что-то типа вот так:  
function min()  
Dim x As Variantx = InputBox("Ââåäèòå äèàïàçîí ÿ÷ååê", "Ââîä äèàïàçîíà", "D2:D25")  
ActiveCell = Application.WorksheetFunction.min(Range(x))  
End Funktion  
 
Только хочу еще с циклом вариант и как то странно оно работает - в рабочей книге нормально, а применительно к другим відает ошибку...
 
Копируйте код при раскладке клавиатуры RU
 
Function min1()  
Dim x As Variant  
x = InputBox("Ââåäèòå äèàïàçîí ÿ÷ååê", "Ââîä äèàïàçîíà", "D2:D25")  
ActiveCell = Application.WorksheetFunction.min(Range(x))  
End Function
 
Переменную х следует объявить as Range
 
Если с первого раза непонятно: Копируйте код при раскладке клавиатуры RU
 
Function min1()  
Dim x As Variant  
x = InputBox("Введите диапазон ячеек", "Ввод диапазона", "D2:D25")  
ActiveCell = Application.WorksheetFunction.min(Range(x))  
End Function
 
Sub www()  
Dim x As Range  
Set x = Application.InputBox(Prompt:="Выделяем мыхой диапазон ячеек", Title:="Выбираем диапазон", Type:=8)  
MsgBox Application.WorksheetFunction.Min(x)  
End Sub
 
{quote}{login=Юрий М}{date=28.03.2011 12:15}{thema=}{post}Sub www()  
Dim x As Range  
Set x = Application.InputBox(Prompt:="Выделяем мыхой диапазон ячеек", Title:="Выбираем диапазон", Type:=8)  
MsgBox Application.WorksheetFunction.Min(x)  
End Sub{/post}{/quote}  
 
А зачем добавлять слова Promt и title?
 
Чтобы было :-) Можете удалить, оставив только текст в кавычках. Проблема только с этим?
 
Люди!  
Если у вас в таблицах есть условное форматирование с формулами, не юзайте Application.InputBox(... Type:=8) !  
Глючит, зараза, если пытаешься указать диапазон на другом листе или в другой книге! На том же листе, вроде работает.  
Код с ним, конечно, упрощается. Но макросы получаются не всегда и не во всех книгах/листах работающими.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=28.03.2011 08:24}{thema=}{post}Люди!  
Если у вас в таблицах есть условное форматирование с формулами, не юзайте Application.InputBox(... Type:=8) !  
Глючит, зараза, если пытаешься указать диапазон на другом листе или в другой книге! На том же листе, вроде работает.  
Код с ним, конечно, упрощается. Но макросы получаются не всегда и не во всех книгах/листах работающими.{/post}{/quote}  
.
 
Property Get в обычном модуле (не в модуле класса)?!  
В чем отличие от Function - просветите, пожалуйста.  
Заменил на Function - работает так же (2007).
 
Неизвестный мастер!  
Я же предупреждал об Application.InputBox(... Type:=8), а в вашем примере это не используется. А предложена его полноценная замена.  
Ваше решение очень интересное тем, что не требует юзерформы с рефэдитом, которой мне пришлось заменить Application.InputBox(... Type:=8) во всех своих макросах, где требовался ввод диапазона мышкой с листа.  
Ща обследую хорошенько ваш метод "во всех позах" и если пройдёт, начну перелопачивать свои макросы.  
Спасибо.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Казанский}{date=28.03.2011 02:45}{thema=}{post}Property Get в обычном модуле (не в модуле класса)?!  
В чем отличие от Function - просветите, пожалуйста.  
Заменил на Function - работает так же (2007).{/post}{/quote}  
Property Get - это именно функция, в том смысле, что returns только значение.  
Function - шизофренична:  
1. Может работать как Sub - не возвращая ничего.  
2. [Public] в стандартном не Option Private Module'е - становится функцией рабочего листа,
а в данном случае оно Вам надо ? Попробуйте (по ошибке) ввести её в ячейку.
 
Поправка:  
... в том смысле, что returns ВСЕГДА (но не только) значение.
 
> 1. Может работать как Sub - не возвращая ничего  
По-моему, это удобно. Например, функция сообщает результат работы как true/false - успешно/неуспешно. Хотим - анализируем, хотим - нет.  
 
> 2. [Public] в стандартном не Option Private Module'е - становится функцией рабочего листа, а в данном случае оно Вам надо ? Попробуйте (по ошибке) ввести её в ячейку.
 
Попробовал. Оказывается, Application.InputBox и простой InputBox можно вызывать из функции рабочего листа! Интересная фича - если поставить application.volatile, то будет запрашивать юзера при каждом пересчете. Что-то вроде поля ASK в Word.
 
1. А я не говорил, что это неудобно, а только двойственности (даже тройственности) её поведения.  
2."Попробовал..." - здесь я не уловил Вашу интонацию: обрадавались или огорчились ?  
{quote}{login=Казанский}{date=28.03.2011 02:45}{thema=}{post}  
Заменил на Function - работает так же (2007).{/post}{/quote}  
(разговор о замене 'Property Get RangeInputBox' на 'Function RangeInputBox')
 
{quote}{login=}{date=28.03.2011 01:11}{thema=}{post}{quote}{login=Alex_ST}{date=28.03.2011 08:24}{thema=}{post}Люди!  
Если у вас в таблицах есть условное форматирование с формулами, не юзайте Application.InputBox(... Type:=8) !  
Глючит, зараза, если пытаешься указать диапазон на другом листе или в другой книге! На том же листе, вроде работает.  
Код с ним, конечно, упрощается. Но макросы получаются не всегда и не во всех книгах/листах работающими.{/post}{/quote}  
.{/post}{/quote}  
Не работает:(    
Метод Юрия работает:)У меня еще вопрос, можно ли записать макрос через цикл?
 
"Макрос через цикл" всегда можно :-) Если объясните - что это такое.
 
Это вероятно так - сперва задаём переменной заведомо большое значение, затем в цикле сравниваем с значением текущей ячейки и меняем на текущее, если оно меньше.
 
:-) Не - загоняем всё в массив, циклом перебираем (не знаю зачем). Делаем сортировку, выгружаем во второй массив, из него на лист - что сверху - минимальное.
 
{quote}{login=Юрий М}{date=28.03.2011 10:33}{thema=}{post}:-) Не - загоняем всё в массив, циклом перебираем (не знаю зачем). Делаем сортировку, выгружаем во второй массив, из него на лист - что сверху - минимальное.{/post}{/quote}  
Спасибо:) Вопрос снимаю - на самом деле просто пытаюсь разобраться в языке, т.к. профессия обязывает. А идея "сортировка и верхнее значение скопировать" мне понравилась:)))
 
Набрался наглости и подсократил и переделал для себя в функцию(чтобы было понятнее и проще встраивать в код) творение неизвестного мастера (а не Z ли это маскируется?).  
Теперь надо в своих макросах юзерформ с рефэдитом, вызываемые вместо глючного Application.InputBox(... Type:=8), на этот код менять.  
Function RangeInputBox(Optional Prompt$ = "Выделите на листе диапазон", Optional Title$ = "Ввод диапазона") As Range  
  Dim sFormula$: sFormula = Application.InputBox(Prompt:=Prompt, Title:=Title, Default:="=" & Selection.Address, Type:=0)  
  On Error Resume Next  
  Set RangeInputBox = Range(Trim(Mid(Application.ConvertFormula(sFormula, xlR1C1, xlA1, True), 2)))  
  On Error GoTo 0  
End Function
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алексей, несколькими постами выше я пытался убедить Вашего тёзку (Казанского), что не надо  
переделывать Свойство_Get в Function.  
Get без своего близнеца Let (Set) - это обычная поцедура-функция.  
А Function автоматом появляется в списке UDF мастера функций - зачем она там ?  
Function RangeInputBox(), внутри себя содержащая Application.InputBox или VBA.InputBox, ВЫЗЫВАЕМАЯ из МАКРОСА, работает как добропорядочная процедура.  
Но как ФУНКЦИЯ РАБОЧЕГО ЛИСТА - это монстр, "чужой", ужас голливудский.
 
{quote}{login=Alex_ST}{date=29.03.2011 10:02}{thema=}{post}... а не Z ли это маскируется?)...{/post}{/quote}  
Вот это комплименты!..  Alex_ST! Неужели нюх подводит?! Кто у нас иногда  ИнкогНиТо на таком уровне способен "хулиганить"?.. Не подсказываю...  
ps А сам я выше рекордера не поднимаюсь ;( , к сожалению... Простите за off...
 
МногимиУважаемыеПланетяне, вы считаете приличным говорить между собой о  
незнакомом вам человеке в его присутствии ?
 
{quote}{login=Неизвестный афтор}{date=29.03.2011 01:24}{thema=}{post}МногимиУважаемыеПланетяне, вы считаете приличным говорить между собой о  
незнакомом вам человеке в его присутствии ?{/post}{/quote}{quote}{login=Неизвестный афтор}{date=29.03.2011 01:24}{thema=}{post}МногимиУважаемыеПланетяне, вы считаете приличным говорить между собой о  
незнакомом вам человеке в его присутствии ?{/post}{/quote}  
А Вы перестаньте быть неизвестным :)  
Когда я увидел Ваше сообщение от 28.03.2011 13:11, то сначала подумал, что это Алексей выложил файл в подтверждение того, что Application.InputBox(... Type:=8) глючит при использовании УФ, и довольно долго пытался получить ошибку. Если бы Вы представились, сразу бы стало понятно, что назначение файла другое.  
 
Анонимность уместна для форумов, чье содержание подобно надписям на стенах туалета, типа demotivation. А здесь лучше иметь ник, ИМХО.
Страницы: 1 2 След.
Наверх