我正在使用代码用户@Alain写了一段时间作为从Excel仪表板向MS Word模板写入数据的新脚本的基础。请查看原始帖子和解决方案here。我有一个编译错误,我不能完全摆脱。
问题涉及GenerateDocumentation
模块中的一行代码,特别是srcPath
字符串。
我不认为FindConstant("")
是VBA代码。据我所知,findConstant
是 Java 命令。工具>引用中是否有库我忘了选择?实际上似乎有一些我不认识的子或函数,例如 CreateDocGenPath
,GetNextEndorsementNumber
等等。这些函数是其他库还是自定义子函数?
我应该可以将此行重写为srcPath = Application.GetSaveAsFilename
并获取一个对话框来选择目录......这会有效吗?
答案 0 :(得分:1)
我相信我创建了一个可能复制User @ Alain自定义函数FindConstants("Message Here")
的函数。让VBA调用目录路径的技巧是运行Windows API。此函数调用文件DLL以启动目录浏览器。然后它将选择保存到DirPath()
。我不知道如何在64位计算机上调用这些声明,这假设您正在运行Windows 7.这就是我的意思
到目前为止:
Option Explicit
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
'32-bit API declarations
Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) _
As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Function DirPath(Optional Msg) As String
Dim bInfo As BROWSEINFO
Dim path As String
Dim r As Long, x As Long, pos As Integer
bInfo.pidlRoot = 0&
' Window title information
If IsMissing(Msg) Then
bInfo.lpszTitle = "Select a folder."
Else
bInfo.lpszTitle = Msg
End If
' Directory information to return
bInfo.ulFlags = &H1
' Display the browsing dialog
x = SHBrowseForFolder(bInfo)
' Parse
path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal path)
If r Then
pos = InStr(path, Chr$(0))
DirPath = Left(path, pos - 1)
Else
DirPath = "" ' Saves no directory if nothing is selected!
End If
End Function
这是一个测试上述功能的Sub:
Sub Test()
Dim Msg As String
Msg = "Please select a template repository."
MsgBox GetDirectory(Msg)
End Sub
抱歉这有点乱,我不知道怎么用Markdown清理代码块...这不是一个完整的答案,花了我一段时间才能到达,因为我不熟悉通过API调用。另外,MSDN是为C +编写的,我不知道,所以我必须找到一些表格资源,将C +声明等同于VBA声明(As Long vs. * FAR等等) 。如果有人可以提供或识别他们在Alain的代码中作为附加组件或作为着名的UDF发现的功能,我将保持问题公开。在创建和学习时,我会更多地编辑这个答案。
答案 1 :(得分:0)
我认为FindConstant()
是Alain编写的函数,用于从某个设置列表返回路径,但我没有看到SrcPath在任何地方都被使用过。您提到的其他例程也是用户提供的。