Excel时间问题——毫秒以及超过24小时的时间

最近,一位同事因工作需要,从自动存储数据的设备上导入了大量的数据到工作簿中,其中有一列是时间,但是时间含有毫秒,如下图1所示,要求将上下相邻两单元格相减。由于含有毫秒,减出来的结果显示#VALUE!(值错误),同时由于要将所有时间相加,获取相加后的结果,但是会得到看起来明显不正确的结果(当相加的值超过24后)。
下面是我的解决方法,如果哪位朋友有更好的方法,请告诉我。

图1
如上图所示,在单元格A1和A2中是带有毫秒的时间,当我在单元格B1中输入公式“=A2-A1”时,会出现错误提示#VALUE!。为此,我先在单元格C1和C2中提取时、分、秒并将其转换为时间数值;在单元格D1和D2中提取毫秒并将其也转换为时间数值;在单元格E1和E2中将刚才C列和D列中的单元格相加,得到带毫秒的时间数值;最后,在单元格F1中将E2的值减去E1的值,即为两者之差。同时,设置单元格F1的格式为“hh:mm:ss.000”。最终结果如上图1所示,其中所使用的公式如下图2所示。

图2
对于表示超过24小时的时间问题,将相应的单元格自定义格式设置就行了。如图3所示,有5个时间,相加后的结果为“14:00”,显然不正确。

图3
其实,只要将该单元格(此处为单元格A6)的格式设置为“[h]:mm”即可,如下图4所示。

图4

在Excel 2007中使用Excel 2003菜单和工具栏

如果您刚从Excel 2003及以前的版本转到Excel 2007,如果您还不太习惯Excel 2007的Ribbon,如果在Excel 2007中您还想使用Excel 2003的菜单和工具栏,那么andrewe给出了一种方法,使用VBA在Excel 2007中创建Excel 2003的菜单和工具栏,结果如下图所示。

在VBE中输入下面的代码:

Visual Basic:
  1. Option Explicit
  2.  
  3. Private Sub ShowOldStyleMenus()
  4. On Error Resume Next
  5. Dim cBar As CommandBar
  6. Dim cBarCtrl As CommandBarControl
  7. Dim sMenuName As String
  8. Dim sToolbarName As String
  9. Dim iMenu As Integer
  10.  
  11. sMenuName = "Old Style Menu"
  12. sToolbarName = "Old StyleToolbar"
  13.  
  14. CommandBars(sMenuName).Delete
  15.  
  16. Set cBar = CommandBars.Add(sMenuName, , , True)
  17.  
  18. With cBar
  19.  
  20. .Visible = True
  21.  
  22. For iMenu = 1 To 10
  23.  
  24. Set cBarCtrl = .Controls.Add(Type:=msoControlPopup, ID:=30001 + iMenu)
  25.  
  26. Next iMenu
  27.  
  28. Set cBarCtrl = .Controls.Add(Type:=msoControlPopup, ID:=30022) '图表
  29. Set cBarCtrl = .Controls.Add(Type:=msoControlPopup, ID:=30177) '自选图形
  30.  
  31. End With
  32.  
  33. CommandBars(sToolbarName).Delete
  34.  
  35. Set cBar = CommandBars.Add(sToolbarName, , , True)
  36.  
  37. With cBar
  38.  
  39. .Visible = True
  40.  
  41. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=2520) '新建
  42. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=23) '打开
  43. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=3) '保存
  44. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=4) '打印
  45. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=109) '打印预览
  46. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=2) '拼写检查
  47. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=21) '剪切
  48. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=19) '复制
  49. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=22) '粘贴
  50. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=108) '格式刷
  51. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=210) '升序排序
  52. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=211) '降序排序
  53. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=984) '帮助
  54. Set cBarCtrl = .Controls.Add(Type:=msoControlComboBox, ID:=1728) '字体
  55. Set cBarCtrl = .Controls.Add(Type:=msoControlComboBox, ID:=1731) '字号
  56. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=113) '加粗
  57. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=114) '倾斜
  58. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=115) '下划线
  59. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=120) '文本左对齐
  60. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=122) '居中
  61. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=121) '文本右对齐
  62. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=402) '合并及居中
  63. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=395) '会计数字格式
  64. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=396) '百分比样式
  65. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=397) '千位分隔样式
  66. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=398) '增加小数位数
  67. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=399) '减少小数位数
  68. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=3162) '减少缩进量
  69. Set cBarCtrl = .Controls.Add(Type:=msoControlButton, ID:=3161) '增加缩进量
  70.  
  71. End With
  72.  
  73. Set cBar = Nothing
  74. Set cBarCtrl = Nothing
  75.  
  76. On Error GoTo 0
  77. End Sub

