【问题标题】:Excel VBS Save output to directory the script was launched fromExcel VBS 将输出保存到启动脚本的目录
【发布时间】:2013-06-21 13:01:04
【问题描述】:

更新的代码:脚本执行但不输出任何内容,Excel.exe 进程继续运行。我需要将其输出到启动 .vbs 脚本的目录,并将 Excel 文件命名为 Book1.xls 以外的其他名称

Option Explicit

Dim strFile, strGroupDN, objGroup, objExcel, intRow, objMember, objSheet
Dim objRootDSE, strDNSDomain, objTrans, strNetBIOSDomain, strGroup


Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1


Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")


Set objTrans = CreateObject("NameTranslate")
objTrans.Init ADS_NAME_INITTYPE_GC, ""
objTrans.Set ADS_NAME_TYPE_1779, strDNSDomain
strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4)

strNetBIOSDomain = Left(strNetBIOSDomain, _
Len(strNetBIOSDomain) - 1)

strGroup = InputBox("Enter AD group name")


On Error Resume Next
objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strGroup
If (Err.Number <> 0) Then
On Error GoTo 0

Wscript.Echo "Group " & strGroup & " not found"
Wscript.Quit
End If
strGroupDN = objTrans.Get(ADS_NAME_TYPE_1779)

Set objGroup = GetObject("LDAP://" & strGroupDN)

Set objExcel = CreateObject("Excel.Application")
objExcel.Workbooks.Add
objExcel.Columns(1).ColumnWidth = 100


Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)

objSheet.Name = "AD Group Members"

intRow = 1
For Each objMember In objGroup.Members
objSheet.Cells(intRow, 1).Value = objMember.sAMAccountName
intRow = intRow + 1
Next

Set fso = CreateObject("Scripting.FileSystemObject")
cwd = fso.GetAbsolutePathName("*.*")
filename = fso.BuildPath(cwd, "output.xls")
objExcel.ActiveWorkbook.SaveAs filename

【问题讨论】:

    标签: excel vbscript vba


    【解决方案1】:

    SaveAs 是一个方法;所以改变

    objExcel.ActiveWorkbook.SaveAs = ThisWorkbook.Path
    

    objExcel.ActiveWorkbook.SaveAs ThisWorkbook.Path
    

    再想一想:

    ThisWorkbook 来自哪里?在 .SaveAs 之前构建(并显示)预期的完整文件规范,然后重试。

    WRT 更新代码:

    您的:

    cwd = fso.GetAbsolutePathName("*.*")
    

    和 Ansgar 的:

    cwd = fso.GetAbsolutePathName(".")
    

    要获取脚本的文件夹(而不是当前目录),请使用

    fso.GetParentFolderName(WScript.ScriptFullName)
    

    【讨论】:

    • 我更改了代码,但它仍然提示我保存并强制我选择一个位置。在此示例中,我从桌面启动 .vbs。
    【解决方案2】:

    在 VBScript 中,您不能使用 ThisWorkbook 属性。您必须获取并使用对工作簿对象的引用:

    Set wb = objExcel.Workbooks.Add
    WScript.Echo wb.Name
    

    但是,这对您的情况没有帮助,因为您添加了一个新的空工作簿,所以它还没有路径。

    你可以像这样获取当前工作目录:

    cwd = CreateObject("WScript.Shell").CurrentDirectory
    

    或者像这样:

    Set fso = CreateObject("Scripting.FileSystemObject")
    cwd = fso.GetAbsolutePathName(".")
    

    我更喜欢后者,因为您还可以使用 fso 对象来构建输出文件的路径:

    filename = fso.BuildPath(cwd, "output.xlsx")
    

    而且,正如Ekkehard.Horner 已经指出的那样,SaveAs 是一种方法,而不是属性,因此您必须从该指令中删除 =

    objExcel.ActiveWorkbook.SaveAs filename
    

    编辑:要在脚本所在的同一目录中创建输出文件,请更改

    cwd = fso.GetAbsolutePathName(".")
    filename = fso.BuildPath(cwd, "output.xlsx")
    

    进入

    scriptDir = fso.GetParentFolderName(WScript.ScriptFullName)
    filename = fso.BuildPath(scriptDir, "output.xlsx")
    

    虽然不需要更改变量名,但最好根据变量的内容命名变量。

    【讨论】:

    • 我已经进行了更新,但它仍然提示我在从桌面运行脚本时选择一个目录。
    • 设置 fso = CreateObject("Scripting.FileSystemObject") cwd = fso.GetAbsolutePathName(".") objExcel.DisplayAlerts = False objExcel.ActiveWorkbook.SaveAs 文件名 = fso.BuildPath(cwd, "output. xlsx") objExcel.DisplayAlerts = True objExcel.ActiveWorkbook.Close objExcel.Application.Quit
    • 它也将另存为名称保留为 Book1.xlsx
    • 老兄,SaveAs() 是一种方法。 1) 文件名 = fso.BuildPath(cwd, "output.xlsx") 2) objExcel.ActiveWorkbook.SaveAs 文件名
    • 它仍然提示我在从桌面运行脚本时选择一个目录。它还将另存为名称保留为 Book1.xlsx。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2018-02-02
    • 2016-09-08
    • 2021-10-30
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多