免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 6136|回复: 6
收起左侧

[经验分享] 教你如何通过Excel VBA编写测量坐标计算程序

[复制链接]

16

主题

179

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
106
发表于 2012-6-17 14:29 | 显示全部楼层 |阅读模式
本帖最后由 abcyt 于 2012-6-17 14:46 编辑

教你如何通过Excel VBA编写测量坐标计算程序

(入门篇)


摘  要:认识VBA、理解VBA,并利用Office Excel VBA编写测量坐标计算程序


关键词:Excel VBA 程序 坐标 编写



了解:VBA是什么?简单的说就是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案。可以用Excel的宏语言来使Excel自动化运行等……Microsoft让它开发出来的应用程序共享一种通用的自动化语言——Visual Basic For Application(VBA),可以认为VBA是非常流行的应用程序开发语言Visual Basic的子集,事实上VBAVB应用程序的版本,尽管存在有些不同VBAVB在结构上仍然十分相似。如果你已经了解VB会发现学习VBA非常快。相应的学完VBA会给学习VB打下坚实的基础



理由:选择Excel VBA编程的理由是因为它的计算功能非常强大,是现今任何编程计算器无法逾越的。它运用范围广,计算速度快,计算精度高,合理化显示等。或许很多测量人员对Excel VBA还有些陌生,主要是大家寄托于计算器、电脑、手机PDA等系列软件使用。Excel VBA对于大多数测量人员而没有系统学过计算机语言程序设计的人群来讲有一定含糊,不过只要有基本数学知识、测量常识和逻辑理解的人,都能通过Excel VBA编写设计出称心如意的测量程序。



目标:基于Excel VBA的测量坐标计算程序的设计目标是将繁琐计算过程转入到计算机中,利用程序语言的重复性原理,在计算机中可将坐标计算得出更精确的结果,使坐标计算更加可靠。最终目标是让用户可以通过Excel VBA自行完成坐标计算程序设计



认识:学习VBA到底需要什么基础和了解些什么?

学习VBA需要认识英文字母、一般的单词(如:函数所用的过程)、数学基础知识、测量常识、逻辑性思维即可。

VBA中需要了解VBA的过程、变量、属性、方法、事件、语句等。



Excel VBA程序可以分为录制宏、自定义函数,由于录制宏编写计算类程序它限制了计算涵式过程,而无法达到自定义数据直接运算的目的,所以大家可以通过按钮式点击进行自定义函数过程(还可以通过窗体定义过程)。




基本常识:



1、类型:常用类型分为Integer(整型)、Single (单精度型)、Double (双精度型)、String(字符串型)、Variant(数字)、Variant(字符)。



2、变量Dim 变量名 As 数据类型。例:Dim A As Double

定义变量除了可以使用Dim语句外,比较常的还有:static语句,Private语句,Public语句。



3、常量Const 常量名 As 数据类型 = 常量的值。例:Const PI =3.1415926535898

常量声明后不可对它再进行赋值。



4、If语句:

If  逻辑表达式 Then      ┆     If Q<0 Then

             语句块1     ┆            Q=-1

    Else             ┆        Else

             语句块2     ┆            Q=1

        End If           ┆        End If



5、Do循环语句:

Do Wihle 循环条件        ┆ Do While Cells(j, 1) <> Empty

          语句块1        ┆    X = N + (Cells(j, 1) - D) * Cos(F)

     [Exit Do]           ┆    Y = E + (Cells(j, 1) - D) * Sin(F)

          语句块2        ┆        j = j + 1

      Loop               ┆    Loop



6、调用单元格数值:

With Sheets("单元格名称")┆  With Sheets("坐标计算")

       N = .Cells(行, 列)┆         N = .Cells(3, 2)

       E = .Cells(行, 列)┆         E = .Cells(4, 2)

       D = .Cells(行, 列)┆         D = .Cells(5, 2)

       F = .Cells(行, 列)┆         F = .Cells(6, 2)

    End With             ┆      End With

说明:这里的.Cells(行, 列)表示调用Sheets("坐标计算")单元格中指定数值。



7、MsgBox事件语句:

Private Sub Workbook_Open()┆ Private Sub Workbook_Open()

    MsgBox "提示语句"      ┆     MsgBox "欢迎使用直线坐标计算程序!"

