2014-02-25 67 views
1

我有一个方法来重命名表列名称。vba调用函数时Byref参数类型不匹配

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 

我打电话在其他程序中的该功能

Public Sub querylistboxitems() 
    Dim strTableName As String 

    strTableName = "Table1" 
    Call Rename_Column(strTableName, "old", "New") 
End Sub 

但它给了一个错误“ByRef参数类型不匹配”

+0

在哪一行? VBE应该以不匹配的方式来处理线路......它看起来像对我来说正确地建立了呼叫。你有3个字符串,所以你应该可以在那里... – MattB

+0

它是在hilighting ** strTableName **在querylistboxitems **程序 – vuyy1182

+0

尝试在您的函数中抛出变量声明的ByVal infront,之前我已经为我做过这项工作 – pegicity

回答

2

它没有给我,因为你没有定义“ FLD”。以下是比循环直通所有表/字段更直接:

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 
19

还有其他棘手的情况下,可能会出现此问题。例如在同一行声明了两个(或更多个)变量时:

Dim firstSubMenu, secondSubMenu As CommandBarPopup 

现在firstSubMenu是Variant类型,而secondSubMenu是类型的CommandBarPopup的。这可能不是你想要的,当通过引用一个期望CommandBarPopup类型的参数的函数来传递它们时,也可能是上述错误的原因。 在这种情况下的解决方案是宣布他们两行:

Dim firstSubMenu As CommandBarPopup 
Dim secondSubMenu As CommandBarPopup 

或者,如果你真的想挤在同一行,它可以这样做:

Dim firstSubMenu As CommandBarPopup, secondSubMenu As CommandBarPopup 

注意你必须重复每个变量的'As'类型声明。

+0

有没有人找到解决此错误的另一种方法? 如果你有很多不同的变量传递给函数,那可能会很烦人。 – t22money

+4

我已将“Dim string1,string2,string3 As String”的意外行为添加到“Excel VBA WTF's”的列表中。 +1和谢谢。 –