Después de tanto batallar hemos encontrado la contestación de este atolladero que algunos de nuestros usuarios de este sitio presentan. Si deseas aportar algún dato puedes aportar tu comentario.
Solución:
Sospecho que no has configurado last_name
correctamente en la persona que llama.
con la declaración Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
esto solo funcionará si last_name
es un stringes decir
Dim last_name as String
aparece en la persona que llama en alguna parte.
La razón de esto es que VBA pasa variables por referencia de forma predeterminada, lo que significa que los tipos de datos deben coincidir exactamente entre la persona que llama y la persona que llama.
Dos arreglos:
1) Forzar por valor — Cambie su función para pasar la variable ByVal: Public Function ProcessString(ByVal input_string As String) As String
o
2) Dim varname — poner Dim last_name As String
en la persona que llama antes de usarlo.
(1) funciona porque para ByVal
, se toma una copia de input_string cuando se pasa a la función que la forzará al tipo de datos correcto. También conduce a una mejor estabilidad del programa ya que la función no puede modificar la variable en la persona que llama.
No sé por qué, pero es muy importante declarar las variables por separado si desea pasar variables (como variables) a otro procedimiento o función.
Por ejemplo, hay un procedimiento que realiza alguna manipulación con los datos: en función de la identificación, se devuelve información sobre el número de pieza y la cantidad. ID como valor constante, otros dos argumentos son variables.
Public Sub GetPNQty(ByVal ID As String, PartNumber As String, Quantity As Long)
el siguiente código principal me da una “falta de coincidencia del argumento ByRef”:
Sub KittingScan()
Dim BoxPN As String
Dim BoxQty, BoxKitQty As Long
Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty)
End sub
y el siguiente también está funcionando:
Sub KittingScan()
Dim BoxPN As String
Dim BoxQty As Long
Dim BoxKitQty As Long
Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty)
End sub
Cambié algunas cosas para trabajar con Option Explicit
y el código funcionó bien contra una celda que contenía "abc.123"
que volvió "abc.12,"
. No hubo errores de compilación.
Option Explicit ' This is new
Public Function ProcessString(input_string As String) As String
' The temp string used throughout the function
Dim temp_string As String
Dim i As Integer ' This is new
Dim return_string As String ' This is new
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
Le sugiero que publique más de su código relevante (que llama a esta función). Ha dicho que last_name es una cadena, pero parece que ese no es el caso. Revise su código línea por línea y asegúrese de que este sea realmente el caso.
Recuerda recomendar este enunciado si te fue útil.