2014-02-25 4 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 ** in ** querylistboxitems ** procedure – vuyy1182

+0

Попробуйте бросить ByVal перед вашими объявлениями переменных в вашей функции, у меня была эта работа для меня раньше – 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 

Обратите внимание, что вам придется повторять объявление типа «как» для каждой переменной.

+0

Кто-нибудь нашел другой способ решить эту ошибку? Это может быть очень неприятно, если у вас есть много разных переменных, которые вы передаете в функцию. – t22money

+4

Я добавил неожиданное поведение 'Dim string1, string2, string3 As String' в список« Excel VBA WTF ». +1 и спасибо. –

Смежные вопросы