【发布时间】:2012-05-10 21:31:56
【问题描述】:
主要使用宏记录器,我创建了一个 VBA 宏,用于在 Excel 和 QuickBooks 文件之间建立供应商列表连接。
Sub RefreshVendorList()
'
' RefreshVendorList Macro
'DatabaseName=3ae39a3bfa964f61a6f974654c1ddbe9;
Columns("C:E").Select
Selection.Delete Shift:=xlToLeft
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
"ODBC;Driver={QB SQL Anywhere};UID=Purchasing;;ServerName=QB_data_engine_21;AutoStop=NO;" _
), Array("Integrated=NO;Debug=NO;DisableMultiRowFetch=NO")), Destination:= _
Range("$C$1")).QueryTable
.CommandText = Array( _
"SELECT v_lst_vendor.name AS 'Vendor Name', v_lst_vendor_type.name AS 'Type', v_lst_vendor.is_hidden" & Chr(13) & "" & Chr(10) & "FROM QBReportAdminGroup.v_lst_vendor v_lst_vendor, QBReportAdminGroup.v_lst_vendor_type v_lst_vendo" _
, _
"r_type" & Chr(13) & "" & Chr(10) & "WHERE v_lst_vendor_type.id = v_lst_vendor.vendor_type_id AND ((v_lst_vendor.is_hidden=0) AND (v_lst_vendor_type.name='MBO'))" & Chr(13) & "" & Chr(10) & "ORDER BY v_lst_vendor.name, v_lst_vendor_type.name" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table_PA_Vendor_List"
.Refresh BackgroundQuery:=False
End With
'delete the "ishidden" column
Columns("E:E").Delete
End Sub
我将代码附加到一个按钮上,以便用户可以更新供应商列表。在 QuickBooks 文件打开的情况下,这个 sn-p 大部分时间都可以工作。这是我想改变的,我认为有两种方法可以实现:
选项 1. 每次按下按钮(并重新创建 ODBC 连接)时,它都会要求用户输入密码。我想传递密码而不是询问用户。将 .SavePassword 更改为 True 不会这样做。
选项 2。我认为有一种更好的方法来设置 ODBC 连接,因此它不必通过宏“重新创建”来刷新它。只要 QuickBooks 和这个 Excel 文件保持打开状态,我就可以使用 Excel 中的内置刷新按钮(在数据 -> 全部刷新下)。但是,如果我关闭 Excel 文件和 QuickBooks 文件,重新打开它们并尝试按刷新,我会收到以下错误,这就是我创建宏来重新创建 ODBC 连接的原因:
【问题讨论】:
标签: vba excel odbc quickbooks