Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/45: Рейтинг темы: голосов - 45, средняя оценка - 4.78
Dimitriy

Помогите пожалуйста найти ошибку

01.04.2007, 16:13. Показов 9090. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Помогите, пожалуйста, найти ошибку!

Нужно чтобы функция обрабатывала выбранный массив чисел и выводила первое встретившееся положительное число. Если таких чисел в выбранном массиве нет, то она присваивает значение 0 и выводит MsgBox!

Написанная ниже функция не выводит MsgBox и при поиске в заданном массиве положительного числа не найдя его ищет по всему листу.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function qwe(theArray As Variant) As Single
        Dim j As Integer, val As Single, n As Integer
        n = theArray.Columns.Count
        m = theArray.Rows.Count
        Do
        i = i + 1
          For j = 1 To n
           If j > n And i > m Then
              MsgBox "Такого числа в массиве данных нет"
              val = 0
              Exit For
              Exit For
              ElseIf theArray(i, j) > 0 Then
              val = theArray(i, j)
                  Exit For
           End If
             Next j
                     Loop Until i > m Or val > 0
             qwe = val
    End Function
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2007, 16:13
Ответы с готовыми решениями:

Помогите найти ошибку
делаю тест в vba excel. не срабатывает программа, не могу понять, в чем проблема. прикрепила фотку. если нужно, скину всё, что писала

Помогите найти ошибку, почему программа не может выдать Smax?
Помогите найти ошибку, почему программа не может выдать Smax? Причем S1, S2 она выводит, а на Smax замолкает. P(i)- рандомный массив. Как...

Программа, запрашивающая дату рождения пользователя и выводящая поздравление - помогите найти ошибку
Sub hj() Dim a As Date Dim b As Date Dim k As Double Dim b1 As Double Dim X As Double Dim Y As Double a = Date b =...

35
Dimitriy
02.04.2007, 19:10
Студворк — интернет-сервис помощи студентам
Спасибо)
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
03.04.2007, 15:18
Ты упоминал лист, может это задача для Exel? Тогда лучше использовать не массив а диапазон. Может этот пример пользовательской функции подойдет?
Visual Basic
1
2
3
4
5
6
7
8
9
10
Function qwe(rng As Range) As Single
   For Each c In rng
      If c > 0 Then
         qwe = c.Value
         Exit Function
      End If
   Next c
   MsgBox "Такого числа в массиве данных нет"
   qwe = 0
End Function
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
03.04.2007, 18:09
Да, интересное решение.
Но ему нужна такая функция, которая бы не выводила сразу сообщение "Такого числа в массиве данных нет", когда активируешь её через меню Вставка - Функции - Определённые пользователем.... А ваша функция тоже выводит это сообщение, если первое число в диапазоне отрицательное
0
Dimitriy
03.04.2007, 18:41
А может что-то вроде проверки написать... но этот вариант не работает(оч много ошибок)... у меня от этой функции уже голова кругом... 4-ую неделю не могу сдать(
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function qwe(theArray As Variant) As Single
Dim val!, iCol%, j%, iRow&, i&
iCol = theArray.Columns.Count
iRow = theArray.Rows.Count
    For i = 1 To iRow 'по рядам
        For j = 1 To iCol 'по столбцам
            If theArray(i, j) > 0 Then
                val = theArray(i, j)
                Exit For
            End If
        Next j
        If val > 0 Then Exit For
    Next i
   If val = 0 Then MsgBox "Положительных чисел в массиве нет!"
    qwe = val
End Function
 
Sub proverka()
'Dim j As Long, InRange() As Variant, val As Single
'ActiveWorkbook.Worksheets("Лист1").Range("A1").CurrentRegion.Cells = Format(qwe(InRange(), "#,0"))
End Sub
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
04.04.2007, 11:06
Теперь до меня дошло, я тоже сумел получить эту проблему. У меня некорректное сообщение возникает только первый раз, сразу после написания функции и ее первого использования. Потом все работает нормально, даже если на листе стереть и начать заново. После выхода из Экселя и нового запуска тоже все нормально. У меня офисс 2000.
Может для сдачи преподавателю этого достаточно?
(проверьте у себя пример)
0
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
04.04.2007, 14:08
DMITRIY, уточни задачу.
Функцию обязательно вставлять через меню? Или можно просто набить руками =qwe, тогда проблем нет да и быстрее получится.
0
Dimitriy
04.04.2007, 15:10
Gacol

Спасибо) В этом примере можно выделять массив начинающийся с отрицательного числа, но если все числа отрицательные MsgBox не появляется.

