Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ByRef Argument type mismatch 
V
    Опции темы
Severyanin
Дата 28.4.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



привет всем. При нажатиина кнопку на форме выпадает ошибка, указанная в названии темы. не могу понять, в чем проблема, я не передаю в обработчик клика никаких аргументов, почему он пишет про несовпадения типа. Может, кто-то сталкивался с подобным? Код обработчика следующий:
Код

Private Sub CommandButton4_Click()
Application.Cursor = xlWait
Application.ReferenceStyle = xlR1C1
MsgBox "Вычисление байесовых категорий данных начато"
Dim AP1, AP2, AP3, AP4, KD1, KD2, KD3, KD4, T1, T2, T3, T4, Max As Single
Dim i, cat As Integer
Sheets("Лист").Cells(1, 41).Value = "Байесова категория"
Sheets("Ëèñò1").Cells(1, 42).Value = "Вероятность"
AP1 = GetAP(1)
AP2 = GetAP(2)
AP3 = GetAP(3)
AP4 = GetAP(4)
i = 2
While Sheets("Лист1").Cells(i, 32).Value <> ""
    T1 = GetDI(i, 1)
    T2 = GetDI(i, 2)
    T3 = GetDI(i, 3)
    T4 = GetDI(i, 4)
    K1 = (AP1 * T1) / (AP1 * T1 + AP2 * T2 + AP3 * T3 + AP4 * T4)
    K2 = (AP2 * T2) / (AP1 * T1 + AP2 * T2 + AP3 * T3 + AP4 * T4)
    K3 = (AP3 * T3) / (AP1 * T1 + AP2 * T2 + AP3 * T3 + AP4 * T4)
    K4 = (AP4 * T4) / (AP1 * T1 + AP2 * T2 + AP3 * T3 + AP4 * T4)
    If K1 > K2 Then
        Max = K1
    Else
        Max = K1
    End If
    If K3 > Max Then
        Max = K3
    End If
    If K4 > Max Then
        Max = K4
    End If
    Select Case Max
        Case K1
            cat = 1
        Case K2
            cat = 2
        Case K3
            cat = 3
        Case K4
            cat = 4
    End Select
    Sheets("Лист1").Cells(i, 41).Value = cat
    Sheets("Лист1").Cells(i, 42).Value = Max
    i = i + 1
Wend
MsgBox "Операция завершена"
Application.ReferenceStyle = xlA1
Application.Cursor = xlDefault
End Sub

 
Заранее спасибо


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Akina
Дата 28.4.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



И в какой именно строке ошибка? телепаты уже все в отпуске...

Добавлено через 1 минуту и 1 секунду
И где тексты функций GetAP() и GetDI()...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Severyanin
Дата 28.4.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Akina, ошибка при вызове процедуры, дебаггер показывает именно на строку Private Sub CommandButton4_Click().
Код функций:
Код

Private Function GetAP(cat As Integer) As Single
    Select Case cat
        Case 1
            GetAP = Sheets("Лист2").Cells(15, 1).Value
        Case 2
            GetAP = Sheets("Лист2").Cells(15, 3).Value
        Case 3
            GetAP = Sheets("Лист2").Cells(15, 5).Value
        Case 4
            GetAP = Sheets("Лист2").Cells(15, 7).Value
    End Select
