所以我想知道,如何从VBA中的函数,子或类型返回多个值?我有这个主要的子应该从几个函数收集数据,但一个函数只能返回它看起来的一个值.那么如何将多个返回给子?
我有一个包含许多表的word文档.有谁知道如何编写宏来将这些表导出到不同的Excel工作表?
然而,我最初获得子目录的方法失败了.它只显示包括文件在内的一切:
sDir = Dir(sPath, vbDirectory)
Do Until LenB(sDir) = 0
Debug.Print sDir
sDir = Dir
Loop
Run Code Online (Sandbox Code Playgroud)
该列表以".."和几个文件夹开头,以".txt"文件结尾.
编辑:
我应该补充说,这必须在Word中运行,而不是Excel(许多功能在Word中不可用),它是Office 2010.
编辑2:
可以使用确定结果的类型
iAtt = GetAttr(sPath & sDir)
If CBool(iAtt And vbDirectory) Then
...
End If
Run Code Online (Sandbox Code Playgroud)
但这给了我新的问题,所以我现在正在使用基于的代码Scripting.FileSystemObject.
在VBA中,有一种简短的方法可以像java一样注释掉一段代码/*...*/吗?
如上所述如何从visual basic中的指定索引处获取char?我浏览谷歌这些不起作用:
s(index),
s.Chars(index),s,Characters(index)
那么如何在指定的索引处获取char?
我注意到模板文件Me中VBA代码中关键字的行为是不同的,这取决于文档是否具有ActiveX控件.
Me引用从模板创建的新文件.Me引用模板而不是新文件.为了演示这种奇怪的行为,我做了两个示例文件:
两个文件都是相同的,它们之间的唯一区别是一个有一个Button而另一个没有.两个文件的VBA代码如下:
Private Sub Document_New()
Selection.TypeText "Me keyword is referencing """ & Me.Name & """."
End Sub
Run Code Online (Sandbox Code Playgroud)
如果您从这些模板创建新文件,您将意识到结果是不同的:
WithActiveX.dotm的内容是
Me关键字引用"Document1".< - 由上面的代码生成的字符串
而WithoutActiveX.dotm的内容是
Me关键字引用"WithoutActiveX.dotm".< - 由上面的代码生成的字符串
我做了几个测试,得出结论,不一致的来源是ActiveX控件的存在(没有与控件相关的代码:它只存在于文档中).
这是设计还是只是一个bug?
编辑2017-06-13:这里描述的错误似乎是部分修复的,但它仍然是可重现的.现在,只有在使用其中一个模板(如空白文档)创建新文档之前,才会打开Word实例.
我一直在通过将excel文档中的一些图表和数据复制到word文档来创建报表.我正在粘贴内容控件,所以我ChartObject.CopyPicture在excel和ContentControl.Range.Pasteword中使用.这是在循环中完成的:
Set ws = ThisWorkbook.Worksheets("Charts")
With ws
For Each cc In wordDocument.ContentControls
If cc.Range.InlineShapes.Count > 0 Then
scaleHeight = cc.Range.InlineShapes(1).scaleHeight
scaleWidth = cc.Range.InlineShapes(1).scaleWidth
cc.Range.InlineShapes(1).Delete
.ChartObjects(cc.Tag).CopyPicture Appearance:=xlScreen, Format:=xlPicture
cc.Range.Paste
cc.Range.InlineShapes(1).scaleHeight = scaleHeight
cc.Range.InlineShapes(1).scaleWidth = scaleWidth
ElseIf ...
Next cc
End With
Run Code Online (Sandbox Code Playgroud)
使用Office 2007创建这些报告产生的文件大约为6MB,但在Office 2010中创建它们(使用相同的工作表和文档)会产生大约10倍的文件.
在解压缩docx之后,我发现额外的大小来自emf文件,这些文件对应于使用VBA粘贴的图表.它们的范围从360到900 KB之间,它们是5-18 MB.而且图形效果并不明显.
更进一步,它似乎与图表风格有关.我创建了一个新的电子表格并插入了7个数据点和相应的2D饼图.使用默认样式,它复制为79 KB emf,而使用样式26复制为10 MB emf.当我使用Office 2007时,图表将复制为700 KB emf.这是代码:
Sub CopyAndPaste()
ThisWorkbook.Worksheets("Charts").ChartObjects("Chart 1").CopyPicture Appearance:=xlScreen, Format:=xlPicture
GetObject(, Class:="Word.Application").ActiveDocument.Range.Paste
End Sub
Run Code Online (Sandbox Code Playgroud)
我能够使用格式的CopyPicture xlBitmap,虽然它稍微小一点,但它比Office 2007生成的emf大,质量明显更差.还有其他减少文件大小的选项吗?理想情况下,我想为使用Office 2007的图表生成一个具有相同分辨率的文件.有没有任何方法只使用VBA(不修改电子表格中的图表)?我可以轻松地复制为对象而无需链接文档?
一般来说,
使用VBA,如何确定当前用户Application Data文件夹的位置?
FileSystemObjects特殊文件夹只知道3个文件夹
具体来说,我需要Word宏将文件复制到Application Data文件夹下的文件夹.
例如,在VB.Net中我可以My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData用来做这件事
我有一个宏,我通过自定义UI编辑器添加的选项卡/组/按钮调用 -
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="tabCustomActions" label="Custom ActionsXXX" insertAfterMso="TabDeveloper">
<group id="GroupTLA" label="TLA Actions">
<button id="buttonFormatTLA" label="Format as TLA" image="TLALogo" size="large" onAction="start_tla" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)
按钮显示很好,带有我的自定义徽标,但是当我点击按钮时,我得到以下错误 -

通常情况下,此错误后未打开VBA,如果我打开开发人员控制台然后尝试单击按钮,则VBA中的代码不会被指示为问题.
奇怪的是,如果我尝试手动运行宏,它可以正常工作,没有错误.有没有人有任何想法如何解决这个问题?
如果您希望查看它,这是我在Pastebin中的完整代码.谢谢.
word-vba ×10
vba ×9
ms-word ×4
excel-vba ×2
.emf ×1
access-vba ×1
excel ×1
export ×1
filesystems ×1
function ×1
ms-office ×1
outlook-vba ×1
recursion ×1
return-value ×1
ribbon ×1
tabs ×1
windows ×1
word-2007 ×1