И функцию обязательно вставлять через меню.
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
04.04.2007, 18:29
А можно на листе немного кода написать?
Вот примерчик, все вроде работает. Я MsgBox вынес на Лист1 в обработку события изменения ячеек.
0
Dimitriy
04.04.2007, 18:34
Gacol огромное Вам спасибо!!!)))) Все работает))))
Dimitriy
04.04.2007, 18:53
Gacol, еще один вопросик, в Вашем примере можно сделать так чтобы функция воспринимала буквы в массиве, и скажем при условии искала первую встретившуюся букву?)
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
04.04.2007, 18:53
Можно обойтись и одной пользовательской функцией, если передавать не диапазон(RANGE), а строку описание диапазона, например "A1:B5"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function qwe(xrng As Variant) As Single
   If TypeName(xrng) <> "String" Then
      MsgBox "Неверный аргумент. Должна быть строка."
   End If
   For Each c In ActiveSheet.Range(xrng)
      If c > 0 Then
         qwe = c.Value
         Exit Function
      End If
   Next c
   MsgBox "Такого числа в массиве данных нет"
   qwe = 0
End Function
0
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
04.04.2007, 19:09
Если правильно понял, надо найти элемент/ячейку, где впервые встречается буква или сообщить, что их нет в диапазоне?
тогда надо заменить соответствующий кусок кода на
Visual Basic
1
2
3
4
5
6
7
8
   For Each c In ActiveSheet.Range(rng)
      If Not IsNumeric(c.Text) Then
         qwe = c.Text
         Exit Function
      End If
   Next c
   MsgBox "Текста нет"
   qwe = "***"
0
Dimitriy
04.04.2007, 19:48
Можнообойтисьи одной пользовательской функцией, если передавать не диапазон(RANGE), а строку описание диапазона, например "A1:B5"
это почему-то не работает...

можно в предыдущей функции qwe-2 найти букву?
Dimitriy
05.04.2007, 02:58
Модуль я понимаю должен быть такой
Visual Basic
1
2
3
4
5
6
7
8
9
Function qwe(rng As Range) As Single
   For Each c In rng
      If Not IsNumeric(c.Text) Then
         qwe = c.Text
         Exit Function
      End If
   Next c
   qwe = "***"
End Function
А вот лист1 ...?
Visual Basic
1
2
3
4
5
6
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   If IsEmpty(Target.Formula) Then Exit Sub
   'If InStr(Target.Formula, "qwe") Then
      If Not IsNumeric(Target.Text) Then MsgBox "Текста нет"
   End If
End Sub
1 / 1 / 0
Регистрация: 03.07.2009
Сообщений: 112
05.04.2007, 10:44
Вот оба варианта для букв.
0
Dimitriy
05.04.2007, 21:16
Спасибо Gacol!!!)))
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2007, 21:16

Народ помогите найти ошибку в коде, почему он не работает я в этом профан просто
Так что ты колотишся так рано? Времени ещё вагон!!!

В первой строке символов оставить только те, которых нет во второй (помогите найти ошибку)
Даны две строки символов. В первой строке оставить только те, которых нет во второй. Dim s As String Dim t, r As String Dim i, j As...

Как обойти ошибку ADODC? Помогите пожалуйста
Имеется простое приложение из одной формы, чтобы посмотреть в DataGrid одну табличку в базе Access. Если в design-mode устанавливать в...

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

Помогите найти ошибку в коде.
Option Compare Text Option Explicit Private Declare Function EbExecuteLine Lib 'vba6.dll' _(ByVal pc As Long, ByVal f1 As Long,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru