使用VBA在工作表中添加数据有效性

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 5.00 out of 5)
Loading ... Loading ...

本文来源于JP的博客,略有删节。原文请见Add Data Validation to any worksheet using VBA
本文展示了一个简单的VBA程序,用于在任何工作表中设置数据有效性。
这个程序接受需要设置数据有效性的所有参数,就像人工设置数据有效性一样。

Sub AddValidation(targetRange As Excel.Range, validationType As XlDVType, _
                       AlertStyle As XlDVAlertStyle, Optional shwErr As Boolean = True, _
                       Optional errMsg As String, Optional errTitle As String, _
                       Optional shwinp As Boolean = False, Optional inpmsg As String, _
                       Optional inptitle As String, Optional igblank As Boolean = True, _
                       Optional dropdown As Boolean = True, _
                       Optional Operator As XlFormatConditionOperator, _
                       Optional Formula1 As Variant, Optional Formula2 As Variant)
 
    Dim currentValidation As Excel.Validation
    Dim op As XlFormatConditionOperator
 
    ' 捕获Validation对象
    Set currentValidation = targetRange.Validation
 
    ' 如果数据有效性类型是"序列"或"自定义", 操作符必须是"介于"
    If (validationType = xlValidateList Or validationType = xlValidateCustom) Then
        op = xlBetween
    Else
        op = Operator
    End If
 
    ' 如果操作符是"介于" 或 "未介于" (不是序列或自定义),
    ' 那么必须指定Formula2
    If (op = xlNotBetween Or op = xlBetween) Then
        If (validationType <> xlValidateList And validationType <> xlValidateCustom) Then
            If IsMissing(Formula2) Then
                MsgBox "如果操作符是'介于'或者'未介于'并且类型不是'序列'或'自定义'," & _
                    "那么必须指定Formula2."
                Exit Sub
            End If
        End If
    End If
 
    ' 如果有任何数据有效性,则删除
    currentValidation.Delete
 
    ' 创建新的数据有效性
    With currentValidation
        .Add validationType, AlertStyle, op, Formula1, Formula2
 
        ' 错误消息
        .ShowError = shwErr
        .ErrorMessage = IIf(shwErr, errMsg, "")
        .ErrorTitle = IIf(shwErr, errTitle, "")
 
        ' 输出消息
        .ShowInput = shwinp
        .InputMessage = IIf(shwinp, inpmsg, "")
        .InputTitle = IIf(shwinp, inptitle, "")
 
        .IgnoreBlank = igblank
        .InCellDropdown = dropdown
    End With
 
End Sub

上述程序接受下列参数:
• 希望添加数据有效性的单元格区域,
• 希望的有效性类型(一个内置常量),
• 警告样式(另一个内置常量),
• 是否希望显示错误信息框,
• 错误消息文本,
• 错误消息框标题,
• 是否希望在输入数据有效性单元格时显示消息框,
• 输出消息文本,
• 输出消息框的标题,
• 是否希望忽略空单元格,
• 是否希望在选择数据有效性单元格时显示下拉箭头,
• 使用的操作符(另一个内置常量),
• 最后是两个变量,包含希望是有效性一部分的公式或值。
这个程序首先捕获相应的Range.Validation对象,然后检查有效性类型。如果是“序列”或“自定义”,操作符参数必须是“介于”。可以在数据有效性对话框中查看,当选择类型时,如果是“序列”或“自定义”,操作符框中变为“介于”并且不能修改:

如果有效性类型不是“序列”或“自定义”,并且操作符是“介于”或“未介于”,那么必须指定参数Formula2(因为这是唯一需要值区域的两个操作符)。
一旦检查完毕,就清除已存在的有效性(Validation.Delete)。然后在调用该过程时使用指定的参数添加新的Validation对象。
使用示例

Sub TestAddValidation()
 
    Dim rng As Excel.Range
 
    Set rng = Range("A1:A100")
 
 
    'My_Data_Range为定义的名称
    AddValidation rng, xlValidateList, _
        xlValidAlertStop, , "Don't enter bad numbers!", "Bad number", , , , , , xlBetween, "=My_Data_Range"
 
End Sub

相关文章

最新版的Custom UI Editor工具

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

在OpenXMLDeveloper.org上看到的关于Office Ribbon开发工具的最新消息。
Office 2010引入了新的自定义UI XML架构来支持新的功能扩展。最新版的Custom UI Editor工具添加了对该架构最新版的支持。同时,也添加了基本的撤销/恢复功能,并且修复了以前版本所暴露的一些问题。

与本次更新相关的一些有用的资源:

  • 后台视图扩展,参见这篇技术文章
  • 上下文菜单扩展,参见这篇技术文章
  • Office 2010应用程序完整的控件标识符列表,在这里下载。
  • 可用于Office 2010扩展的完整的图标标识符列表,在这里下载。

可以到上面列了的官方网站上下载该编辑器,也可以在此下载:

相关文章

C#之父Anders Hejlsberg演讲解读:编程语言大趋势

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

[转载]C#之父Anders Hejlsberg演讲解读:编程语言大趋势
——基于对C#之父Anders Hejlsberg演讲的总结
文 / 赵劼
程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直是个二等公民。国内的计算机教育和工程培训,似乎一直在宣传“语言不重要,重要的是思想”、“语言一通百通”等观点,甚至在许多人眼中,语言的讨论完全是不入流的,但其实编程语言与工具、框架或开发方法等一样,都对生产力有着重要的影响。事实上,语言的发展历史比其他方面更为悠久,并且在过去十几年,甚至最近几年中都依然在不断的碰撞和演变。期间一些新的语言诞生了,而另一些在当时看来阳春白雪的语言和编程范式也重新获得了重视。
Anders Hejlsberg是微软的Technical Fellow,担任C#编程语言的首席架构师,也参与了.NET Framework、VB.NET和F#等语言的设计与开发。几个月前,Anders在比利时TechDays 2010及荷兰DevDays 2010分别作了一场演讲,阐述了他眼中的编程语言的发展趋势及未来方向,本文便对他的观点进行了总结。
大约25~30年前,Anders开发了著名的Turbo Pascal,这是一套集语言、编译器及开发工具于一体的产品,也是Anders进入编程语言领域的起点。Anders谈到,当年Turbo Pascal所用的Z-80和如今的计算机已经不可同日而语。与那时相比,如今的机器已经有大约10万倍的外部存储容量,1万倍的内存大小,CPU速度也有大约1000倍的提高。但是,如果我们比较如今的Java代码及当年的Pascal代码,会发现它们的差别其实并不大。Anders认为编程语言的发展非常缓慢,期间当然出现了一些东西,例如面向对象等,但是远没有好上1000倍。事实上,近几十年来的努力主要体现在框架及工具等方面(如图1)。例如.NET Framework里有超过一万个类和十万个方法,与Turbo Pascal相比的确有了超过1000倍的增长。类似的,现在的IDE包含了无数强大的功能,例如语法提示、重构、调试器等。与此相比,编程语言的改进的确很不明显。

