may*_*lle 6 excel vba excel-2007 excel-vba
我是一名C#/ .NET开发人员,但对Excel编程或VBA不太熟悉.对于辅助项目,我有一个电子表格,非技术用户将使用该电子表格进行数据输入.稍后,这个电子表格将通过我编写的C#命令行程序导出为不同的格式,以便可以将数据转储到不同的系统中.
我需要准确输入数据值,就像命令行程序所期望的那样,因此由于拼写错误或轻微的措辞差异而导致的用户错误将是有问题的.我需要用户从可能的值中进行选择,而不是依赖于用户输入正确的值.
对于只能在单元格中具有单个值的列,我可以通过使用用户可以选择的下拉菜单来完成此操作.我是通过这里的说明做到的:
http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx
问题是,我有几个列,其单元格可以包含多个值,以逗号分隔.例如,我有一个"颜色"列.该列中的单元格的值可以是单色(例如"红色")或由逗号分隔的颜色列表(例如"红色,绿色,蓝色").理想情况下,我希望用户能够单击单元格并查看复选框列表,从中可以选择颜色,完成后,单元格将使用逗号分隔的颜色进行更新.
完成此任务的最佳方法是什么?我试过谷歌搜索,发现这个方法:
http://www.contextures.com/excel-data-validation-multiple.html
...允许从下拉菜单中选择多个项目,但这很不方便,因为每次需要添加其他项目时都必须重新打开下拉列表.复选框会更方便.这是可能的,如果是的话,怎么样?
试试这个:
Option Explicit
Dim fillRng As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LBColors As MSForms.ListBox
Dim LBobj As OLEObject
Dim i As Long
Set LBobj = Me.OLEObjects("LB_Colors")
Set LBColors = LBobj.Object
If Not Intersect(Target, [B2]) Is Nothing Then
Set fillRng = Target
With LBobj
.Left = fillRng.Left
.Top = fillRng.Top
.Width = fillRng.Width
.Visible = True
End With
Else
LBobj.Visible = False
If Not fillRng Is Nothing Then
fillRng.ClearContents
With LBColors
If .ListCount <> 0 Then
For i = 0 To .ListCount - 1
If fillRng.Value = "" Then
If .Selected(i) Then fillRng.Value = .List(i)
Else
If .Selected(i) Then fillRng.Value = _
fillRng.Value & "," & .List(i)
End If
Next
End If
For i = 0 To .ListCount - 1
.Selected(i) = False
Next
End With
Set fillRng = Nothing
End If
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我使用的OleObject
所述的MsForm.Listbox
类型.
首先设置你的Listbox OleObject
,这是在这里讨论的.
在上面的代码中,我将my命名Listbox
为LB_Colors
可以通过访问其属性来更改.
假设您设置了如下数据:
选择完成后,上面的代码执行.
如果选择等于B2
,ListBox
则将显示创建的对象.
我们将ListBox
对象位置(左侧,顶部)和宽度设置为相等,B2
使其看起来像下拉式.
然后,用户可以选择值.
当用户对选择已满意时,只需单击即可ListBox
.
选择将被写入,B2
并且ListbBox
将再次不可见,如下所示.
这是你在尝试的吗?
Excel 具有与 .NET 的 WinForms 项目类型类似的用户表单功能,并且它们的工作方式非常相似。在 Excel 的代码编辑器中,右键单击资源管理器窗口中的模块文件夹并添加用户窗体。设计师将展示它与 VS2013 中的相似(尽管不那么华丽)。这些表单也由事件类型系统运行。
您可以从任何带有 的子程序调用您的用户表单formName.Show
。
从那里开始,实现您的输入限制并将输入编入单元格所需的字符串中。
祝你好运!
补充:您可能需要设置一个工作表事件,以便激活特定单元格以打开表单。这样,他们只需单击单元格,而不必运行任何内容。
归档时间: |
|
查看次数: |
33613 次 |
最近记录: |