Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Объекты в VBA (Excel)

Ответить
Настройки темы
VBA - Объекты в VBA (Excel)

Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Ввод элементов массива получился, но как найти остальное....
Код: Выделить весь код
Public Sub r()
Dim stl As Integer
Dim str As Integer
Dim i As Integer
Dim j As Integer
stl = InputBox("Введите количество столбцов")
str = InputBox("Введите количество строк")
For i = 1 To stl
For j = 1 To str
Sheets("Лист1").Cells(i, j) = InputBox("Введите" & j & "элемент" & i & "строки")
Next j
Next i
End Sub

Отправлено: 19:48, 21-02-2011

 

Старожил


Сообщения: 369
Благодарности: 49

Профиль | Отправить PM | Цитировать


Условие непонятное
Цитата:
Элементы массива задать самостоятельно через функцию Inputbox.
это значит надо самому заполнить все ячейки по строкам и столбцам.

Цитата:
нахождения в выделенном диапазоне рабочей таблицы максимального и минимального значения по строкам и по столбцам.
а это предусматривает поиск в уже заполненной таблице.

Если таблицу заполняешь сам значит заранее уже знаешь какое значение будет минимальным а какое максимальным

Отправлено: 21:11, 21-02-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата:
это значит надо самому заполнить все ячейки по строкам и столбцам.
Именно так нужно. Это уже у меня сделано в выше поставленной программе.

Далее, к примеру, из введённого массива 4х4 выделяется следующий диапазон:

1 2 3 4
5 6 7 8
2 6 9 4
0 3 5 1

И из этого находится минимальное и максимальное значение.

Отправлено: 22:25, 21-02-2011 | #3


Пользователь


Сообщения: 120
Благодарности: 22

Профиль | Цитировать


Цитата zena:
в выделенном диапазоне рабочей таблицы максимального и минимального значения по строкам и по столбцам »
и
Цитата zena:
выделяется следующий диапазон:
1 2 3 4
5 6 7 8
2 6 9 4
0 3 5 1
И из этого находится минимальное и максимальное значение »
из чего именно нужны Мин и Макс?
как в первом посте написано (мин и макс для каждой строки и каждого столбца)?
или как в третьем посте (мин и макс среди всех значений входящих в выделенный диапазон)?

если как в третьем тогда вот так (стоит учесть что макс и мин значения считаются только первые из найденных - если несколько одинаковых значений):

ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ

Код: Выделить весь код
Private Function fnNum2ColName(ByVal i As Long) As String
Dim k As Integer
    If i < 27 Then
        fnNum2ColName = IIf(i <= 0, "", Chr(i + 64))
    Else
        k = ((i - 1) \ 26)
        fnNum2ColName = fnNum2ColName(k) & fnNum2ColName(i - 26 * k)
    End If
End Function
Private Function fnGetColNameFromCellName(ByVal inp As String) As String
Dim res As String
Dim i As Long
    res = ""
    inp = UCase$(inp)
    For i = 1 To Len(inp)
        If 65 <= Asc(Mid(inp, i, 1)) And Asc(Mid(inp, i, 1)) <= 90 Then
            res = res & Mid(inp, i, 1)
        Else
            'Как только нашли первую не букву - завершаем
            Exit For
        End If
    Next i
    fnGetColNameFromCellName = res
End Function
Private Function fnGetRowNumberFromCellName(ByVal inp As String) As Long
Dim res As String
Dim i As Long
    res = ""
    inp = UCase$(inp)
    For i = 1 To Len(inp)
        If 65 <= Asc(Mid(inp, i, 1)) And Asc(Mid(inp, i, 1)) <= 90 Then
            'не обращаем внимания на буквы
        ElseIf 48 <= Asc(Mid(inp, i, 1)) <= 57 Then
            res = res & Mid(inp, i, 1)
        Else
            'Если недопустимый символ - выходим
            Exit For
        End If
    Next i
    fnGetRowNumberFromCellName = Val(res)
End Function
Private Function fnGetColNumberByColName(ByVal inp As String) As Long
Dim k As Integer
    inp = UCase$(inp)
    If Len(inp) <= 2 Then
        If Len(inp) = 1 Then
            fnGetColNumberByColName = (Asc(inp) - 64)
        ElseIf Len(inp) = 2 Then
            fnGetColNumberByColName = (Asc(Mid(inp, 1, 1)) - 64) * 26 + (Asc(Mid(inp, 2, 1)) - 64)
        Else 'Если нет входных данных
            fnGetColNumberByColName = 1
        End If
    Else 'Если число букв больше 2-ух (нетребовалось пока для большего)
        fnGetColNumberByColName = 26 ^ 3
    End If
End Function


СОБСТВЕННО ИНТЕРЕСУЮЩАЯ ВАС ФУНКЦИЯ

