Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > ByRef Argument type mismatch


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

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

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

Автор: Akina 28.4.2009, 08:51
И в какой именно строке ошибка? телепаты уже все в отпуске...

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

Автор: Severyanin 28.4.2009, 09:14
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

Автор: Akina 28.4.2009, 10:47
Цитата(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?

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

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

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

Автор: Severyanin 28.4.2009, 12:05
Хорошо. Вот код всех обработчиков формы и кнопок. Спасибо за потраченное время.

Автор: Akina 28.4.2009, 14:49
Цитата(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.


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)