图1 近几十年来语言、框架及工具的发展
在过去50~60年的编程历史中,编程语言的抽象级别不断提高,人们都在努力让编程语言更有表现力,这样就可以用更少的代码完成更多的工作。我们一开始使用汇编,然后使用面向过程的语言(如Pascal和C),然后是面向对象语言(如C++),随后便进入了托管时代,语言运行于受托管的执行环境上(如C#和Java),它们的主要特性有自动垃圾收集、类型安全等。Anders认为这样的趋势还会继续下去,还会有抽象级别越来越高的语言。另一方面,编程语言往往都倾向于构建于现有的工具上,而不会从头写起。现在出现的编程语言,例如F#、Scala和Clojure等,都是基于现有框架构建的,每次从头开始的代价实在太高。
在Anders眼中,如今影响力较大的趋势主要有三个(如图2),分别是声明式的编程风格(包括领域特定语言、函数式编程)、动态语言(最重要的方面是元编程能力)以及多核环境下的并发编程。此外随着语言的发展,原本常用的面向对象语言、动态语言或是函数式等边界也变得越来越模糊,例如各种主要的编程语言都受到函数式语言的影响。因此,多范式程序设计语言也是一个愈发明显的趋势。

图2 影响力较大的三个趋势

声明式编程与DSL
目前常见的编程语言大都是命令式(Imperative)的,例如C#、Java或C++等。这些语言的特征在于,代码里不仅表现了“做什么(What)”,而更多表现出“如何(How)完成工作”这样的实现细节,例如for循环、i += 1等,甚至这部分细节会掩盖我们的最终目标。在Anders看来,命令式编程通常会让代码变得十分冗余,更重要的是由于它提供了过于具体的指令,这样执行代码的基础设施(如CLR或JVM)没有太多发挥空间,只能老老实实地根据指令一步步地向目标前进。例如,并行执行程序会变得十分困难,因为像“执行目的”这样更高层次的信息已经丢失了。因此,编程语言的趋势之一,便是能让代码包含更多的“What”,而不是“How”,这样执行环境便可以更加聪明地去适应当前的执行要求。
关于声明式的编程风格,Anders主要提出了两个方面,第一个方面是DSL(Domain Specific Language,领域特定语言)。DSL不是什么新鲜的玩意儿,我们平时经常接触的SQL、CSS、正则表达式等都属于DSL。有的DSL可能更加专注于一个方面,例如Mathematica、LOGO等。这些语言的目标都是特定的领域,与之相对的则是GPPL(General Purpose Programming Language,通用目的编程语言)。Martin Fowler将DSL分为外部DSL和内部DSL两种。外部DSL有自己的特定语法、解析器和词法分析器等,它们往往是一种小型的编程语言,甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。内部DSL其实更像是种别称,它代表一类特别API及使用模式。
XSLT、SQL等都可以算作是外部DSL。外部DSL一般会直接针对特定的领域设计,而不考虑其他方面。James Gosling曾经说过:每个配置文件最终都会变成一门编程语言。一开始你可能只会用它表示一点点东西,慢慢地你便会想要一些规则,而这些规则则变成了表达式,后来你可能还会定义变量,进行条件判断等,而最终它就变成了一种奇怪的编程语言。这样的情况屡见不鲜。现在有一些公司也在关注DSL的开发。例如以前在微软工作的Charles Simonyi提出了Intentional Programming的概念,还有JetBrains公司提供了叫做MPS(Meta Programming System)的产品。最近微软也提出了自己的Oslo项目,而在Eclipse世界里也有Xtext,所以如今在这方面已经有不少尝试。由于外部DSL的独立性,在某些情况下也会出现特定的工具,辅助领域专家或是开发人员编写DSL代码。还有一些DSL会以XML方言的形式提出,利用XML方言的好处在于有不少现成的工具可用,这样可以更快地定义自己的语法。
内部DSL往往只代表一系列特别的API及使用模式,例如LINQ查询语句及Ruby on Rails中的Active Record声明代码等。内部DSL可以使用一系列API来“伪装”成一种DSL,利用一些流畅化的技巧,例如像jQuery那样把一些方法通过“点”连接起来,而另一些也会利用元编程的方式。内部DSL还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全、重构等母语言的所有特性。
DSL的可读性往往很高。例如,要筛选出单价大于20的产品,并对所属种类进行分组,降序列出每组的分类名称及产品数量。如果是用命令式的编程方式,可能是这样的:
var groups = new Dictionary();
foreach (Product p in products)
{
if (p.UnitPrice >= 20)
{
if (!groups.ContainsKey(p.CategoryName))
{
Grouping g = new Grouping();
g.Name = p.CategoryName;
g.Count = 0;
groups[p.CategoryName] = g;
}
groups[p.CategoryName].ProductCount++;
}
}
var result = new List(groups.Values);
result.Sort(delegate(Grouping x, Grouping y)
{
return
x.Count > y.Count ? -1 :
x.Count < y.Count ? 1 : 0; }); 显然这些代码编写起来需要一点时间,且很难直接看出它的真实目的,换言之,“What”几乎完全被“How”所代替了。这样,一个新的程序员必须花费一定时间才能理解这段代码的目的。但如果使用LINQ,代码便可以改写成:
var result = products .Where(p => p.UnitPrice >= 20)
.GroupBy(p => p.CategoryName)
.OrderByDescending(g => g.Count())
.Select(g => new { Name = g.Key, Count = g.Count() });
这段代码更加关注的是“How”而不是“What”,它不会明确地给出过滤的操作方式,也没有涉及到创建字典这样的细节。这段代码还可以利用C# 3.0中内置的DSL,即LINQ查询语句来改写:
var result =
from p in products
where p.UnitPrice >= 20
group p by p.CategoryName into g
orderby g.Count() descending
select new { Name = g.Key, Count = g.Count() };
编译器会简单地将LINQ差距语句转化为前一种形式。这段代码只是表现出最终的目的,而不是明确指定做事的方式,这样便可以很容易地并行执行这段代码,如使用PINQ则几乎不需要做出任何修改。

函数式编程
Anders提出的另一个重要的声明式编程方式便是函数式编程。函数式编程历史悠久,如当年的LISP便是函数式编程语言。除了LISP以外还有其他许多函数式编程语言,如APL、Haskell、ML等。函数式编程在学术界已经有过许多研究,大约在5~10年前许多人开始吸收和整理这些研究内容,想要把它们融入更为通用的编程语言。现在的编程语言,如C#、Python、Ruby、Scala等,都受到了函数式编程语言的影响。
使用命令式编程语言写程序时,我们经常会编写如x = x + 1这样的语句,此时我们大量依赖的是可变状态,或者说是变量,它们的值可以随程序运行而改变,可变状态非常强大,但随之而来的便是“副作用”问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果。而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的。事实上对函数式编程的讨论更像是数学、公式,而不是程序语句,如x = x + 1对于数学家来说,似乎只是个永不为真的表达式而已。
函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结果。假如两个函数完全无关,那么它们是并行还是顺序执行便没有什么区别。当然,现实中的程序一定是有副作用的,例如向屏幕输出内容,向Socket传输数据等,因此真实世界中的函数式编程往往都会考虑如何将有副作用的代码分离出来。函数式编程默认是不可变的,开发人员必须做些额外的事情才能使用可变状态或是危险的副作用,与之相反,C#或Java必须使用readonly或final来做到这一点。此时,使用函数式编程语言时的思维观念便会有所不同。……(完整文章请关注08期杂志)

未完的部分还有这些内容:
动态语言与元编程
并发
总结

(本文来自《程序员》杂志10年08期,更多精彩内容敬请关注08期杂志)

相关文章

试用Excel Web App

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

今天终于给换了一台新计算机,DELL Optiplex 780,Windows 7专业版,装上了Office 2010。于是,想试试Office Web App。
进入http://office.live.com后,出现下面的提示:

单击“开始使用”,可以看到右侧出现:

单击“Excel图标”,出现:

单击“保存”,打开Excel Web App界面:

输入数据,并使用简单的公式:

不需要保存文档,因为会为您自动保存到服务器。
可以单击“在Excel中打开”,从而在本地打开文档编辑,此时要求提供ID凭据:

输入好邮件地址和密码后,单击“确定”,在本地打开该Excel工作簿:

可以在本地进行编辑,然后点击保存按钮,此时会自动保存到服务器中。

当然,也可以将该文档另存到本地计算机中。保存该文档后,关闭。回到Windows Live网络,此时可以看到:

单击“在浏览器中编辑”,出现:

可以看到,在本地进行编辑的内容已经更新到服务器上。
当然,还可以设置编辑权限、设置链接,以及下载该文档,等。
回到主页面,发现多了下面的内容:

总之,初次使用,感觉很不错!

随机日志

Rob Pike谈论为什么Google要开发新的Go语言

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

Rob Pike总是会在恰当的地方做事。在80年代初期,他在贝尔实验室与Brian Kernighan以及Ken Thompson一起工作,与Kernighan合写了“UNIX编程环境”,并与Thompson合作开发了UTF-8 字节编码标准。Pike现在是Google的一个首席工程师,并与人合作开发了Go,一个新的编程语言。Pike将在下月的OSCON大会上讨论Go,他也在下面的采访中谈论了Go的开发以及编程语言的当前状态。

创建Go语言的动机是什么?
Rob Pike:几年以前,我们在Google的几个人开始对软件开发过程感到沮丧,尤其是在使用C++编写大型的服务器软件时更是如此。我们发现二进制文件变得越来越大。他们需要花费太多的时间去编译。此语言几乎是当前世界上主要的系统软件语言,其本身已经是一种非常老旧的语言了。最近二十年来许多在硬件上的思想和变化都未能影响C++。于是我们决定着手从新设计设计一种能解决我们问题的语言:我们需要快速地构建软件,使其能在现代的多核心硬件和网络环境中运行良好,并且做到快乐编程。
尽管我们针对一些特定的问题来设定Go的目标,它已经变成一个比我们最初的设想更加通用和适用的编程语言。因此我们现在正使用它做许多不同的事情。我认为它应该在多个方向上都有美好的未来。

使用Go编程会感觉如何呢?
Rob Pike:Go具有动态语言如Python、Ruby或JavaScript的味儿,但它同时具有像Java、C或C++类语言的性能和安全性。这样你会感觉就像在使用一个轻量级的现代的脚本动态语言,但同时获得了传统语言的健壮性和性能。

Go是否具有一个强大的开发环境?
Rob Pike:我们有一套与此语言配合使用的有趣的工具。其中发布版本的标准库就有完整性分析器。因此依据问题的复杂程度,你可以编写你自己的工具,也许在使用已有库时只需要一页代码。
有一些工具可以使你与已有的库连接。对于大型的如OpenGL一类的包,你最好是仅仅连接使用已有的东西。我们可以使用我们的封装工具来做这些事,另外SWIG支持使得我们能与C++连接。但所有的基类库都是由Go编写的。
已经有了针对Eclipse以及其他环境的插件。但还需要更多的工作,我们尚没有一个IDE,我们已经有了做这些事情的一些想法。

世界上还需要另外一个编程语言吗?
Rob Pike:这是一个关于语言的愉快时光,因为已经产生了如此众多的语言。60年代末到70年代初是语言开发的爆发期,接下来则一切归于平静。这并不是说没有出现新的语言,而是语言的设计似乎都无功而返。然而在最近的5到10年,又一次出现了复兴。我将在OSCON上谈论这种现象的原因之一,便是当前常用的语言并不能满足人们的需求。这里有新语言的生存之所,在这些方面Java、C、C++、JavaScript甚至Python都不能很好的满足需求。

Google与贝尔实验室比起来怎么样呢?
Rob Pike:这两方面都已经发生了很多改变。当我在贝尔实验室工作时,我们做了许多研究驱动的、出版导向的事情。在很大程度上,此公司不理解开源。当我到Google后,方向则变得非常不同。我们完全是一个试图让事情实现的公司。至少在后来,开源变成了公司文化的一个基本部分。因此在这方面他们是非常不同的。
随着一天天的工作进展,我认为他们有许多共通点。他们都是令人向往的工作地点,他们都具有许多聪明的人们。但在文化上,他们是通讯公司和互联网公司的差别。他们从根本上是两回事。
注:本文系转载自网络,辑录于此,供今后参考。

相关文章

Page 1 of 5112345102030...Last »