Код: Выделить весь код
Sub Main()
Dim addr() As String
Dim minRow As Long, maxRow As Long
Dim minCol As Long, maxCol As Long
Dim minColNam As String, maxColNam As String
Dim rn As Long, cn As Long
Dim minValue As Double, maxValue As Double
Dim minCellName As String, maxCellName As String
    addr = Split(Selection.Address(ReferenceStyle:=xlA1, ColumnAbsolute:=False, RowAbsolute:=False), ":")
    If UBound(addr) = 0 Then
        ReDim Preserve addr(1)
        addr(1) = addr(0)
    End If
    minColNam = fnGetColNameFromCellName(addr(0))
    maxColNam = fnGetColNameFromCellName(addr(UBound(addr)))
    'Определяем границы поиска мин и макс значения строки
    minRow = fnGetRowNumberFromCellName(addr(0))
    maxRow = fnGetRowNumberFromCellName(addr(UBound(addr)))
    'Определяем границы поиска мин и макс значения столбца
    minCol = fnGetColNumberByColName(minColNam)
    maxCol = fnGetColNumberByColName(maxColNam)
    'Задаем начальное значение мин и макс = первой выбранной ячейке
    minCellName = minColNam & minRow
    minValue = CDbl(Range(minCellName).Value & "")
    maxCellName = minCellName
    maxValue = CDbl(Range(maxCellName).Value & "")
    'Ищем мин и макс значения одновременно
    For rn = minRow To maxRow
        For cn = minCol To maxCol
            If CDbl(Range(fnNum2ColName(cn) & rn).Value & "") > maxValue Then
               maxCellName = fnNum2ColName(cn) & rn
               maxValue = CDbl(Range(maxCellName).Value & "")
            End If
            If CDbl(Range(fnNum2ColName(cn) & rn).Value & "") < minValue Then
               minCellName = fnNum2ColName(cn) & rn
               minValue = CDbl(Range(minCellName).Value & "")
            End If
        Next cn
    Next rn
    'Выводим результат в Immediate и MsgBox
    Debug.Print "Минимальное значение находится в ячейке: '" & minCellName & "' и равно: '" & Format$(minValue, "# ##0.00") & "'"
    Debug.Print "Максимальное значение находится в ячейке: '" & maxCellName & "' и равно: '" & Format$(maxValue, "# ##0.00") & "'"
    MsgBox "Минимальное значение находится в ячейке: '" & minCellName & "' и равно: '" & Format$(minValue, "# ##0.00") & "'" & vbNewLine & "Максимальное значение находится в ячейке: '" & maxCellName & "' и равно: '" & Format$(maxValue, "# ##0.00") & "'", vbInformation, "Результаты поиска минимума и максимума среди выбранных ячеек"
End Sub

Последний раз редактировалось KnRSU, 22-02-2011 в 11:39.


Отправлено: 11:08, 22-02-2011 | #4


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Немного не то...
1) Нужно с клавиатуры ввести элементы массива, задав количество строк и столбцов.
2) Далее, например, из введённого массива выделяем смостоятельно произвольный диапазон и для данного примера в соответствующие ячейки выводится ответ:
2 3 4 -5
мах 4 min 2
8 1 -5 -8
мах 10 min -5
0 5 4 7
мах 5 min 0
мах 8 мах 10 мах 4
min 0 min1 min-5

Последний раз редактировалось zena, 23-02-2011 в 19:29.


Отправлено: 15:35, 23-02-2011 | #5


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


как можно разбить код, чтобы выделение диапазона ячеек происходило после ввода массива?
Код: Выделить весь код
Sub m_1()
Dim myArray As Variant
Dim i As Long
Dim j As Long
Dim Max As Variant
Dim Min As Variant
Dim stl As Integer
Dim str As Integer
 stl = InputBox("Введите количество столбцов")
 str = InputBox("Введите количество строк")
 For i = 1 To stl
  For j = 1 To str
   Sheets("Лист1").Cells(i, j) = InputBox("Введите" & j & "элемент" & i & "строки")
 Next j
 Next i
myArray = Selection
For i = 1 To UBound(myArray, 1)
    Max = myArray(i, 1)
    Min = myArray(i, 1)
    For j = 1 To UBound(myArray, 2)
        If myArray(i, j) > Max Then
            Max = myArray(i, j)
        ElseIf myArray(i, j) < Min Then
            Min = myArray(i, j)
        End If
    Next j
    Cells(i, 10).Value = "max" & " " & Max & " " & "min" & " " & Min
Next i
End Sub

Отправлено: 23:06, 23-02-2011 | #6


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


zena, пару вопросов. В VBA не силен, поэтому спрашиваю.
Что это за строка? myArray = Selection
MyArray определен как Variant. А что такое Selection? Если тут ошибки нет, то идем дальше.
Что такое Ubound ? "For j = 1 To UBound(myArray, 2)"
Пока смутное и неясное подозрение на логику работы цикла поиска. Вроде все правильно, но что-то смущает.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 23:49, 23-02-2011 | #7


Пользователь


Сообщения: 120
Благодарности: 22

Профиль | Цитировать


lxa85, +1
Цитата zena:
Немного не то... »
в чем собственно не то ? как спросили - так и ответил, добавьте в главную функцию перед её началом, то что Вы сами писали про заполнение таблицы и все будет ОК


Цитата lxa85:
Что такое Ubound ? »
Ubound - функция возвращающяя размерность массива, в данном слечае третье изменение массива - что само по себе уже неверно
Цитата lxa85:
Что это за строка? myArray = Selection »
аналогичный вопрос, zena, зачем Вы в переменную myArray - записывает Объект Selection?

Отправлено: 15:14, 24-02-2011 | #8


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Подскажите пожалуйста как в Exel ввести функцию Xmin<=X<=Xmax

Отправлено: 16:59, 18-02-2012 | #9


Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


в справке excel есть пример
Код: Выделить весь код
=ЕСЛИ(И(1<=A3; A3<=100); A3; "Значение вне интервала.")

Отправлено: 20:36, 18-02-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Объекты в VBA (Excel)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - VBA Excel помогите решить Мария74 Программирование и базы данных 1 19-02-2011 12:58
Разное - Задача Excel VBA JON4 Microsoft Office (Word, Excel, Outlook и т.д.) 8 12-12-2010 18:40
2010 - НЕпечатаемые объекты [Word / Excel] shadowbat Microsoft Office (Word, Excel, Outlook и т.д.) 2 06-07-2010 08:37
VBA - VBA excel метод Холецкого romcd73 Программирование и базы данных 2 19-06-2009 10:03
VBA - VBA | Отправить почту из Excel rewerty Программирование и базы данных 4 25-04-2006 14:21




 
Переход