Ошибка типа данных VBA - неправильный синтаксис? - PullRequest
0 голосов
/ 11 сентября 2009

Надеюсь, кто-нибудь поможет мне с этим. Я написал запрос в Access 2003, который объединяет связанную таблицу "taxon_group_max_per_site" и перекрестный запрос "Отдельные виды по group_Crosstab".

Из таблицы у меня есть поля "Taxonomic Group" и "Max", а из кросс-таблицы - поля "Total_Of_Species_S".

Таблица и кросс-таблица связаны, и запрос работает нормально, пока я не добавлю какой-нибудь VBA, чтобы дать каждой таксономической группе оценку на основе "Max" и "Total_Of_Species_S".

Приведенный ниже код вызывает "Error 13: type mismatch"

Public Function Invert_Diversity_Score (Total_Of_Species_S As Integer) As Integer

    If Total_Of_Species_S < Round("[Max]*0.5", 0) Then
      Invert_Diversity_Score = 0
    Else
      If Total_Of_Species_S < Round("[Max] * 0.75", 0) Then
        Invert_Diversity_Score = 1
      Else
        If Total_Of_Species_S < Round("[Max] * 0.875", 0) Then
          Invert_Diversity_Score = 2
        Else
          Invert_Diversity_Score = 3
        End If
      End If
    End If

End Function

Отладчик показывает, что "[Max]*0.5" и другие умножения не выдают число, которое он говорит "[Max] * 0.5"= "[Max] * 0.5", который, я думаю, является источником несоответствия типов. Как я могу получить поле для нескольких должным образом? Он выглядит точно так же, как формат, показанный в справке VBA.

Ответы [ 3 ]

3 голосов
/ 11 сентября 2009

Функция округления ожидает число в качестве параметра, а не строку! Предполагая, что (max) является числом, вы можете рассчитать:

Round([Max] * 0.75, 0)

Но

Round("[Max] * 0.75", 0)

Определенно не вернет ничего жизнеспособного

2 голосов
/ 11 сентября 2009

"[Макс] * 0,875" это просто строка, откуда VBA должна знать, что вы ссылаетесь на столбец [Макс] из одной из ваших таблиц?

Разве нельзя [Max] передавать в функцию в качестве второго целочисленного параметра? Примерно так:

Public Function Invert_Diversity_Score (Total_Of_Species_S As Integer, 
                        MaxVal as Integer) As Integer

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

1 голос
/ 11 сентября 2009

Для одного вы должны использовать ключевое слово ElseIf, здесь нет необходимости складывать If s.

Второе - что должно означать "[Max]*0.5"? Для VB это строка, которую неудивительно, что вы не можете умножить на целое число.

Предполагая, что Max является некоторой глобальной константой:

Public Function Invert_Diversity_Score(Total_Of_Species_S As Integer) As Integer

  If Total_Of_Species_S < Round(Max * 0.5, 0) Then
    Invert_Diversity_Score = 0
  ElseIf Total_Of_Species_S < Round(Max * 0.75, 0) Then
    Invert_Diversity_Score = 1
  ElseIf Total_Of_Species_S < Round(Max * 0.875, 0) Then
    Invert_Diversity_Score = 2
  Else
    Invert_Diversity_Score = 3
  End If

End Function

Если это не константа, то вы также должны передать ее в функцию:

Public Function Invert_Diversity_Score( _
  Total_Of_Species_S As Integer, _
  Max as Integer _
) As Integer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...