![](/img/trans.png)
[英]How can I create a VBA function (for Access 2010) that exports pass-through queries as XML files?
[英]How do I use the following VBA code to create a command button on my form that produces “Save As” Dialog Box and exports Access queries?
這個問題與以下兩個帖子有關:
我目前有一個參數化查詢(可稱為“ qryExport”),該查詢從表單上的某些控件(稱為“ Form A”)中獲取值。 從上述鏈接中,我了解到我可以對“ Form A”命令按鈕的“ on click”事件使用以下代碼行,該事件可以將“ qryExport”導出為Excel文件,位於固定文件路徑位置。
DoCmd.TransferSpreadsheet acExport, , "qryExport", "C:\yourPath\exportedReport.xlsm", True
問題 :
但是,我需要為“表單A”產生一個命令按鈕,當用戶單擊它時,它將執行以下操作:
1)提示用戶命名即將導出的文件。
2)允許用戶指定要在其計算機上保存導出的“ qryExport”對象的位置。
3)允許用戶選擇他們想要導出“ qryExport”的文件類型(例如Excel,XML,Txt等)。
4)一旦用戶選擇了文件路徑名稱,文件名和所需的文件類型,便執行導出操作。
我將把表單分發給多個用戶(他們在不同的工作站上工作),這需要我的命令按鈕滿足上述要求。
我認為一種可能的解決方案是在用戶單擊命令按鈕時添加“另存為”提示。 它將要求用戶指定文件路徑,選擇他們希望將文件保存為工作站中的文件格式(Excel,XML,Txt等),並允許他們為新文件命名。
我發現了VBA代碼,該代碼允許命令按鈕生成“另存為”窗口(值得注意的是,它僅向用戶提供將文件另存為Excel文件的選項)(請參見鏈接下方的代碼):
Option Compare Database
Private mstrFileName As String
Private mblnStatus As Boolean
'Declare needed functions
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
'Declare OPENFILENAME custom Type
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
'Function needed to call the "Save As" dialog
Public Function SaveFileDialog(lngFormHwnd As Long, _
lngAppInstance As Long, strInitDir As String, _
strFileFilter As String) As Long
Dim SaveFile As OPENFILENAME
Dim X As Long
If IsMissing(strFileName) Then strFileName = ""
With SaveFile
.lStructSize = Len(SaveFile)
.hwndOwner = lngFormHwnd
.hInstance = lngAppInstance
.lpstrFilter = strFileFilter
.nFilterIndex = 1
.lpstrFile = String(257, 0)
'Use for a Default File SaveAs Name - [UD]
'.lpstrFile = "testfile.txt" & String(257 - Len("testfile.txt"), 0)
.nMaxFile = Len(SaveFile.lpstrFile) - 1
.lpstrFileTitle = SaveFile.lpstrFile
.nMaxFileTitle = SaveFile.nMaxFile
.lpstrInitialDir = strInitDir
.lpstrTitle = "Enter a Filename to Save As" '[UD]
.Flags = 0
.lpstrDefExt = ".xls" 'Sets default file extension to Excel,
'in case user does not type it - [UD]
End With
X = GetSaveFileName(SaveFile)
If X = 0 Then
mstrFileName = "none"
mblnStatus = False
Else
mstrFileName = Trim(SaveFile.lpstrFile)
mblnStatus = True
End If
End Function
Public Property Let GetName(strName As String)
mstrFileName = strName
End Property
Public Property Get GetName() As String
GetName = mstrFileName
End Property
Public Property Let GetStatus(blnStatus As Boolean)
mblnStatus = blnStatus
End Property
Public Property Get GetStatus() As Boolean
GetStatus = mblnStatus
End Property
但是,該代碼無法滿足我的所有需求。 我不知道如何使用所有這些代碼來在表單上生成所需的命令按鈕。
和往常一樣,謝謝您的時間。
請注意:我正在使用Access 2010
您是否看過FileDialog
選項的功能? 您可以使用此功能完成您提到的所有操作; 不需要WinAPI的東西。 真正的問題是DoCmd.TransferSpreadsheet
命令只會生成一個Excel文件。
如果要創建其他文件類型,則需要:
FileDialog
對象set fd = Application.FileDialog(msoFileDialogFilePicker)
FileDialog
對象
fd.Filters.Clear
清除以前的擴展 fd.Filters.Add "Query Output", "*.xls; *.txt; *.xml"
fd.AllowMultiSelect = False
fd.InitialFilename = "<desired start path>\\<desired filename>.<desired extension>"
.Show
其顯示給用戶並返回fd.Show
的結果
If fd.Show Then
(它們沒有按If fd.Show Then
或關閉對話框)(如果按保存則Show = true) If Instr(fd.SelectedItems(0), ".xls") > 0 Then 'Do the xls stuff
If Instr(fd.SelectedItems(0), ".xml") > 0 Then 'Do the text stuff
Else 'Do the xml stuff
TransferSpreadsheet
命令創建XLS。 該命令不僅會創建所需的文件類型。 您需要控制它。
閱讀此鏈接可獲取2013年和2010年的更多信息。
閱讀此鏈接以獲得對FileDialog對象屬性的更好描述。
要使其成為命令按鈕單擊事件的一部分,只需在命令按鈕的單擊事件過程中為表單編寫代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.