End Function
Private Function GetDI(ColNum As Integer, cat As Integer) As Single
    Dim i, FullCnt, CatCntRte, CatCntRb, CatCntRgr, CatCntDuDi, CatCntC1Str, CatCntRbPlus, CatCntRgpPlus, CatCntDuDiPlus, CatCntRrast As Integer
    Dim TempRte, TempRb, TempRgr, TempDuDi, TempC1Str, TempRbPlus, TempRgrPlus, TempDuDiPlus, TempRrast As Single
    i = 2
    FullCnt = 0
    CatCntRte = 0
    CatCntRb = 0
    CatCntRgr = 0
    CatCntDuDi = 0
    CatCntC1Str = 0
    CatCntRbPlus = 0
    CatCntRgrPlus = 0
    CatCntDuDiPlus = 0
    CatCntRrast = 0
    While Sheets("Лист1").Cells(i, 33).Value <> ""
        If Sheets("Лист1").Cells(i, 33).Value = cat Then
            FullCnt = FullCnt + 1
            If Sheets("Лист1").Cells(i, 6).Value = Sheets("Лист1").Cells(ColNum, 6).Value Then
                CatCntRte = CatCntRte + 1
            End If
            If Sheets("Лист1").Cells(i, 11).Value = Sheets("Лист1").Cells(ColNum, 11).Value Then
                CatCntRb = CatCntRb + 1
            End If
            If Sheets("Лист1").Cells(i, 14).Value = Sheets("Лист1").Cells(ColNum, 14).Value Then
                CatCntRgr = CatCntRgr + 1
            End If
            If Sheets("Лист1").Cells(i, 15).Value = Sheets("Лист1").Cells(ColNum, 15).Value Then
                CatCntDuDi = CatCntDuDi + 1
            End If
            If Sheets("Лист1").Cells(i, 17).Value = Sheets("Лист1").Cells(ColNum, 17).Value Then
                CatCntC1Str = CatCntC1Str + 1
            End If
            If Sheets("Лист1").Cells(i, 22).Value = Sheets("Лист1").Cells(ColNum, 22).Value Then
                CatCntRbPlus = CatCntRbPlus + 1
            End If
            If Sheets("Лист1").Cells(i, 25).Value = Sheets("Лист1").Cells(ColNum, 25).Value Then
                CatCntRgrPlus = CatCntRgrPlus + 1
            End If
            If Sheets("Лист1").Cells(i, 26).Value = Sheets("Лист1").Cells(ColNum, 26).Value Then
                CatCntDuDiPlus = CatCntDuDiPlus + 1
            End If
            If Sheets("Лист1").Cells(i, 30).Value = Sheets("Лист1").Cells(ColNum, 30).Value Then
                CatCntRrast = CatCntRrast + 1
            End If
        End If
        i = i + 1
    Wend
    TempRte = CatCntRte / FullCnt
    TempRb = CatCntRb / FullCnt
    TempRgr = CatCntRgr / FullCnt
    TempDuDi = CatCntDuDi / FullCnt
    TempC1Str = CatCntC1Str / FullCnt
    TempRbPlus = CatCntRbPlus / FullCnt
    TempRgrPlus = CatCntRgrPlus / FullCnt
    TempDuDiPlus = CatCntDuDiPlus / FullCnt
    TempRrast = CatCntRrast / FullCnt
    GetDI = TempRte * TempRb * TempRgr * TempDuDi * TempC1Str * TempRbPlus * TempRgrPlus * TempDuDiPlus * TempRrast
End Function



--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Akina
Дата 28.4.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Severyanin @  28.4.2009,  10:14 Найти цитируемый пост)
ошибка при вызове процедуры, дебаггер показывает именно на строку Private Sub CommandButton4_Click().

Переименуйте процедуру из CommandButton4_Click во что-нить нейтральное (скажем CB4Click). Затем сверху слева в селекторе контролов выберите CommandButton4, справа выберите Click (впрочем, он должен выбраться сам). Посмотрите, как выглядит заголовок процедуры. И сделайте ИМЕННО ТАК - с точностью до запятой (или просто переместите текст из своей переименованной процедуры в свежесозданный шаблон).

Цитата

Код

Dim AP1, AP2, AP3, AP4, KD1, KD2, KD3, KD4, T1, T2, T3, T4, Max As Single
Dim i, cat As Integer

Вы в курсе, что Max имеет тип Single, cat - тип Integer, а все остальные переменные - тип Variant?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Severyanin
Дата 28.4.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Akina, То есть, для точного соответствия типов мне нужно объявлять тип отдельно для каждой переменной? В справке по VBA было сказано, что такое объявление через запятую корректно

Добавлено через 6 минут и 24 секунды
Akina, я так и сделал, потом помимо этого кинул новую кнопку и еще раз скопировал код туда. Не помогло. Где-то проблема, видимо, внутри процедуры. Потому что когда я копирую код в работающий обработчик, который делаетчто-то другое, фокус повторяется



--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Akina
Дата 28.4.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Так... Тогда давайте ПОЛНЫЙ текст всего модуля. А лучше всех модулей - и форм, и классов, и общих. Сохраните их отдельными файлами, зазипуйте и приложите к постингу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Severyanin
Дата 28.4.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Хорошо. Вот код всех обработчиков формы и кнопок. Спасибо за потраченное время.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  code.zip 3,36 Kb


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Akina
Дата 28.4.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Severyanin @  28.4.2009,  10:14 Найти цитируемый пост)
ошибка при вызове процедуры, дебаггер показывает именно на строку Private Sub CommandButton4_Click().

Я не знаю, чем ты смотришь - но явно не глазами.

Да, при возникновении ошибки строка Private Sub CommandButton4_Click() подсвечена жёлтым - т.е. исполнение прерывается именно на этой строке. Однако курсор в этото момент установлен на строку T1 = GetDI(i, 1), а если более точно - то выделена переменная i. Именно она вызывает несовпадение типов.

Я тебе уже выше говорил, что переменные следует объявлять ПРАВИЛЬНО. Описание функции - Private Function GetDI(ColNum As Integer, cat As Integer) As Single, т.е. оба аргумента должны быть типа Integer. Определена же переменная i в строке Dim i, cat As Integer, то есть имеет тип Variant.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Severyanin
Дата 29.4.2009, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Хм, прост в первый раз сталкиваюсь с языком, в котором переменные одного типа нельзя определить как группу. Спасибо, проблема решена


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.