注意,运行程序后,单击功能区“加载项”选项卡即可看到添加的菜单和工具栏。

酷!Excel表格里的MV

刚刚在cnBeta上看到的一则关于Excel的消息。一个字:酷!
在公司看MV怕被领导发现?公司的网络不能访问YouTube?或者你的网速强大到无法观看在线视频?那么试一试用Excel看MV吧.
诞生于70年代的澳大利亚老牌乐队AC/DC匠心独运地运用Microsoft Office Excel的xls文件演绎了其最新专辑的MV.用他们的话说,这是”THE WORLD’S FIRST MUSIC VIDEO IN AN EXCEL SPREADSHEET!”,世界上第一个Excel表格里的MV.

怎么样,够牛吧.当然,如果你不幸属于文章第一段所说的情况,那么你可以去下载演示视频里那个excel文件来看.http://www.acdcrocks.com/excel/
(注意,要想正常观看MV,需要打开Excel的宏选项.)

使用VBA编写数组函数及在VBA中使用数组公式

今天在整理电脑中文件夹时,偶然发现了这样一个工作簿示例,记不清以前是在哪里下载的了。该工作簿是关于使用VBA代码编写数组函数以及在VBA中使用数组公式的示例,并且使用VBA代码删除含有数组公式的区域。现将其贴于此,供参考。

如上图所示,在工作簿的Example工作表中有三个按钮,单击第一个按钮“重置工作表”将清除工作表中的所有数据和公式,并在单元格区域A1:A5中输入数据“1,2,3,4,5”;单击第二个按钮“输入数据公式”后,将在单元格区域C1:C5中输入数组公式{=ReverseRange(A1:A5)},ReverseRange函数为自定义函数,用于将指定区域的数据颠倒(即将原区域中从上到下的数据转为从下到上,或将自左至右的数据转为自右至左),并且在单元格区域E1:I1中输入数组公式{=TRANSPOSE(A1:A5)},用于将指定区域的数据转置;单击第三个按钮“删除第2行”后,将删除含有数组公式的区域中的数据。
“重置工作表”按钮对应的代码为:
Sub ResetSheet()
'清除工作表中所有公式并添加要处理的示例数据    Example.Cells.Clear
    Example.Range("A1:A5").Value = WorksheetFunction.Transpose(Array(1, 2, 3, 4, 5))

End Sub


“输入数据公式”按钮对应的代码为:
Sub EnterSampleArrayFormulas()
'使用代码输入数组公式示例
    
    Dim rng As Range    With Example.Range("E1:I1")
        If .HasArray Then .CurrentArray.Clear
        .FormulaArray = "=TRANSPOSE(A1:A5)"
    End With

    With Example.Range("C1:C5")
        If .HasArray Then .CurrentArray.Clear
        .FormulaArray = "=ReverseRange(A1:A5)"
    End With

End Sub


“删除第2行”按钮对应的代码为:
Sub RemoveRow2()
'示例:修改包含数组公式的单元格区域
'首先, 将数组公式转换成一组普通的公式.
'然后修改工作表,并恢复数组公式    Dim rng As Range
    
    Set rng = Example.Range("C1").CurrentArray
    rng.Formula = rng.FormulaArray
    Example.Rows(2).Delete
    rng.FormulaArray = rng.Cells(1, 1).Formula

End Sub


其中,调用了三个自定义的函数:IsInArray函数、ReverseArray函数和ReverseRange函数。
Public Function IsInArray(aryIn() As Variant, item As Variant) As Boolean
    '检查数据项是否在数组中    Dim i As Integer
    
    On Error Resume Next
    i = UBound(aryIn)
    If Err.Number <> 0 Then
        '没有初始化数组
        IsInArray = False
        Exit Function
    End If
    On Error GoTo 0
    
    For i = LBound(aryIn) To UBound(aryIn)
        If aryIn(i) = item Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False
    
End Function

