ByRef argument de l'incompatibilité de type Excel VBA
Je travaille avec VBA. J'ai écrit un utilisateur de définir la fonction qui prend un string
, de processus et de revenir au propre string
. Je ne suis pas sûr de ce qui est mal avec elle. Je ne suis pas capable de l'appeler et de lui demander de traiter mon string et le retourner. Je pense il y a une erreur dans la façon dont je suis la définition ou de la remettre.
Public Function ProcessString(input_string As String) As String
' The temp string used throughout the function
Dim temp_string As String
For i = 1 To Len(input_string)
temp_string = Mid(input_string, i, 1)
If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then
return_string = return_string & temp_string
End If
Next i
return_string = Mid(return_string, 1, (Len(return_string) - 1))
ProcessString = return_string & ", "
End Function
Et j'utilise cette fonction comme ceci
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
Dernier nom est une variable de type chaîne, ressemble généralement à ce Lastname*****
, et je suis en train d'essayer d'enlever toutes les étoiles derrière elle. L'avoir de retour Lastname
sans les étoiles.
J'ai reçu Compile error: ByRef arugment type mismatch
quand j'ai essayé de l'exécuter. Je suis avec Windows XP avec Office 2003.
EDIT: j'ai ajouté à la base struction du code que j'ai, j'ai environ 20 lignes de code similaire. Faire la même chose pour chacun des champs dont j'ai besoin.
Private Sub CommandButton2_Click()
' In my original production code I have a chain of these
' Like this Dim last_name, first_name, street, apt, city, state, zip As String
Dim last_name As String
' I get the last name from a fixed position of my file. Because I am
' processing it from another source which I copied and pasted into excel
last_name = Mid(Range("A4").Value, 20, 13)
' Insert the data into the corresponding fields in the database worksheet
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
Il flaged sur la ligne quand je l'appelle.
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
OriginalL'auteur George | 2013-05-17
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que vous n'avez pas défini de
last_name
correctement en l'appelant.Avec la déclaration
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
cela ne fonctionnera que si
last_name
est une chaîne de caractères, c'est à direapparaît en l'appelant quelque part.
La raison pour cela est que VBA passe dans les variables par référence par défaut, ce qui signifie que les types de données doivent correspondre exactement entre l'appelant et l'appelé.
Deux correctifs:
1) Force ByVal -- Changer votre fonction pour passer de la variable ByVal:
Public Function ProcessString(ByVal input_string As String) As String
, ou2) Dim varname - mettre
Dim last_name As String
en l'appelant avant de l'utiliser.(1) fonctionne parce que pour
ByVal
, une copie de input_string est pris lors du passage à la fonction qui va forcer dans le type de données correct. Elle permet également de mieux le programme de stabilité, car la fonction ne peut pas modifier la variable en l'appelant.ByVal
a résolu le problème, maintenant, le code fonctionne très bien!J'ai toujours déclarer tous mes fonctions VBA avec ByVal comme elle améliore la stabilité. Avec Java, vous n'avez pas le choix, tout est passé par valeur.
OriginalL'auteur Bathsheba
Je ne sais pas pourquoi, mais il est très important de déclarer les variables séparément si vous voulez passer des variables (variables) dans une autre procédure ou de la fonction.
Par exemple, il existe une procédure qui font de la manipulation des données: basée sur l'ID renvoie le Numéro de Pièce et la Quantité de l'information. ID comme valeur constante, deux autres arguments sont des variables.
la prochaine code me donne un "argument ByRef" incompatibilité:
et le prochain est en travaillant ainsi:
J'étais en train de perdre mon esprit, je ne peux pas croire que j'ai besoin de ceci, je vous remercie.
Une ligne de déclarations ne fonctionnent pas comme nous le pensions!!!! : stackoverflow.com/a/34036529/4316542
OriginalL'auteur ArpaG
J'ai changé quelques petites choses à travailler avec
Option Explicit
, et le code marche bien contre une cellule contenant"abc.123"
, qui a retourné"abc.12,"
. Il n'y avait pas d'erreurs de compilation.Je vais vous suggère de poster plus de votre code (qui appelle cette fonction). Vous avez déclaré que le nom est une Chaîne de caractères, mais il semble que peut-être pas le cas. Étape votre code ligne par ligne et veiller à ce que ce soit réellement le cas.
Private Sub CommandButton2_Click()
, et aussi lelast_name
est mis en surbrillance. Très comportements étranges, mon Sub est fondamentalement un buttom que faire une liste de choses.Merci pour le raté instruction Dim!
OriginalL'auteur Gaffi
Tout en parcourant votre chaîne d'un caractère à la fois est une méthode viable, il n'est pas nécessaire. VBA a des fonctions intégrées pour ce genre de chose:
OriginalL'auteur PowerUser
Quelque chose de mal avec cette chaîne essayer comme ceci:
OriginalL'auteur Gorodeckij Dimitrij