复制文本框中的数据

有时,我们需要从用户窗体的文本框中复制数据,然后将其粘贴到其它地方。下面举例说明具体的操作方法。
示例一:如下图1所示,在示例窗体中有一个文本框和一个命令按钮。当窗体被激活时,文本框中自动显示文字“完美Excel”,单击“复制”按钮后,将文本框中的数据复制到剪贴板。

test11

test11

图1:带有文本框和命令按钮的用户窗体
首先,按图1设计好用户窗体界面。然后,在该用户窗体模块中,输入下列代码:
Dim myClipboard As New DataObject

Private Sub UserForm_Activate()
    Me.TextBox1.Value = “完美Excel”
End Sub

Private Sub CommandButton1_Click()
  With myClipboard
    .SetText Me.TextBox1.Text
    .PutInClipboard
  End With
End Sub

示例二:在用户窗体中有多个文本框,要求单击按钮后将有数据的文本框中的数据全部复制到剪贴板。

test21

test21

图2:带有6个文本框和1个命令按钮的用户窗体
首先,按图2设计好用户窗体界面。然后,在用户窗体模块中,输入下列代码:
Dim strUnion As String

Private Sub CommandButton1_Click()
    Dim dObj As DataObject
    With Me
        If Not .TextBox1 = Empty Then strUnion = strUnion & .TextBox1
        If Not .TextBox2 = Empty Then strUnion = strUnion & vbCrLf & .TextBox2
        If Not .TextBox3 = Empty Then strUnion = strUnion & vbCrLf & .TextBox3
        If Not .TextBox4 = Empty Then strUnion = strUnion & vbCrLf & .TextBox4
        If Not .TextBox5 = Empty Then strUnion = strUnion & vbCrLf & .TextBox5
        If Not .TextBox6 = Empty Then strUnion = strUnion & vbCrLf & .TextBox6
    End With
    
    Set dObj = New DataObject
    
    dObj.SetText strUnion, 1
    dObj.PutInClipboard
End Sub

基于单元格中的值加亮相应的单元格

用户的需求多种多样,问题也“千奇百怪”。看看下面的问题:
在工作簿中有两个工作表Sheet1和Sheet2,要求在工作表Sheet1中的某单元格中输入一个值后,工作表Sheet2中的相应单元格会基于这个值加亮相应的单元格。例如,在工作表Sheet1的单元格A2中输入值2,则在工作表Sheet2中从B2开始的两列单元格将加亮显示,即B2和C3加亮显示;在工作表Sheet1的单元格A3中输入值3,则在工作表Sheet2中从B3开始的三列单元格将加亮显示,即B3、C3和D3加亮显示,等等。如下图所示。
test1
图1:在工作表Sheet1中输入数值
test2
图2:在工作表Sheet2中的结果
在工作表Sheet1的代码模块中输入如下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
   Const WS_RANGE As String = “A:A”
   On Error GoTo ws_exit
   Application.EnableEvents = False
   If Not Intersect(Target, Me.Range(WS_RANGE)) Is Nothing Then
       With Target
         If IsNumeric(.Value) Then
           Worksheets(”Sheet2″).Cells(.Row, “B”).Resize(, .Value).Interior.ColorIndex = 38
         End If
       End With
    End If
ws_exit:
    Application.EnableEvents = True
End Sub

使用Excel工作表来安排工作——OnTime事件

前不久,有位朋友问:由于工作太多太杂,导致经常常忘记要做的事情,希望利用Excel工作表来定时提醒要进行的工作。也就是说,在到达某个时刻后,工作表中的文本框会自动显示该时刻应该做的工作。如下面的图1和图2所示,图1为工作安排表,A列为工作安排,B列为开始该工作的时间;图2为用于显示当前应进行的工作。
test1
图1:工作安排表,在A列中是工作安排,B列中是工作开始的时间。可根据需要修改和添加
test2
图2:显示当前工作的界面。单击“显示”按钮后程序开始工作,当达到某时刻后,文本框中会显示当前应进行的工作
(注:这只是示例,可以根据自已的实际需要在图1的工作表中增加工作安排及相应的时间)
程序代码如下:
Option Explicit
Sub DisplayData()
    Application.OnTime Now + TimeSerial(0, 0, 1), “ChangeText”
