Xml 如何使用以下VBA代码在我的窗体上创建生成;另存为;对话框并导出访问查询?

Xml 如何使用以下VBA代码在我的窗体上创建生成;另存为;对话框并导出访问查询?,xml,database,vba,ms-access,export-to-excel,Xml,Database,Vba,Ms Access,Export To Excel,这个问题与以下两个员额有关: 我目前有一个参数化查询(我们称之为“qryExport”),它从表单上的某些控件获取值(我们称之为“表单a”)。从前面提到的链接中,我了解到我可以使用下面的代码行作为“Form a”命令按钮的“on click”事件,该事件可以将“qryExport”导出为固定文件路径位置的Excel文件 DoCmd.TransferSpreadsheet acExport, , "qryExport", "C:\yourPath\exportedReport.xlsm", T

这个问题与以下两个员额有关:

我目前有一个参数化查询(我们称之为“qryExport”),它从表单上的某些控件获取值(我们称之为“表单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文件的选项)(请参见链接下方的代码):

然而,这些代码并不能满足我所有的需要。我不知道如何使用合并所有这些代码在表单上生成所需的命令按钮

一如既往,感谢您抽出时间


请注意:我正在使用Access 2010

您是否查看了
文件对话框
选项的功能?你可以用这个做你提到的每件事;不需要WinAPI的东西。真正的问题是
DoCmd.TransferSpreadsheet
命令只会生成一个Excel文件

如果要创建其他文件类型,则需要:

  • 创建
    FileDialog
    对象
    set fd=Application.FileDialog(msoFileDialogFilePicker)
  • 设置
    文件对话框
    对象
    • 从对象
      fd.Filters中清除以前的扩展。清除
    • 提供可用扩展名
      fd.Filters.Add“查询输出”、“*.xls;*.txt;*.xml”
    • 在这种情况下关闭multiselect
      fd.AllowMultiSelect=False
    • 提供默认文件名
      fd.InitialFilename=“\”
  • .Show
    将其显示给用户并返回
    fd.Show的结果
    
    • 如果是fd.Show,则为
      (他们没有点击取消或关闭对话框)(如果他们按save,则为Show=true)
    • 查看他们为下一步选择的文件名扩展名
      • 如果Instr(fd.SelectedItems(0),“.xls”)>0,则“执行xls操作”
      • 如果Instr(fd.SelectedItems(0),“.xml”)>0,则“执行文本填充”
      • Else'执行xml操作
    • 将查询的输出解析为用户选择的格式
      • 通过解析查询结果的内容来创建文本文件或XML
      • 使用
        TransferSpreadsheet
        命令创建XLS
该命令将不仅仅创建所需的文件类型。你需要控制它

要使此部分成为命令按钮单击事件,只需在命令按钮的表单单击事件过程中编写代码

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