Tipo de argumento VBA BYREF desajuste al llamar a la función
-
21-12-2019 - |
Pregunta
Tengo un método para cambiar el nombre del nombre de la columna de la tabla.
Public Function Rename_Column(tablename As String, oldcolumn As String, newcolumn As String)
Dim dbs As Database, tdf As TableDef
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
If tdf.Name = tablename Then
For Each fld In tdf.Fields
If fld.Name = oldcolumn Then
fld.Name = newcolumn
End If
Next
End If
Next
dbs.Close
End Function
y estoy llamando a esta función en otro procedimiento
Public Sub querylistboxitems()
Dim strTableName As String
strTableName = "Table1"
Call Rename_Column(strTableName, "old", "New")
End Sub
Pero está dando un error "Byref Argument Type Mismatch"
Solución
Falló por mí porque no definió "FLD".Lo siguiente es mucho más directo que el bucle a través de todas las tablas / campos:
Public Function Rename_Column(tablename As String, oldcolumn As String, newcolumn As String)
Dim dbs As Database
Dim tdf As TableDef
Dim fld As Field
Set dbs = CurrentDb
Set tdf = dbs.TableDefs(tablename)
Set fld = tdf.Fields(oldcolumn)
Set fld = Nothing
Set tdf = Nothing
dbs.Close
Set dbs = Nothing
End Function
Otros consejos
Hay otras situaciones difíciles donde puede ocurrir este problema.Por ejemplo, al declarar dos (o más) variables en una línea:
Dim firstSubMenu, secondSubMenu As CommandBarPopup
ahora Firstsubmenu es de variante de tipo, mientras que los segundos son de tipo CommandBarpopup.Esto puede no ser lo que pretendía y también puede ser una causa del error mencionado anteriormente cuando los pasa por referencia a una función que espera un parámetro de CommandBarPopPop. En este caso, una solución es declararlos en dos líneas:
Dim firstSubMenu As CommandBarPopup
Dim secondSubMenu As CommandBarPopup
O, si realmente quieres apretarlo en una línea, se puede hacer así:
Dim firstSubMenu As CommandBarPopup, secondSubMenu As CommandBarPopup
Tenga en cuenta que tendrá que repetir la Declaración de tipo 'AS' para cada variable.