End Sub                    ┆ End Sub



主题:通过以上认识相信大家对VBA编程稍有认识与了解,现在将进行测量坐标计算程序设计。给大家讲解的是直线坐标中桩计算的程序如何编写与运算。



思路:根据单元格输入的已知数据并由With过程调用,建立Do循环计算模式自动填充待求点单元格坐标。



直线坐标计算原理:



如下图所示,已知直线的起点坐标O(xo,yo)、起点切线方位角ao、直线长度L。


直线的止点坐标Z(xz,yz)、止点方位角az计算如下:



已知计算数据:



输入直线要素
起点坐标xo
3378605.445
起点坐标yo
453648.704
起点桩号O
7586.707
计算方位角ao
98.565562



程序操作步骤:


1、设置表格框架(可以根据自己的要求设计),图示如下:



2、在菜单栏上面点击右键弹出下拉式对话框选中“Visual Basic”



3、调用后的Visual Basic菜单栏显示如下。



4、插入命令按钮(按钮主要用于鼠标点击时触发函数运行)。



5、插入命令按钮后样式,在上面点击右键命令按钮 对象编辑输入坐标计算名称(可以根据自己要求输入)。同样方法添加数据清除按钮。



6、在坐标计算按钮上面点击右键查看代码,即可进入代码编辑区域。同样方法编辑数据清除”按钮代码。



7、代码输入区域,在蓝色线条位置粘贴“VBA主要源码代码然后点击左上角Excel图标即可返回Excel电子表格界面。(这里还可以在VBAProject上面点击右键插入模块将代码粘贴到模块中通过路径指引,但是在这里就直接将代码粘贴在按钮内部减少了添加模块的繁琐)。



VBA主要源码:


Private Sub CommandButton1_Click()按钮下粘贴以下代码:


Option Explicit '显式声明模块中的所有变量


Private Sub CommandButton1_Click() '计算按钮

Dim j As Integer '                                                                             ═╮

Dim Ai, Bi, Ci, Di, Ei, Fi, Gi, Hi As Double '                                                   ║

Dim N, E, D, X, Y, F As Double '                                                                 ║定义变量

Const Pi = 3.14159265358979 '                                                                  ═╯

  With Sheets("坐标计算")

    If Trim(.Cells(3, 2)) = "" Then MsgBox "请输入“起点坐标X”!", vbInformation, "提示": Exit Sub '     ═╮

    If Trim(.Cells(4, 2)) = "" Then MsgBox "请输入“起点坐标Y”!", vbInformation, "提示": Exit Sub '       ║

    If Trim(.Cells(5, 2)) = "" Then MsgBox "请输入“起点桩号K”!", vbInformation, "提示": Exit Sub '       ║检测数据

    If Trim(.Cells(6, 2)) = "" Then MsgBox "请输入“起点方位角F”!", vbInformation, "提示": Exit Sub '   ═╯

        N = .Cells(3, 2) '                       ═╮

        E = .Cells(4, 2) '                          ║

        D = .Cells(5, 2) '                          ║调用已知数据

        F = .Cells(6, 2) '                       ═ ╯

        Gi = Int((.Cells(5, 2) + 10) / 10) * 10 ' ═╮

        Hi = .Cells(5, 2) + .Cells(7, 2) '          ║

        Fi = Abs(F) '                               ║

        Ai = Int(Fi) '                              ║

        Bi = (Fi - Ai) * 100 '                      ║

        Bi = Int(Bi) '                              ║

        Ci = (Fi - Ai) * 10000 - 100 * Bi '         ║六十进制转换为十进制

        Di = Bi + Ci / 60 '                         ║

        Ei = Ai + Di / 60 '                         ║

        If F < 0 Then '                             ║

          F = -Ei '                                 ║

        Else '                                      ║

          F = Ei '                                  ║

        End If '                                  ═╯

        F = F / 180 * Pi

    End With

    j = 9

  Do While Cells(j, 1) <> Empty '                ═╮

        X = N + (Cells(j, 1) - D) * Cos(F) '        ║

        Y = E + (Cells(j, 1) - D) * Sin(F) '        ║坐标计算核心

        Cells(j, 2) = Round(X, 3) '                 ║

        Cells(j, 3) = Round(Y, 3) '                 ║

     j = j + 1 '                                    ║

     Loop '                                         ║

