FileDialog .SelectedItems(1) outlook VSTO 加载项未返回文件路径
FileDialog .SelectedItems(1) outlook VSTO add-in is not returning file path
我正在尝试在 Visual Studio 2017 年使用 Visual Basic 创建一个 Outlook VSTO 加载项,出于某种原因,我需要使用 Excel 从功能区单击一个按钮来获取文件位置FileDialog
通过导入 Microsoft.Office.Interop.Excel
。我在此处添加了代码,VBA 宏的相同代码模式在 outlook 的内置 VBA window 中运行良好,但是当我执行此代码时(针对 VSTO 添加进行了修改-In) 在 Visual Studio 调试模式下它会打开 FileDialog
弹出窗口,我可以 select 单个文件但是 .SelectedItems(1)
不是 returning [=] 中的任何路径63=] 输出。非常感谢您的帮助。谢谢。
#
VBA 代码(在 Outlook VBA Window 中工作)
Sub SelectFile()
Const msoFileDialogFilePicker As Long = 3
Dim xlObj As Excel.Application
Dim objDialog As Office.FileDialog
Dim pstPath As String
Set xlObj = Excel.Application
Set objDialog = xlObj.FileDialog(msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "Ok"
.Show
If .SelectedItems.Count = 0 Then
MsgBox ("No file selected.")
Else
pstPath = .SelectedItems(1)
MsgBox ("You have selected: " & pstPath)
End If
End With
xlObj.Quit()
Set objDialog = Nothing
End Sub
VBA_Code
还有...
VBA_Output
..
#
VSTO 代码:输出中没有文件路径(使用 Visual Studio 2017)
Public Sub SelectFile()
Const msoFileDialogFilePicker As Long = 3
Dim xlObj As Excel.Application
Dim objDialog As Office.FileDialog
Dim pstPath As String
xlObj = New Excel.Application
objDialog = xlObj.FileDialog(msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "Ok"
.Show()
If .SelectedItems.Count = 0 Then
MsgBox("No file selected.")
Else
pstPath = .SelectedItems(1)
MsgBox("You have selected: " & .SelectedItems(1))
End If
End With
xlObj.Quit()
objDialog = Nothing
End Sub
VSTO_Code_VisualStudio17
还有……VSTO_Output
注意:方法 1 不适用于 Outlook。如果有人在这里寻找其他 VSTO 应用程序中的解决方案,只需将其包括在内即可。
方法 1(Excel,仅限 Word、PowerPoint)
这是由于 .NET 中基于零的索引。尽管许多 VSTO 集合使用基于 1 的索引,但 SelectedItems
不是其中之一。另请注意,永远不要(永远)在 VSTO 加载项中使用 new Application()
。所有 VSTO 加载项默认获取 Globals.ThisAddin.Application
(或 this.Application
,如果你已经在 ThisAddin
class),你可以使用它来访问当前应用程序实例。
所以你的原始代码应该是这样的:
Public Sub SelectFile()
Dim objDialog = Me.Application.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "OK"
If .Show() = -1 Then
MsgBox("You have selected: " & .SelectedItems(0))
Else
MsgBox("No file selected.")
End If
End With
End Sub
方法 2(所有 VSTO 和其他 WinForms/WPF 应用程序)
由于 FileDialog
在 Outlook 中不可用,另一种方法是使用 Microsoft.Win32 对话框来达到相同的目的。这是我过去项目的一些代码:
Public Sub SelectFile()
Dim openDialog As new Microsoft.Win32.OpenFileDialog()
openDialog.Filter = "Audio files (*.wav, *.mp3, *.m4a)|*.wav;*.mp3;*.m4a"
If openDialog.ShowDialog().GetValueOrDefault() Then
Dim NewAudioFilePath = openDialog.FileName
End If
End Sub
您必须添加对 PresentationFramework
库的引用才能正常工作。
我正在尝试在 Visual Studio 2017 年使用 Visual Basic 创建一个 Outlook VSTO 加载项,出于某种原因,我需要使用 Excel 从功能区单击一个按钮来获取文件位置FileDialog
通过导入 Microsoft.Office.Interop.Excel
。我在此处添加了代码,VBA 宏的相同代码模式在 outlook 的内置 VBA window 中运行良好,但是当我执行此代码时(针对 VSTO 添加进行了修改-In) 在 Visual Studio 调试模式下它会打开 FileDialog
弹出窗口,我可以 select 单个文件但是 .SelectedItems(1)
不是 returning [=] 中的任何路径63=] 输出。非常感谢您的帮助。谢谢。
#
VBA 代码(在 Outlook VBA Window 中工作)
Sub SelectFile()
Const msoFileDialogFilePicker As Long = 3
Dim xlObj As Excel.Application
Dim objDialog As Office.FileDialog
Dim pstPath As String
Set xlObj = Excel.Application
Set objDialog = xlObj.FileDialog(msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "Ok"
.Show
If .SelectedItems.Count = 0 Then
MsgBox ("No file selected.")
Else
pstPath = .SelectedItems(1)
MsgBox ("You have selected: " & pstPath)
End If
End With
xlObj.Quit()
Set objDialog = Nothing
End Sub
VBA_Code
还有...
VBA_Output
#
VSTO 代码:输出中没有文件路径(使用 Visual Studio 2017)
Public Sub SelectFile()
Const msoFileDialogFilePicker As Long = 3
Dim xlObj As Excel.Application
Dim objDialog As Office.FileDialog
Dim pstPath As String
xlObj = New Excel.Application
objDialog = xlObj.FileDialog(msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "Ok"
.Show()
If .SelectedItems.Count = 0 Then
MsgBox("No file selected.")
Else
pstPath = .SelectedItems(1)
MsgBox("You have selected: " & .SelectedItems(1))
End If
End With
xlObj.Quit()
objDialog = Nothing
End Sub
VSTO_Code_VisualStudio17
还有……VSTO_Output
注意:方法 1 不适用于 Outlook。如果有人在这里寻找其他 VSTO 应用程序中的解决方案,只需将其包括在内即可。
方法 1(Excel,仅限 Word、PowerPoint)
这是由于 .NET 中基于零的索引。尽管许多 VSTO 集合使用基于 1 的索引,但 SelectedItems
不是其中之一。另请注意,永远不要(永远)在 VSTO 加载项中使用 new Application()
。所有 VSTO 加载项默认获取 Globals.ThisAddin.Application
(或 this.Application
,如果你已经在 ThisAddin
class),你可以使用它来访问当前应用程序实例。
所以你的原始代码应该是这样的:
Public Sub SelectFile()
Dim objDialog = Me.Application.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFilePicker)
With objDialog
.AllowMultiSelect = False
.Title = "Select your PST File"
.ButtonName = "OK"
If .Show() = -1 Then
MsgBox("You have selected: " & .SelectedItems(0))
Else
MsgBox("No file selected.")
End If
End With
End Sub
方法 2(所有 VSTO 和其他 WinForms/WPF 应用程序)
由于 FileDialog
在 Outlook 中不可用,另一种方法是使用 Microsoft.Win32 对话框来达到相同的目的。这是我过去项目的一些代码:
Public Sub SelectFile()
Dim openDialog As new Microsoft.Win32.OpenFileDialog()
openDialog.Filter = "Audio files (*.wav, *.mp3, *.m4a)|*.wav;*.mp3;*.m4a"
If openDialog.ShowDialog().GetValueOrDefault() Then
Dim NewAudioFilePath = openDialog.FileName
End If
End Sub
您必须添加对 PresentationFramework
库的引用才能正常工作。