注~册 登录
咖啡日语论坛 返回首页

shirogumo的个人空间 http://www.coffeejp.com/bbs/?102113 [收藏] [复制] [RSS]

日志

[禁止转载]我家咪咪二三事(chapter6)

已有 921 次阅读2008-10-14 23:49 |个人分类:咪咪和狗狗|


智力差距


         咪咪的聪明是毋庸置疑的。下面这个例子,可以充分的说明小丫头的智商和我之间的鸿沟。

 

         有一天,我的高中同学得知我略通excel VBA,于是托我帮一个忙,希望实现如下表格中载频总数一栏的自动计算(其值为载频配置一栏对应单元格表达式的和)。表格如下:

基站名称

经度

纬度

方向角

载频配置

载频总数

聊大北门

115.99311

36.44157

0/120/240

2+1+2

 

二中

116.00725

36.44651

0/120/241

2*2+3+2

 

开发区日报社

116.02548

36.45821

0/120/242

1+2*4+2*5

 

东昌府区广电

115.98436

36.43264

0/120/243

2+1+2

 

区水利局

115.94927

36.44596

0/120/244

2*3+2+3*3

 

火车站

115.93947

36.45483

0/120/245

4

 

合计

---

---

---

---

0

 

         我先试了一下,发现excel好像没有简单的方法能够计算一个文本字符串的值,然后很自然的想到了——

 

第一种方法(笨办法):解析字符串!把字符串里面所有的“+”都找出来,解析出“+”号前后的字符串,把它们加起来。鉴于要考虑到的情况,还要同时解析出“*”号前后的字符串,把它们乘起来,同时还要考虑到先乘后加……我花了两个小时才调试出来,VBA代码如下:

 

Sub Calculate()

 

    Dim iConfigureColumnNumber, iSumColumnNumber As Integer

    Dim iTotalRow, iTotalColumn As Integer

   

    Dim iPlusSignNumber As Integer

    Dim iTimesSignNumber As Integer

    Dim oCollection1 As New Collection

    Dim oCollection2 As New Collection  'Store times member

    Dim oCollection3 As New Collection

   

    iConfigureColumnNumber = 5

    iSumColumnNumber = 6

   

    iPlusSignNumber = 0

    iTimesSignNumber = 0

   

    Dim oRange As Range

    Set oRange = Application.ActiveSheet.UsedRange

   

    iTotalRow = oRange.Rows.Count

    iTotalColumn = oRange.Columns.Count

   

    Dim StrText As String

    Dim i, j, k As Integer

    Dim iResult As Integer

    Dim iStartNumber As Integer

    Dim StrTempText As String

   

    Dim iNumber As Integer

    iNumber = 1

   

    For i = 2 To (iTotalRow - 1) Step 1

        iResult = 0

        iStartNumber = 1

        StrText = Trim(oRange.Cells(i, iConfigureColumnNumber))

        Do While (InStr(iStartNumber, StrText, Chr(43), vbTextCompare) <> 0)

            iResult = InStr(iStartNumber, StrText, Chr(43), vbTextCompare)

            StrTempText = Mid(StrText, iStartNumber, iResult - iStartNumber)

            Call oCollection1.Add(StrTempText)

            iStartNumber = iResult + 1

            iPlusSignNumber = iPlusSignNumber + 1

        Loop

        StrTempText = Mid(StrText, iStartNumber, Len(StrText) - iResult)

        Call oCollection1.Add(StrTempText)

       

        For j = 1 To oCollection1.Count Step 1

            StrText = oCollection1.Item(j)

            iStartNumber = 1

            iResult = 0

            Do While (InStr(iStartNumber, StrText, Chr(42), vbTextCompare) <> 0)

                iResult = InStr(iStartNumber, StrText, Chr(42), vbTextCompare)

                StrTempText = Mid(StrText, iStartNumber, iResult - iStartNumber)

                Call oCollection2.Add(StrTempText)

                iStartNumber = iResult + 1

                iTimesSignNumber = iTimesSignNumber + 1

            Loop

            StrTempText = Mid(StrText, iStartNumber, Len(StrText) - iResult)

            Call oCollection2.Add(StrTempText)

           

            Dim iTotal As Integer

            iTotal = 1

            For k = 1 To oCollection2.Count Step 1

                Dim iTemp As Integer

               

                iTemp = oCollection2.Item(k)

                iTotal = iTotal * iTemp

            Next

           

            oCollection3.Add (iTotal)

           

            iNumber = oCollection2.Count

            For k = 1 To iNumber Step 1

                oCollection2.Remove (oCollection2.Count)

            Next

           

        Next

 

        iNumber = 0

        For j = 1 To oCollection3.Count Step 1

            iNumber = iNumber + oCollection3.Item(j)

        Next

        oRange.Cells(i, iSumColumnNumber) = iNumber

       

        iNumber = oCollection1.Count

        For j = 1 To iNumber Step 1

            oCollection1.Remove (oCollection1.Count)

        Next

       

        iNumber = oCollection2.Count

        For j = 1 To iNumber Step 1

            oCollection2.Remove (oCollection2.Count)

        Next

       

        iNumber = oCollection3.Count

        For j = 1 To iNumber Step 1

            oCollection3.Remove (oCollection3.Count)

        Next

       

    Next

   

End Sub

 

第二种方法(聪明办法):就在我绞尽脑汁调试时,在旁边看电视的咪咪看见我痛苦的表情,于是走过来询问了一下我的情况。听完我大致介绍,小丫头轻松的说道:哪里用得着那么复杂,在文本的前面加个= 号,excel不就自己就会算出来了么?我恍然大悟,试了一下,果然几行代码就搞定……VBA代码如下:

 

Sub Calculate2()

 

    Dim iConfigureColumnNumber, iSumColumnNumber As Integer

    Dim iTotalRow, iTotalColumn As Integer

      

    iConfigureColumnNumber = 5

    iSumColumnNumber = 6

      

    Dim oRange As Range

    Set oRange = Application.ActiveSheet.UsedRange

   

    iTotalRow = oRange.Rows.Count

    iTotalColumn = oRange.Columns.Count

   

    Dim StrText As String

   

    Dim i As Integer

    For i = 2 To (iTotalRow - 1) Step 1

        StrText = "=" & oRange.Cells(i, iConfigureColumnNumber)

        oRange.Cells(i, iSumColumnNumber) = StrText

    Next

 

End Sub

 

         唉,正所谓事半功倍……要是早想到这个办法,我哪至于花这个冤枉时间呢,看来小丫头的智商果然是要远远超我老夫啊啊啊啊啊啊~~~~~


1

雷人

鲜花

鸡蛋

路过

握手

发表评论 评论 (1 个评论)

回复 harmona 2008-12-28 18:39
我的天啊!
基本没看……

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注~册

小黑屋|手机版|咖啡日语

GMT+8, 2024-4-29 03:55

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部