簡體   English   中英

如何使用以下VBA代碼在表單上創建一個命令按鈕,該命令按鈕生成“另存為”對話框並導出Access查詢?

[英]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?

這個問題與以下兩個帖子有關:

按下按鈕時如何運行查詢並將結果導出到Excel文件

MSAccess vba中的“另存為...”對話框:如何?

我目前有一個參數化查詢(可稱為“ 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文件的選項)(請參見鏈接下方的代碼):

VBA另存為原點

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
    • 將查詢的輸出解析為用戶選擇的格式
      • 通過解析查詢結果的內容來創建文本文件或XML。
      • 使用TransferSpreadsheet命令創建XLS。

該命令不僅會創建所需的文件類型。 您需要控制它。
閱讀此鏈接可獲取2013年和2010年的更多信息。
閱讀此鏈接以獲得對FileDialog對象屬性的更好描述。

要使其成為命令按鈕單擊事件的一部分,只需在命令按鈕的單擊事件過程中為表單編寫代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM