本类文章存档于 ‘VBA’ 分类目录.

Page 1 of 1712345...Last »

在用户窗体文本框中创建上下文菜单

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... 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

示例下载:

相关文章

VBA7的新功能

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 4.00 out of 5)
Loading ... 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的代码的开发。

相关文章

让Excel自动响应消息框中的提示

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... 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秒后,会自动响应,即弹出一个内容为“超时”的消息框。

相关文章

带有菜单栏的用户窗体

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

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

相关文章

在一个列表框中显示另一列表框中的具体内容

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

有时,需要选中某列表框的的项目后,在另一列表框中显示该项目的具体内容,如下图1所示。
listboxselect1
图1:两个列表框实现内容匹配
“专业工程”包括“建筑工程、装饰装修工程……”等,当选中项目列表框中的专业工程后,在分类列表框中显示相应的内容。同理,选择项目列表框中的措施项目后,在分类列表框中也会显示相应的内容。
第一步:准备数据
如下图2所示,在工作表Sheet1中输入下列数据。
listboxselect2
图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列的数据命名,从而扩展本实例。
(注:网站空间被删前的文章,有一定的学习意义,故找出来重新贴出之)

相关文章

Page 1 of 1712345...Last »