Saltar al contenido

No coincide el tipo de argumento ByRef en Excel VBA

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 Stringo

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 Explicity 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *