2009-09-11 5 views
0

Espérons que quelqu'un puisse m'aider avec ça. J'ai écrit une requête dans Access 2003 qui combine une table liée "taxon_group_max_per_site" et une requête croisée "Distinct Species by group_Crosstab".Erreur de type de données VBA - mauvaise syntaxe?

A partir du tableau, j'ai le champ "Taxonomic Group" et "Max", et à partir de l'onglet croisé les champs "Total_Of_Species_S".

La table et l'onglet croisé sont liés et la requête fonctionne correctement jusqu'à ce que j'ajoute un certain VBA pour attribuer à chaque groupe taxonomique une note basée sur "Max" et "Total_Of_Species_S".

Le code ci-dessous apporte des "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 

Le débogueur montre que "[Max]*0.5" et les autres multiplications ne produisent pas un numéro, il dit "[Max] * 0.5"= "[Max] * 0.5", que je pense est la source de l'incompatibilité de type. Comment puis-je obtenir le champ à plusieurs correctement? Il ressemble exactement au format indiqué dans l'aide de VBA.

Répondre

3

La fonction round attend un nombre comme paramètre, pas une chaîne! Si l'on suppose (max) est un numéro, vous pouvez calculer:

Round([Max] * 0.75, 0) 

Mais

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

On y retournera certainement rien viable

1

Pour un, vous devez utiliser le mot-clé ElseIf, il y a pas besoin d'empiler les If ici.

Deuxièmement - qu'est-ce que "[Max]*0.5" veut dire? Pour VB, c'est une chaîne de caractères, ce qui n'est pas surprenant, vous ne pouvez pas multiplier avec un nombre entier.

En supposant Max est une sorte de constante globale:

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 

Si ce n'est pas une constante, alors vous devez passer dans la fonction ainsi:

Public Function Invert_Diversity_Score(_ 
    Total_Of_Species_S As Integer, _ 
    Max as Integer _ 
) As Integer 
2

« [Max] * 0.875 "est juste une chaîne de caractères, comment VBA est supposé savoir que vous faites référence à la colonne [Max] d'une de vos tables?

Est-ce que [Max] ne doit pas être passé dans la fonction en tant que second paramètre entier? Quelque chose comme ceci:

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

Nous avons besoin du code qui montre comment vous appelez la fonction pour trier vraiment ceci ...

+0

+1 pour remarquer que les crochets pourraient indiquer l'opérateur d'accès aux données en VBA. – Tomalak

+0

Salut merci à tous pour les commentaires. Je pense que codeulike résume ma question pour moi, "comment VBA est censé savoir que vous faites référence à la colonne [Max] d'une de vos tables?" Je n'ai aucune idée. Je m'enseigne VBA à travers une combinaison de l'utilisation d'autres codes de code et de livres. Pas très bien, je pourrais ajouter. Donc, Max est une colonne et contient un nombre entier. Comment puis-je informer VBA? –

+0

Salut J'ai suivi la suggestion de codeulike (Max ajouté comme paramètre entier) et celle de Philippe (enlevé les crochets et les citations). Je n'ai pas changé le code pour utiliser Else si je suis trop paresseux mais je l'utiliserai la prochaine fois Merci pour votre aide les gars. C'est très apprécié. Davva –