打包分享你的 Excel VBA 和自定义选项卡

办公电脑开放的权限不多,装软件也得批,虽然用到这台老爷机的机会不多,但秉承着最大化摸鱼效率的宗旨,做了几个小按钮,方便自己刷格式用,也能在多台设备(包括macOS)共享。不过还是没有Arixcel方便(笑)

编写Sub/macro后保存为.xlam文件 #

  1. 先新建一个Excel工作簿(文件→新建)
  2. 打开Excel自带的VBA窗口(开发工具→Visual Basic,或者 Alt+F11
  3. 一般我会选择插入模块的方式保存Sub/macro,所以在左侧对应VBA Project右键选择插入模块

建议把模块名(例如“模块1”)改为英文,以避免不同语言环境下打不开(中文模块名只能在中文系统环境+软件设置的情况下正常运作)。

如果不需要分享自定义选项卡,则编写完毕保存.xlam后,共享给其他人即可。.xlam通过Excel加载项的方式加载,可以手动移动到对应路径后 在Windows,路径为C:\Users\%%YourUsername%%\AppData\Roaming\Microsoft\AddIns(把%%YourUsername%%替换为你实际的用户文件夹名;AppData文件夹默认隐藏,建议用url访问) 在Excel加载项窗口选中,也可以不移动,选择浏览(B)...手动locate到该文件。不使用locate的方式是为了防止误删,删了相当于卸了这个加载项。

Excel-AddIns

如果希望将这些Sub/macro放到顶部tab选项卡里并共享,我这里使用Office RibbonX生成按钮,会需要对语句做一定的调整,下文会提到。

用Office RibbonX制作自定义选项卡 #

编写好函数后暂存为.xlam,关闭Excel,然后用Office RibbonX Editor打开该文件。

选择菜单栏Insert,如果面向Office 2010+的版本,选Office 2010+ UI Part即可;如果有面向2007老版本的需求则选Office 2007 UI Part。这会向文件插入一个.xml,我们通过自定义该文件来创建选项卡、分组和按钮。

选择刚刚创建的.xml,选择菜单栏Insert,我们可以通过插入sample XML先看看示例,例如选择新建一个选项卡(Excel - A Custom Tab),也可以在既有的tab里插入分组、按钮等等。 这里也有一个教程(Archived,因为作者自己删了)。

例子:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
	<ribbon>
		<tabs>
			<tab id="customTab" label="Formatting">
				<group id="formattingGeneral" label="General">
					<button id="generalSetZoomAndHideGridlines" label="Zoom 100% No Gridlines" size="large" onAction="SetZoomAndHideGridlines" imageMso="BlackAndWhiteWhite" />
					<button id="generalShowFontWindow" label="Font Setting" size="large" onAction="ShowFontWindow" imageMso="CharacterBorder" />
				</group>
				<group id="formattingCell" label="Cell">
					<button id="cellSetZoomAndHideGridlines" label="Center Across" size="large" onAction="CenterAcross" imageMso="OutlineDemoteToBodyText" />
					<button id="cellSetYellowBackground" label="Yellow Bg" size="large" onAction="SetYellowBackground" imageMso="AppointmentColor10" />
					<button id="cellSetGreyBackground" label="Grey Bg" size="large" onAction="SetGreyBackground" imageMso="AppointmentColor4" />
					<button id="cellEdgeTopBorder" label="Top Border" size="large" onAction="EdgeTopBorder" imageMso="SelectionPaneHidden" />
				</group>
				<group id="formattingFont" label="Font">
					<button id="fontSetRedFont" label="Red" size="large" onAction="SetRedFont" imageMso="AppointmentColor1" />
					<button id="fontSetGreenFont" label="Green" size="large" onAction="SetGreenFont" imageMso="AppointmentColor3" />
					<button id="fontSetBlueFont" label="Blue" size="large" onAction="SetBlueFont" imageMso="AppointmentColor2" />
					<button id="fontSetBlackFont" label="Black" size="large" onAction="SetBlackFont" imageMso="BlackAndWhiteBlack" />
				</group>
				<group id="formattingValue" label="Value">
					<button id="valueFormatMoneyNoDecimal" label="Money (Integer)" size="large" onAction="FormatMoneyNoDecimal" imageMso="DollarSign" />
					<button id="valueFormatMultiple" label="Multiplier (#x)" size="large" onAction="FormatMultiple" imageMso="EquationMatrixGallery" />
				</group>
				<group id="formattingOther" label="Other">
					<button id="otherAddRowWithSheetName" label="Top Row Sheet Name" size="large" onAction="AddRowWithSheetName" imageMso="Info" />
					<button id="otherSetBasicWidth" label="A-D Width" size="large" onAction="SetBasicWidth" imageMso="TableDesign" />
					<button id="otherCopyActiveSheet" label="Copy Active Worksheet" size="large" onAction="CopyActiveSheet" imageMso="WebServerDiscussions" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

这是一个创建新选项卡的例子,会在Excel顶部的ribbon最末,插入这个labelFormatting的tab,tab下有5个group,group里又分别是各个按钮,结构还是非常简单的。

对于按钮,注意确保id的唯一性,onAction对应为VBA中的Sub/macro名,imageMso为按钮的icon,可以很方便地在搜索引擎获得(例如对于Excel 2016:BERT ImageMSO List Reference)。

如果你保存为.xlam并已经加载到Excel加载项,在RibbonX Editor中保存后再次打开Excel时即可看到新建的tab。

此时点击这些按钮会报错,因为还没有将按钮与Sub/macro相链接。

修改Sub/macro #

为了让按钮和你的Sub/macro对应,需要在你不传参的Sub/macro头部()内加入control As IRibbonControl,例如:

Sub CenterAcross(control As IRibbonControl)
	...
End Sub

保存后点击按钮,此时应该正常工作。

分享给其他人使用,只需要分享该.xlam,让其在自己的Excel加载项中加载即可。

下载这个例子 #

你可以在这里下载我的例子,它包括这些小功能:

Comment

Login via Github
No Login
Webmention

What is Webmention?

Hypothes.is