End Sub '                                         ═╯



Private Sub CommandButton2_Click()按钮下粘贴以下代码:


              Private Sub CommandButton2_Click() '清除按钮

           Range("B9:C65536").ClearContents

              End Sub



VBA源码说明:


Option Explicit'显式声明模块中的所有变量;

Private Sub CommandButton1_Click() 'Private外部,可供类或是模块自身调用;Sub过程(不返回值)和函数(返回值)可将其视为类的方法;CommandButton1_Click() 计算按钮名称。

Dim j As Integer'定义整型变量;

Dim Ai,Bi,Ci,Di,Ei,Fi,Gi,Hi As Double'定义双精度变量;

Const Pi=3.14159265358979'定义常量;

With Sheets("坐标计算")'介词;

If Trim(.Cells(3,2))=""Then MsgBox"请输入起点坐标X”",vbInformation,"提示":Exit Sub'Trim删除字符中空格;.Cells(3,2)调用表中的第三行第二列数值;MsgBox弹出窗口提示框;vbInformation弹出窗口类型;Exit Sub退出程序;

Gi=Int((.Cells(5,2)+10)/10)*10'Int将数字舍入到最接近的整数;

Fi=Abs(F)'Abs绝对值;

If F<0 Then

F=-Ei

Else

F=Ei

End If'F小于0F等于-Ei否则F等于Ei结束判断;

End With'结束介词语句;


j=9'循环定义,表示从第九行开始执行;

Do While Cells(j,1)<>Empty'Do While循环控制语句,用于首先执行一次循环体语句,然后开始测试循环条件,当条件为时继续循环的处理过程;

X=N+(Cells(j,1)-D)*Cos(F)

Y=E+(Cells(j,1)-D)*Sin(F)

Cells(j,2)=Round(X,3)

Cells(j,3)=Round(Y,3)

j=j+1'逐句循环,每成功运行一次即为循环一次,然后继续执行下一行。

Loop'当条件不满足时结束循环语句。

End Sub'退出Sub程序过程。


PrivateSubCommandButton2_Click()

Range("B9:C65536").ClearContents'清除区域B9:C65536中的内容。

End Sub



粘贴后的代码区域显示:



8、返回Excel表格后点击顶部按钮退出设计模式即可正常点击按钮。



9、在单元格中输入已知数据。



10、点击坐标计算按钮即可计算出以下坐标。



结论:

通过实践证明,在工作中知道已知测量数学模型并结合编程技术写一些程序对常用的数据处理能够高效的解决实际工作中出现的问题,从而使工作效率得以提高。



在这里或许有朋友要问为什么不编写复杂的曲线坐标计算程序?其实编写什么都一样,教你的只是一种方法,一种思路,如果你用心去学就算告诉你一个过程你就会懂里面的意思。所以功夫还得靠大家自己多加练习才能迈入编程的正常轨道。



提醒大家一句话:人人都是天才,只是你能否把空闲时间利用到有价值的基础之上?



程序源码文件下载地址: vba_zxzb.rar (585.21 KB, 下载次数: 221)

2

主题

1594

铜板

9

好友

助理工程师

Rank: 5Rank: 5

积分
215
发表于 2012-6-17 21:39 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

47

主题

3315

铜板

27

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
684
发表于 2012-6-17 22:06 | 显示全部楼层
谢谢共享!
回复 支持 反对

使用道具 举报

2

主题

3761

铜板

3

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
528
发表于 2012-7-13 10:40 | 显示全部楼层
太难了  看不懂
回复 支持 反对

使用道具 举报

0

主题

46

铜板

0

好友

技术员

Rank: 3Rank: 3

积分
53
发表于 2012-8-25 23:15 | 显示全部楼层
谢谢你的提醒
回复 支持 反对

使用道具 举报

7

主题

1818

铜板

62

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
456
QQ
发表于 2013-1-14 22:17 | 显示全部楼层
非常不错!!!!!!!谢谢楼主!!!!!!
回复 支持 反对

使用道具 举报

0

主题

1814

铜板

3

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
648
发表于 2013-1-21 21:12 | 显示全部楼层
{:soso_e100:}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表