本类文章存档于 ‘VBA’ 分类目录.
2010年03月3日, 1:24 下午

Loading ...
这是Andy Pope贡献的一个示例,能够在用户窗体文本框中使用上下文菜单。如下图所示。

在这个示例中,使用类来为文本框添加上下文菜单。
这个类模块处理上下文菜单指令,捕获文本框中的右击操作,并处理剪切、复制和粘贴行为。类模块使用了用户窗体的ActiveControl对象。这段代码甚至可以处理诸如框架和多页等容器控件里的控件。
下面是用户窗体初始化代码,展示了定义和使用类对象是如此的简单。仅需要声明该对象,然后设置每个想要具有上下文菜单功能的文本框的引用。
Private m_colContextMenus As Collection
Private Sub UserForm_Initialize()
Dim clsContextMenu As CTextBox_ContextMenu
Set m_colContextMenus = New Collection
Set clsContextMenu = New CTextBox_ContextMenu
With clsContextMenu
Set .TBox = UserForm1.TextBox1
Set .Parent = Me
End With
m_colContextMenus.Add clsContextMenu, CStr(m_colContextMenus.Count + 1)
Set clsContextMenu = New CTextBox_ContextMenu
With clsContextMenu
Set .TBox = UserForm1.TextBox2
Set .Parent = Me
End With
m_colContextMenus.Add clsContextMenu, CStr(m_colContextMenus.Count + 1)
Set clsContextMenu = New CTextBox_ContextMenu
With clsContextMenu
Set .TBox = UserForm1.TextBox3
Set .Parent = Me
End With
m_colContextMenus.Add clsContextMenu, CStr(m_colContextMenus.Count + 1)
Set clsContextMenu = New CTextBox_ContextMenu
With clsContextMenu
Set .TBox = UserForm1.TextBox4
Set .Parent = Me
End With
m_colContextMenus.Add clsContextMenu, CStr(m_colContextMenus.Count + 1)
Set clsContextMenu = New CTextBox_ContextMenu
With clsContextMenu
Set .TBox = UserForm1.TextBox5
Set .Parent = Me
End With
m_colContextMenus.Add clsContextMenu, CStr(m_colContextMenus.Count + 1)
End Sub
示例下载:
2010年02月1日, 2:38 下午

Loading ...
据Excel产品团队博客的文章《Programmability Improvements in Excel 2010》,VBA增加了一些新功能。
将Excel 4宏迁移到VBA
在将VBA引入到Excel之前,有自已的宏工具,称之为Excel 4宏,在Excel宏工作表中使用。很多人都早已将他们的Excel 4宏迁移到VBA,然而,一些Excel 4宏的功能在VBA中消失了,这使得迁移发生了困难。
在Excel 2010中,目标是为必须完全将Excel 4宏迁移到VBA中的人移除任何现有的阻碍。这项工作通常分为两类:
- 在Excel的对象模型中添加新的对象、方法和属性,代表一些现有的而在VBA中没有等价的Excel 4宏函数。
- 改进VBA中页面设置操作的性能,提供Excel 4宏中PAGE.SETUP()功能相似的性能。
对图表和形状的宏录制
当Excel 2007引入新的图表引擎时,主要集中在现代化的图表和形状的渲染能力。由于这项工作巨大,因此必须作一些痛苦的取舍决定,这导致Excel 2007在图表和形状对象模型方面失去了与Excel 2003的兼容性,即宏录制能力。
在Excel 2010中,宏录制器又可用于图表格式了,Excel 2003中的绝大多数图表格式录制功能又回来了。(极少数例如,包括坐标轴文本格式)
64位支持和代码兼容性
Office 2010将发布32位版本和64位版本。因此,VBA7将随Office 2010发布,支持能够运行32位和64位Office的代码的开发。
2010年01月26日, 12:53 下午

Loading ...
这是以前收录的一段程序示例:
使用VBA在调用工作簿中打开被调用工作簿,并运行其中的宏。该宏将弹出一个消息框,如果用户没有响应,那么程序会在指定时间后自动响应。
调用工作簿中的程序代码如下:
Public Declare Function SetTimer& Lib "user32" (ByVal hwnd&, _
ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&)
Private Declare Function KillTimer& Lib "user32" (ByVal hwnd&, _
ByVal nIDEvent&)
Public Const NV_INPUTBOX As Long = &H5000
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
SendKeys "%Y"
KillTimer hwnd, idEvent
End Sub
Sub test()
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
Dim targetworkbook As Workbook
Dim usersave As VbMsgBoxResult
Set targetworkbook = Workbooks.Open("C:\test2.xls", UpdateLinks:=0)
Calculate
targetworkbook.Activate
SetTimer 0, NV_INPUTBOX, 1000, AddressOf TimerProc
Application.Run targetworkbook.Name & "!tester"
targetworkbook.Activate
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
假设被调用工作簿存储在C盘,工作簿名为test2.xls,那么其中的代码如下:
Sub tester()
TimedMsgBox
End Sub
Sub TimedMsgBox()
Dim cTime As Long
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
cTime = 5 '5 秒
Select Case WSH.Popup("Open an Excel file?!", cTime, "Question", vbOKCancel)
Case vbOK
MsgBox "你单击了确定"
Case vbCancel
MsgBox "你单击了取消"
Case -1
MsgBox "超时"
End Select
End Sub
运行调用工作簿中的程序后,被调用的工作簿test2.xls会被打开,并运行其中的程序,该程序会弹出一个消息框,如果用户没有响应该消息框,那么在5秒后,会自动响应,即弹出一个内容为“超时”的消息框。
2010年01月21日, 1:17 下午

Loading ...
今天,给大家分享Jan Karel Pieterse的作品:带有菜单栏的用户窗体。如下图所示。

示例文档下载:
2010年01月19日, 7:07 下午

Loading ...
有时,需要选中某列表框的的项目后,在另一列表框中显示该项目的具体内容,如下图1所示。

图1:两个列表框实现内容匹配
“专业工程”包括“建筑工程、装饰装修工程……”等,当选中项目列表框中的专业工程后,在分类列表框中显示相应的内容。同理,选择项目列表框中的措施项目后,在分类列表框中也会显示相应的内容。
第一步:准备数据
如下图2所示,在工作表Sheet1中输入下列数据。

图2:基础数据
将A列的数据命名为“项目”,将B列的数据命名为“专业工程”,将C列的数据命名为“措施项目”。注意,B列和C列的名称应与A列的数据相一致。
第二步:准备窗体界面
如图1所示,在用户窗体中放置两个标签控件、两个列表框控件,并将两个列表框控件分别命名为lbxItem和lbxCategory。
第三步:输入代码
在用户窗体代码模块中,输入下列代码:
Private Sub lbxItem_Change()
Dim rngCategory As Range
Set rngCategory = Sheet1.Range(Me.lbxItem.Value)
Me.lbxCategory.List = rngCategory.Value
End Sub
Private Sub UserForm_Initialize()
Dim rngItem As Range
Set rngItem = Sheet1.Range("项目")
Me.lbxItem.List = rngItem.Value
End Sub
运行后的最终效果如图1所示。当然,您可以在A列添加更多的项目数据,然后在C列、D列……添加相应的内容并以A列的数据命名,从而扩展本实例。
(注:网站空间被删前的文章,有一定的学习意义,故找出来重新贴出之)