Public Function ReverseArray(aryIn() As Variant) As Variant()
    '返回数组的转置

    Dim i As Integer
    Dim temp() As Variant

    On Error Resume Next
    i = UBound(aryIn)
    If Err.Number <> 0 Then
        '没有初始化数组
        ReverseArray = aryIn()
        Exit Function
    End If
    On Error GoTo 0
    
    ReDim temp(LBound(aryIn) To UBound(aryIn))
    For i = LBound(aryIn) To UBound(aryIn)
        temp(i) = aryIn(UBound(aryIn) + LBound(aryIn) - i)
    Next i
    ReverseArray = temp()
    
End Function

Public Function ReverseRange(rng As Range) As Variant()
    '一个UDF,返回单元格区域的镜像,即上下和左右反转

    Dim aryIn() As Variant
    Dim a As Variant
    Dim r As Integer, c As Integer
    Dim temp() As Variant
    
    '对于含单个单元格的区域, rng.Value不返回数组
    '因此,对这种情况单独处理.
    If rng.Cells.Count = 1 Then
        ReverseRange = Array(rng.Value)
        Exit Function
    End If
    
    aryIn = rng.Value
    ReDim temp(LBound(aryIn) To UBound(aryIn), _
               LBound(aryIn, 2) To UBound(aryIn, 2))
    '遍历数组中所有的行和列
    '并使用转置后的数据填充temp()
    For r = LBound(aryIn) To UBound(aryIn)
        For c = LBound(aryIn, 2) To UBound(aryIn, 2)
            temp(r, c) = aryIn(UBound(aryIn) + LBound(aryIn) - r, _
                               UBound(aryIn, 2) + LBound(aryIn, 2) - c)
        Next c
    Next r
    ReverseRange = temp()
    
End Function


示例工作簿下载:Arrays.xls

WordPress 开发者工具箱(下)

前天转载了cnBeta上的WordPress 开发者工具箱(上),下面是其第二部分,一并辑录于此,供日后学习参考.

这是 WordPress 开发工具箱的第二部分,包含 WordPress 官方资料库,空白主题,WordPress 设计灵感,图标库,WordPress 主题发布,以及免费与收费主题下载等资源。第一部分请参阅WordPress 开发者工具箱(上)

3. WordPress 官方资料库
官方的 WordPress Codex 包含大量有价值的开发者信息与资料。
Theme Development
WordPress 主题开发
The Loop
WordPress 主题系统中的 Loop 机制
Creating an Archive Index
Theme 开发中的存档机制
Customizing Your Sidebar
定制侧条
Conditional Tags
WordPress 主题设计中用到的条件标签
Stepping into Templates
WordPress 模板工作原理
Template Hierarchy
模板树状结构
Template Tags
模板中的标签
Using Custom Fields
WordPress 中的自定义内容区域
Search Engine Optimization for WordPress
WordPress SEO 相关知识与资料
4. 空白主题
Whiteboard
免费的 WordPress 主题框架
Starkers
全空的 WordPress 主题
Naked
入门级主题,包含最基本的式样
The Starter Theme Project
一个空白模板,可用作入门
5. WordPress 设计灵感
We Love WP
基于 WordPress 的网站展示库,更新非常迅速。
The Gallery at WPCandy
另一个基于 WordPress 的网站的展示库
Unmatched Style
这个网站展示库包含一个 WordPress 站点目录
CSS Glance
一个规模庞大的 WordPress 网站目录
45 Beautiful and Creative WordPress Designs
45个漂亮,富有创意的 WordPress 站点设计
25 Outstanding WordPress Designs
25个出色的 WordPress 站点设计
Creative Examples of WordPress Theme Modifications
一些 WordPress 主题的 Mod
60+ Unusual WP Blog Designs
60+不寻常的 WordPress 设计
6. WordPress 图标库
RSS: Best Design Practices and Icons
一套非常漂亮的 RSS-feed 图标
110+ Free RSS Icons to Show Off Your RSS Feed
110+ 免费 RSS feed 图标
Fresh, Free and Gorgeous RSS/Feed Icons
免费又漂亮的 RSS feed 图标
Cheers: A Free “Social” Icon Set
12个社会媒体玻璃杯图标
Feed Icons
标准 RSS feed 图标
7. 主题发布
Official WordPress Theme Directory
WordPress 官方主题,目前拥有约300个图标
Weblog Tools Collection
新主题,新插件消息发布
8. 免费主题