Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование ( Sub) в пользовательскую функцию . / 15 сообщений из 15, страница 1 из 1
27.06.2017, 09:35
    #39478178
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
Есть программа (Sub) , работающая хорошо . Хочу преобразовать ее в пользовательскую функцию , выдает ошибку #ЗНАЧ!

Это код ,работающей программы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Sub а33условие5()
'для п/пр
Dim k, n As Integer
Dim parRange As Range

Set parRange = Range("V34:V99")
k = 0
n = 0
For Each Cell In parRange.Rows

If Cell.Offset(0, 1).Value = 1 And k = -1 Then
n = n - 1
End If

If Cell.Value = 1 And k = -1 Then
n = n + 1
End If

If Cell.Value = 1 Then
k = k + 1
   If k = 2 Then
        k = -1
        
   End If
End If
  If Cell.Value = 2 Or Cell.Value = 3 Then
  k = 0
  End If


Next Cell
MsgBox n
    
End Sub



Это код пользовательской функции
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Function ТридцатьТРи(Diapozon As Integer)
'для п/пр
Dim k, n As Integer
Dim parRange As Range

Set parRange = Range("Diapozon")
k = 0
n = 0
For Each Cell In parRange.Rows

If Cell.Offset(0, 1).Value = 1 And k = -1 Then
n = n - 1
End If

If Cell.Value = 1 And k = -1 Then
n = n + 1
End If

If Cell.Value = 1 Then
k = k + 1
   If k = 2 Then
        k = -1
        
   End If
End If
  If Cell.Value = 2 Or Cell.Value = 3 Then
  k = 0
  End If


Next Cell

 ТридцатьТРи = n
 
End Function
...
Рейтинг: 0 / 0
27.06.2017, 09:45
    #39478190
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
Навскидку - параметр функции Diapozon нигде в функции не используется
...
Рейтинг: 0 / 0
27.06.2017, 10:18
    #39478221
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
maxim863,

Возможно так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Function ThirtyThreeFunc(parRange As Range) As Integer

Dim k As Integer
Dim n As Integer
Dim cell As Range

For Each cell In parRange.Rows
    If cell.Offset(0, 1).Value = 1 And k = -1 Then
        n = n - 1
    End If
    If cell.Value = 1 And k = -1 Then
        n = n + 1
    End If
    If cell.Value = 1 Then
        k = k + 1
        If k = 2 Then
            k = -1
        End If
    End If
    If cell.Value = 2 Or cell.Value = 3 Then
        k = 0
    End If
Next

ThirtyThreeFunc = n
    
End Function



Рекомендую пользоваться Option Explicit.
Dim k, n As Integer - переменная k будет типа Variant.
...
Рейтинг: 0 / 0
27.06.2017, 10:20
    #39478225
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
Shocker.Pro,
Так и есть , спасибо !
...
Рейтинг: 0 / 0
27.06.2017, 10:36
    #39478238
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
Есть еще один минимальный вопрос : написан код пользовательской функции , все работает ,сохраняю закрываю , потом опять открываю файл , но не могу найти макроса (куда-то исчез ) . Не подскажите где его искать ?
...
Рейтинг: 0 / 0
27.06.2017, 10:39
    #39478243
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
maxim863Есть еще один минимальный вопрос : написан код пользовательской функции , все работает ,сохраняю закрываю , потом опять открываю файл , но не могу найти макроса (куда-то исчез ) . Не подскажите где его искать ?

Проверьте, что сохраняете в книге с включенными макросами, расширение файла должно быть .xlsm.
...
Рейтинг: 0 / 0
27.06.2017, 10:41
    #39478244
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
iMrTidy, расширение xlsm (но код все равно пропал куда-то)
...
Рейтинг: 0 / 0
27.06.2017, 11:43
    #39478317
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
потому что нельзя-я-я
потому что нельзя-я-я.
Потому что нельзя использовать в функции обращение к диапазону и при этом вызывать эту функцию с листа.
Все диапазоны в функцию должны передаваться через аргумент.

Функция не может быть зависима от значений в других ячейках листа.
...
Рейтинг: 0 / 0
27.06.2017, 11:45
    #39478320
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
вместо
Код: vbnet
1.
2.
3.
4.
5.
6.
Sub а33условие5()
'для п/пр
Dim k, n As Integer
Dim parRange As Range

Set parRange = Range("V34:V99")


пиши
Код: vbnet
1.
2.
3.
function а33условие5(Range parRange)
'для п/пр
Dim k, n As Integer


и вызывай её с листа
=а33условие5(V34:V99)
...
Рейтинг: 0 / 0
27.06.2017, 11:46
    #39478325
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
и ещё одно.
Ты в курсе, что после этого объявления
maxim863
Код: vbnet
1.
Dim k, n As Integer


ты получаешь переменную k типа Variant и переменную n типа integer?
а чтобы обе integer были, писать надо:
Код: vbnet
1.
Dim k as integer, n As Integer


или, ещё лучше
Код: vbnet
1.
2.
Dim k as integer
Dim n As Integer
...
Рейтинг: 0 / 0
27.06.2017, 12:03
    #39478343
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
Charles Weylandпотому что нельзя-я-я
потому что нельзя-я-я.
Потому что нельзя использовать в функции обращение к диапазону и при этом вызывать эту функцию с листа.
Все диапазоны в функцию должны передаваться через аргумент.

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

Может быть Вы не совсем правы? Вот такая функция работает и сохраняется без проблем:

Код: vbnet
1.
2.
3.
4.
5.
Function MyTestFunc() As Variant

MyTestFunc = Range("B1").Value2

End Function
...
Рейтинг: 0 / 0
27.06.2017, 12:04
    #39478344
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
maxim863iMrTidy, расширение xlsm (но код все равно пропал куда-то)

Было бы здорово взглянуть на Ваш файл-пример.

А Вы случайно не в шаблон сохраняете?
...
Рейтинг: 0 / 0
27.06.2017, 14:03
    #39478460
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
iMrTidy,
...
Рейтинг: 0 / 0
27.06.2017, 14:14
    #39478470
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
maxim863,

Макрос Ваш на месте, т.е. в Module1. Если у Вас открыто много файлов Excel, то возможно, что Вы ищите не в той книге?
...
Рейтинг: 0 / 0
27.06.2017, 14:20
    #39478478
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование ( Sub) в пользовательскую функцию .
iMrTidy, А ведь и вправду на месте ))) Спасибо !
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование ( Sub) в пользовательскую функцию . / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]