End Sub

Sub ChangeText()
    Dim rng As Range, rngFind As Range, rngValue As Range
    Dim rngStart As Range
    Dim dTime As Date
    Dim lLastRow As Long
    
    On Error Resume Next
    
    lLastRow = Sheet3.Range(”B65536″).End(xlUp).Row
    Set rng = Sheet3.Range(”B1:B” & lLastRow)
    dTime = Time
    Set rngFind = rng.Find(dTime)

    Sheet5.TextBox1.Value = rngFind.Offset(0, -1).Value
    DisplayData
End Sub

工作表中的“显示”按钮关联的子过程为“DisplayData”。

标签: 没有标签

显示满足条件的所有数据(表结构、VLOOKUP函数、MATCH函数等的使用)

对于VLOOKUP函数来说,其主要缺陷是仅能返回与查找条件相匹配的单条数据,不能够返回与某条件相匹配的所有数据,但其优势是能够相当容易地获取与所给条件相匹配的第一条数据,如下图1所示。
vlookup1
图1:使用VLOOKUP函数返回包含某顾客姓名相应的行中的数据是很容易的方式
正如上图所示,在Excel 2007中使用结构化引用,VLOOKUP函数不仅容易使用,而且可读性也很强。在示例中,将表Table1中第一列的值与单元格A9中的值相匹配,并从表中第3列返回值。但是,不能返回表中第二个与“Dan”相匹配的值。事实上,很多时候我们都会碰到这样的情况,我们想要返回与条件相匹配的所有值,但是VLOOKUP函数只能返回满足条件的第一个值。
下面,让我们看看如何从表中获取满足条件的所有数据。首先,准备一些要操作的数据。我们以Office自带的Northwind示例数据库的一部分数据来演示,将其中的部分数据导入Excel表中,如下图2、图3、图4所示。
vlookup2
图2:导入到工作表Customers中的“Customer”表并命名为“tblCustomers”
vlookup3
图3:导入到工作表Orders中的“Orders”表并命名为“tblOrders”
vlookup4
图4:导入到工作表Details中的“OrderDetails”表并命名为“tblDetails”
当然,上述数据都不需要自已手工输入,只需从Northwind数据库中导入即可。现在,希望选择订单号(Order Number)后,能够显示该订单的详细信息,如下图5所示。
vlookup5
图5:当选择某订单号后,会显示该订单的详细信息
下面是图5显示的界面的主要设计过程。
1、在工作表相应的单元格中输入下列字符:
B1:Order Number
C3:Order Information
C4:Customer
F4:Order Date
F5:Status
F6:Salesperson
F7:Ship Date
C10:Order Details
C11:Product
D11:Quantity
E11:Unit Price
F11:Discount
G11:Total Price
H11:Status ID
2、创建包含所有订单IDs的一个命名区域,将使用该名称在数据有效性中创建订单号的下拉列表。为此,单击“公式——定义名称”,在“新建名称”对话框中输入:
名称:OrderIds
引用位置:=tblOrders[ID]
注:数据有效性不能够引用不同工作表中的单元格区域,除非将该区域定义名称。
3、选择单元格D1,将其命名为rngOrderId。
4、选择单元格D1,单击“数据——数据有效性”,在“允许”中选择“序列”,在“来源”框中输入“=OrderIds”。
5、选择单元格C5,输入下列函数:
=VLOOKUP(rngOrderId, tblOrders, MATCH(C4, tblOrders[#标题], 0), FALSE)
6、与单元格C5中的函数相似,设置剩余单元格的查找函数。
C6:=VLOOKUP($C$5,tblCustomers,MATCH(”Address”,tblCustomers[#标题],0), FALSE)
C7:=VLOOKUP($C$5, tblCustomers, MATCH(”City”,tblCustomers[#标题],0), FALSE) & “, ” & VLOOKUP($C$5, tblCustomers, MATCH(”State”,tblCustomers[#标题],0), FALSE) & ” ” & VLOOKUP($C$5, tblCustomers, MATCH(”Zip”,tblCustomers[#标题],0), FALSE)
H4:=VLOOKUP(rngOrderId, tblOrders, MATCH(F4, tblOrders[#标题], 0), FALSE)
H5:=VLOOKUP(rngOrderId, tblOrders, MATCH(F5, tblOrders[#标题], 0), FALSE)
H6:=VLOOKUP(rngOrderId, tblOrders, MATCH(F6, tblOrders[#标题], 0), FALSE)
H7:=VLOOKUP(rngOrderId, tblOrders, MATCH(F7, tblOrders[#标题], 0), FALSE)
至此,完成了我们的界面的上半部分,如图6所示。
vlookup6
图6:已完成的查找界面
下面,让我们来看看将要使用的公式中的一些函数。
1、实际上,我们不会使用VLOOKUP函数。因为需要返回多个项目,因此需要一种方式来返回一组值,而VLOOKUP函数不允许这样做。相反,我们使用INDEX函数返回指定行和列交叉部分的值。
2、我们需要指定想要在单元格中显示的数组中的项目,这里可使用SMALL函数和ROW函数来实现。
3、我们希望如果在源数据中添加额外的列时确保数据能够自动调整,这里使用MATCH函数。
4、最后,我们希望有错误处理功能,这里使用IFERROR函数(这是在Excel 2007中新增的函数)来确保如果在计算中有错误将只是显示空单元格。
好了,先让我们来看看已经完成的函数,如下图7中的单元格C12所示(注意,这是一个数组公式,其左右两侧的花括号不需要自已输入。在输完公式后按下Ctrl+Shift+Enter组合键即可)。
vlookup7
图7:数组公式用于返回与特定值相匹配的第N项
这个公式看起来很复杂,为便于阅读,将其书写如下:
{
=IFERROR(
INDEX(tblDetails,
 SMALL(
IF(tblDetails[Order ID]=rngOrderId,
ROW(tblDetails[Order ID])-ROW(tblDetails[#标题])
),
ROW(1:1)
),
MATCH(C$11, tblDetails[#标题], 0)
),
“”)
}
首先,看看SMALL函数,该函数接受一组值并从中返回第N小的值。
SMALL(
IF(tblDetails[Order ID]=rngOrderId,
ROW(tblDetails[Order ID])-ROW(tblDetails[#标题])
),
ROW(1:1)
),
本例中,数组的值由IF函数确定。特别地,如果Details表中某行的Order ID与在下拉列表中选择的Order ID相等,那么添加该行的行号到数组值中。通过使用ROW函数,Excel能够自动调整公式来向下填充单元格。并且,通过使用结构化引用,使得工作表数据能够自动适应源数据的变化。
然后,再看看INDEX函数,该函数接受一个二维数据并返回数组中指定行列位置的值。
INDEX(tblDetails,
 SMALL(
IF(tblDetails[Order ID]=rngOrderId,
ROW(tblDetails[Order ID])-ROW(tblDetails[#标题])
),
ROW(1:1)
),
MATCH(C$11, tblDetails[#标题], 0)
),
我们已经知道,本例中的SMALL函数返回与输入的Order ID相匹配的Order Details列表中ROW(Nth)的值,这里是第一个值即行号。接着需要获取列号,即使用MATCH函数,本例中该函数接受C11的值并查找在Details表中有相同名称的列。
最后使用的是IFERROR函数,如果包含计算式发生错误,使用空字符串(””)替换错误值。
现在,选择单元格C12,拖动其右下角的填充柄至单元格H12。选择单元格区域C12:H12,拖动填充句柄向下10行或更多。那么,现在当我们改变Order ID时,将会自动更新相关信息。
vlookup8
图8:完成的界面表,使用数组公式向下填充以获取所有相关信息

摘自Excel Team Blog,本文有删节.
示例工作簿下载:Master-Detail

标签: 没有标签

微软推出Web版Office

据csdn消息.
北京时间10月29日,据国外媒体报道,微软周二在“专业开发者大会”(PDC)中宣布,Office下一次升级,将会包括一个能够在浏览器内编辑文字和处理表格的版本。这也就意味着,微软即将发布一款网络版的Office。
包括Word和Excel等程序在内的网络版Office,将把竞争目光直接投向类似于Google的同类产品。Google已经推出了包含文字处理、电子表格和其它工具的网络应用包,向微软Office发起了直接挑战。但是,微软对此的反应相对迟钝。由此可以看出,微软此前曾认为用户并不会很快由桌面软件转向网络应用。不过微软高管早在去年就已表示,该公司将提供可以扩展Office功能的网络服务。
截至目前,微软还没有透露该公司将在何时发布代号为“Office 14”的下一代Office。不过按照惯例,微软将在每2至3年,发布一款新版本的Office。微软当前版本的Office发布于2007年1月。微软表示,Office网络应用包将包括网络版Word、Excel、PowerPoint和OneNote。Office文档可以通过电脑、网络浏览器或是手机进行编辑和管理,适用于IE浏览器、Mozilla的火狐浏览器和苹果的Safari浏览器。
微软Office业务高级副总裁克里斯·卡帕塞拉(Chris Capossela)表示,“我们的竞争对手中,没有一个能够在手机、浏览器或是电脑上开发出比我们更好的办公软件。”市场分析师当前认为,在将移植Office到互联网上之后,微软企业应用将以收费网络服务的方式存在,而消费应用则采用广告支持的模式。除此之外,微软还正在扩大数据中心网络,为所有客户或应用提供存储空间。毫无疑问,微软此举是为了应对Google Apps和Google Docs的入侵。
Google Apps和Google Docs产生的营收无法同微软Office相提并论。微软Office上一财年的营收高达189亿美元,净利润达到124亿美元。不过行业趋势已经非常明显:用户喜欢免费产品,也喜欢通过互联网开展文档协作的方式。更为重要的是,用户不需要为此付费。
微软推出网络版Office的决定,并未令Google企业商务部门总经理戴维·吉罗亚德(David Girouard)感到吃惊。吉罗亚德说,在过去的18个月中,Google不断对Google Apps进行改进,就是为了防止微软推出网络版Office。截至目前,Google Apps的商业用户总数已达到1000万人。

据cnBeta消息:微软正式推出 Web 版 Office
消息一:
微软在 PDC08 上正式推出了 Web 版 Office ,一款轻量级 Word, Excel, PowerPoint 和 OneNote 的程序,用户可以通过浏览器创建,编辑和写作处理 Office 文档。很显然这是针对 Google Docs 而推出的。
微软将通过 Office Live 部署该 Web 版 Office,并有两个版本,一个是有广告的免费版,另一个是订阅版,还有针对企业用户的订阅授权。注意,微软将在今年年底推出其 Web 版 Office 的技术预览版。注册 Office Live Workspace 可以获得更多信息。
消息二:
微软周二展示了新版本的Office 14组件Word, Excel和PowerPoint运行在浏览器中的状况.
之前我们已经介绍过Office 14将可以成为一个Web App随处运行,预计2009年可发布Beta版本,微软将提供两种浏览器Office,分别是面向用户的Office Live和面向企业的SharePoint Server产品.这种概念和Google的免费办公程序非常相似,但微软能够把对文件的支持度做得更完美—因为Office就是他们发明的.一起来看图吧!
WebOffice1
WebOffice2
WebOffice3

标签: