找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 943|回复: 2

[原创]:编程基础 分享篇

[复制链接]
发表于 2006-7-7 15:12:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.1 VBA是什么

  直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得不学习一种不同的自动化语言.例如:可以用EXCEL的宏语言来使EXCEL自动化,使用WORD BASIC使WORD自动化,等等.微软决定让它开发出来的应用程序共享一种通用的自动化语言--------Visual Basic For Application(VBA),可以认为VBA是非常流行的应用程序开发语言VASUAL BASIC 的子集.实际上VBA是"寄生于"VB应用程序的版本.VBA和VB的区别包括如下几个方面:

  1. VB是设计用于创建标准的应用程序,而VBA是使已有的应用程序(EXCEL等)自动化
  2. VB具有自己的开发环境,而VBA必须寄生于已有的应用程序.
  3. 要运行VB开发的应用程序,用户不必安装VB,因为VB开发出的应用程序是可执行文件(*.EXE),而VBA开发的程序必须依赖于它的"父"应用程序,例如EXCEL.



  尽管存在这些不同,VBA和VB在结构上仍然十分相似.事实上,如果你已经了解了VB,会发现学习VBA非常快.相应的,学完VBA会给学习VB打下坚实的基础.而且,当学会在EXCEL中用VBA创建解决方案后,即已具备在WORD ACCESS OUTLOOK FOXPRO PROWERPOINT 中用VBA创建解决方案的大部分知识.

  * VBA一个关键特征是你所学的知识在微软的一些产品中可以相互转化.
  * VBA可以称作EXCEL的"遥控器".

  VBA究竟是什么?更确切地讲,它是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案.



   此外,如果你愿意,还可以将EXCEL用做开发平台实现应用程序.

  1.2 EXCEL环境中基于应用程序自动化的优点



  也许你想知道VBA可以干什么?使用VBA可以实现的功能包括:



  1. 使重复的任务自动化.
  2. 自定义EXCEL工具栏,菜单和界面.
  3. 简化模板的使用.
  4. 自定义EXCEL,使其成为开发平台.
  5. 创建报表.
  6. 对数据进行复杂的操作和分析.

  用EXCEL作为开发平台有如下原因:



  1. EXCEL本身功能强大,包括打印,文件处理,格式化和文本编辑.
  2. EXCEL内置大量函数.
  3. EXCEL界面熟悉.
  4. 可连接到多种数据库.

  用其他语言开发应用程序,一半的工作是编写一些基本功能的模块,包括文件的打开和保存,打印,复制等.而用EXCEL作为开发平台,则由于EXCEL已经具备这些基本功能,你要做的只是使用它.

  1.3 录制简单的宏



  在介绍学习VBA之前,应该花几分钟录制一个宏。
  新术语:"宏",指一系列EXCEL能够执行的VBA语句。
  以下将要录制的宏非常简单,只是改变单元格颜色。请完成如下步骤:



  1)打开新工作簿,确认其他工作簿已经关闭。
  2)选择A1单元格。调出"常用"工具栏。
  3)选择"工具"—"宏"—"录制新宏"。
  4)输入"改变颜色"作为宏名替换默认宏名,单击确定,注意,此时状态栏中显示"录制",特别是"停止录制"工具栏也显示出来。替换默认宏名主要是便于分别这些宏。
  ★ 宏名最多可为255个字符,并且必须以字母开始。其中可用的字符包括:字母、数字和下划线。宏名中不允许出现空格。通常用下划线代表空格。
  5)选择"格式"的"单元格",选择"图案"选项中的红色,单击"确定"。
  6)单击"停止录制"工具栏按钮,结束宏录制过程。

  ※ 如果"停止录制"工具栏开始并未出现,请选择"工具"—"宏"—"停止录制"。

  录制完一个宏后就可以执行它了。
 
  1.4 执行宏
 
  当执行一个宏时,EXCEL按照宏语句执行的情况就像VBA代码在对EXCEL进行"遥控"。但VBA的"遥控"不仅能使操作变得简便,还能使你获得一些使用EXCEL标准命令所无法实现的功能。而且,一旦熟悉了EXCEL的"遥控",你都会奇怪自己在没有这些"遥控"的情况下,到底是怎么熬过来的。要执行刚才录制的宏,可以按以下步骤进行:



  1)选择任何一个单元格,比如A3。
  2)选择"工具"—"宏"—"宏",显示"宏"对话框。
  3)选择"改变颜色",选择"执行",则A3单元格的颜色变为红色。试着选择其它单元格和几个单元格组成的区域,然后再执行宏,以便加深印象。

  1.5 查看录制的代码

  到底是什么在控制EXCEL的运行呢?你可能有些疑惑.好,让我们看看VBA的语句吧.



  1)选择"工具"—"宏"—"宏",显示"宏"对话框。
  2)单击列表中的"改变颜色",选择"编辑"按钮。



  此时,会打开VBA的编辑器窗口(VBE)。关于该编辑器,以后再详细说明,先将注意力集中到显示的代码上。代码如下:(日期和姓名会有不同)

Sub 改变颜色()
'
' 改变颜色 Macro
' xw 记录的宏 2000-6-10
'

'
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub

将来会十分熟悉这种代码,虽然现在它们看上去像一种奇怪的外语。学习VBA或编程语言在某种程度上比较像在学习一种外语。

Sub 改变颜色():这是宏的名称。

中间的以" '"开头的五行称为"注释",它在录制宏时自动产生。

以With 开头到End With 结束的结构是With结构语句,这段语句是宏的主要部分。注意单词"selection",它代表"突出显示的区域"(即:选定区域)。With Selection.Interior :它读作"选择区域的的内部".这整段语句设置该区域内部的一些"属性"。

其中:

.ColorIndex = 3: 将该内部设为红色。注意:有一小圆点,它的作用在于简化语句,小圆点代替出现在With后的词,它是With结构的一部分。另外:红色被数字化为3.(红色警戒是否可称作:3号警戒,嗯?)有兴趣的话,你将3改为其他数字试试看。

.Pattern = xlSolid:设置该区域的内部图案。由于是录制宏,所以,虽然你并未设置这一项,宏仍然将其记录下来(因为在"图案"选项中有此一项,只是你为曾设置而已)。xlSolid表示纯色。

.PatternColorIndex = xlAutomatic:表示内部图案底纹颜色为自动配色。

End With:结束With 语句。

End Sub:整个宏的结束语

  1.6 编辑录制的代码



   在上一节,我们录制了一个宏并查看了代码,代码中有两句实际上并不起作用。哪两句?现在,在宏中作一个修改,删除多余行,直到和下面代码相同:

Sub 改变颜色()
'
' 改变颜色 Macro
' xw 记录的宏 2000-6-10
'

'
With Selection.Interior
.ColorIndex = 3
End With
End Sub

  完成后,在工作表中试验一下。你会发现结果和修改前的状况一样。在With 语句前加入一行:

Range("A5").Select

  试着运行该宏,则无论开始选择哪个单元格,宏运行结果都是使A5单元格变红.

  现在可以看到,编辑录制的宏同样非常简单。需要编辑宏是因为以下三个方面的原因。一:在录制中出错而不得不修改。二:录制的宏中有多余的语句需要删除,提高宏的运行速度。三:希望增加宏的功能。比如:加入判断或循环等无法录制的语句。

  1.7 录制宏的局限性

  希望自动化的许多EXCEL过程大多都可以用录制宏来完成.但是宏记录器存在以下局限性.通过宏记录器无法完成的工作有:



  1)录制的宏无判断或循环能力.
  2)人机交互能力差,即用户无法进行输入,计算机无法给出提示.
  3)无法显示EXCEL对话框.
  4)无法显示自定义窗体.

  1.8 小结

  本课中,你已经掌握了VBA的一些基础知识,你会录制宏、编辑宏而且了解了录制宏的局限性.你很努力.并且已经为将来学习VBA甚至VB等编程语言打下了基础.关键是你已经了解了一个谜底,就是说,你了解了什么是编程.下面是些小练习,做完后才可以去玩哟.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2006-7-7 15:19:58 | 显示全部楼层

[原创]:编程基础 分享篇

下面是源码:
Sub c100()
Dim cc(0 To 2) As Double '声明坐标变量
cc(0) = 1000 '定义圆心座标
cc(1) = 1000
cc(2) = 0
For i = 1 To 1000 Step 10 '开始循环
  Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆
Next i
End Sub

先看第一行和最后一行:
Sub C100()
……
End Sub
C100是宏的名称,也叫过程名称,当用户执行C100时程序将运行sub 和end sub之间的所有指令。

第二行:
Dim cc(0 To 2) As Double '声明坐标变量
后半段“'声明坐标变量”自动变为绿色字体,它是代码语句的注释,它不会影响程序运行,它的作用是告诉阅读者程序员的想法。对于简单的程序,一般不需要写注释,如果要编写非常复杂的程序,最好要多加注释,越详细越好,对于程序员来说,这是一个好习惯。
电脑真正编译执行的是这条语句:Dim cc(0 To 2) As Double
它的作用就是声明变量。
Dim是一条语句,可以理解为计算机指令。
它的语法:Dim变量名 As 数据类型
本例中变量名为CC,而括号中的0 to 2声明这个CC是一个数组,这个数组有三个元素:CC(0)、CC(1)、CC(2),如果改为CC(1 to 3),则三个元素是CC(1)、CC(2)、CC(3),有了这个数组,就可以把坐标数值放到这个变量之中。
Double是数据类型中的一种。ACAD中一般需要定义坐标时就用这个数据类型。在ACAD中数据类型的有很多,下面两个是比较常用的数据类型,初学者要有所理解。
Long(长整型),其范围从 -2,147,483,648 到 2,147,483,647。
Variant  它是那些没被显式声明为其他类型变量的数据类型,可以理解为一种通用的数据类型,这是最常用的。

下面三条语句
cc(0) = 1000 '定义圆心座标
cc(1) = 1000
cc(2) = 0
它们的作用是给CC变量的每一个元素赋,值其顺序是X、Y、Z坐标。


For i = 1 To 1000 Step 10 '开始循环
……
Next i  '结束循环
这两条语句的作用是循环运行指令,每循环一次,i值要增加10,当i加到 1000时,结束循环。
i也是一个变量,虽然没有声明i变量,程序还是认可的,VB不是C语言,每用一个变量都要声明,不声明就会报错。简单是简单了,这样做也有坏处,如果不小心打错了一个字母,程序不会报错,如果程序很长,那就会出现一些意想不到的错误。
step后面的数值就是每次循环时增加的数值,step后也可以用负值。
例如:For i =1000 To 1 Step -10
很多情况下,后面可以不加step 10
如:For i=1 to 100,它的作用是每循环一次i值就增加1
Next i语句必须出现在需要结束循环的位置,不然程序没法运行。

下面看画圆命令:
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10)
Call语句的作用是调用其他过程或者方法。
ThisDrawing.ModelSpace是指当前CAD文档的模型空间
AddCircle是画圆方法
Addcicle方法需要两个参数:圆心和半径
CC就是圆心坐标,i*10就是圆的半径,本例中,这些圆的半径分别是10、110、210、310……

本课到此结束,下面请完成一道思考题:
1.以(4,2)为圆心,画5个同心圆,其半径为1-5
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-7 16:39:22 | 显示全部楼层

[密技]: VBA开发AutoCAD应用程序系列之一

VBA开发AutoCAD应用程序系列之一

 

VBA和VB应用程序之异同和相互移植

Microsoft VBA是一个面向对象的编程环境。它提供了与Visual Basic (VB)相似的丰富的开发能力。VBA和VB的最主要的区别在于VBA运行在与AutoCAD相同的处理空间,从而提供了一个具有AutoCAD智能的,非常快的编程环境。

 

VBA同时也提供与其它有VBA编程能力的应用程序的应用集成。这意味着AutoCAD利用其它应用程序的对象库可以控制其它应用程序,例如Microsoft Word和Excel。

 

VB是一个独立的开发版本,必须单独购买,但是它为AutoCAD VBA提供了许多附加的组件,象外部数据库引擎和报告输出能力等。

 

执行AutoCAD VBA有四点好处:

Visual Basic编程环境易学易用;

VBA运行在与AutoCAD相同的处理空间。使程序执行速度非常快。

对话框构建快速,高效。允许开发者快速地定制程序原形和收到设计的及时反馈。

工程可以单独存在,亦可嵌入在图形中。这就给了开发者在发行他们的应用程序时极大的灵活性。

 

要想用VB改写VBA的示例代码,你必须首先引用AutoCAD类型库。在VB里,从工程选单中选择引用选项激发引用对话框。从引用对话框,选择AutoCAD 版本15然后击OK。

 

下一步,在示例代码中用用户定义的指向当前活动文档的专门变量替代所有对ThisDrawing的引用。为了达到这个目的,定义一个AutoCAD应用程序的变量(acadApp)和一个当前文档的变量(acadDoc)。然后,设置应用程序变量(acadApp)为当前AutoCAD应用程序。

 

如果AutoCAD正在运行,GetObject方法就提取出AutoCAD应用程序对象。如果AutoCAD没有正在运行,一个错误就会发生,VB程序就应该捕捉并且清除它。CreateObject方法然后试图生成一个AutoCAD应用程序对象。如果成功,AutoCAD就启动;如果失败,一个显示错误描述的信息框就会出现。

 

下面的代码示例演示了VB如何连接到AutoCAD并且如何用Clear和Description属性处理错误信息变量Err。如果你的编程环境不支持这些属性,你需要适当地修改示例。

 

示例一:从Visual Basic 连接到AutoCAD

 

Sub ConnectToAcad()

Dim acadApp As AcadApplication

On Error Resume Next

 

Set acadApp = GetObject(, "AutoCAD.Application")

If Err Then

Err.Clear

Set acadApp = CreateObject("AutoCAD.Application")

If Err Then

MsgBox Err.Description

Exit Sub

End If

End If

MsgBox "Now running " + acadApp.Name + _

" version " + acadApp.Version

 

End Sub

 

下一步,设置文档变量为AutoCAD应用程序的文档对象。文档对象从应用程序对象的ActiveDocument属性返回。

 

示例二:获取AutoCAD文挡对象

 

Dim acadDoc as AcadDocument

Set acadDoc = acadApp.ActiveDocument

 

从这里开始,就可以使用acadDoc变量来引用当前的AutoCAD图形。

注意:当运行多个AutoCAD例程时,GetObject方法将返回在Windows运行对象表中的第一个AutoCAD例程。关于运行对象表(ROT)和GetObject方法请参看Microsoft Visual Basic相应文档。

 

示例三:VBA和VB代码对照

 

用VBA生成一条线

Sub AddLineVBA()

' This example adds a line

' in model space

Dim lineObj As AcadLine

Dim startPoint(0 To 2) As Double

Dim endPoint(0 To 2) As Double

 

' Define the start and end

' points for the line

startPoint(0) = 1

startPoint(1) = 1

startPoint(2) = 0

endPoint(0) = 5

endPoint(1) = 5

endPoint(2) = 0

 

' Create the line in model space

Set lineObj = ThisDrawing. _

ModelSpace.AddLine _

 

(startPoint, endPoint)

 

' Zoom in on the newly created line

ZoomAll

 

End Sub

 

用VB生成一条线

Sub AddLineVB()

On Error Resume Next

 

' Connect to the AutoCAD application

Dim acadApp As AcadApplication

Set acadApp = GetObject _

(, "AutoCAD.Application")

If Err Then

Err.Clear

Set acadApp = CreateObject _

("AutoCAD.Application")

If Err Then

MsgBox Err.Description

Exit Sub

End If

End If

 

' Connect to the AutoCAD drawing

Dim acadDoc As AcadDocument

 

Set acadDoc = acadApp.ActiveDocument

 

' Establish the endpoints of the line

Dim lineObj As AcadLine

Dim startPoint(0 To 2) As Double

Dim endPoint(0 To 2) As Double

startPoint(0) = 1

startPoint(1) = 1

startPoint(2) = 0

endPoint(0) = 5

endPoint(1) = 5

endPoint(2) = 0

' Create a Line object in model space

Set lineObj = acadDoc.ModelSpace.AddLine _

(startPoint, endPoint)

ZoomAll

 

End Sub


 



VBA开发AutoCAD应用程序系列之二
VBA和其它API交互

VBA与Visual LISP交互:
通过VBARUN命令可以完成VLISP对VBA的调用。
通过方法Sendcommand(command)可以完成VBA对VLISP的调用。

举例:
Sub VBASendCommand()
   ThisDrawing.SendCommand "_Circle" & vbCr & "2,2,0" & vbCr & "4" & vbCr
   ThisDrawing.SendCommand "_zoom" & vbCr & "a" & vbCr
   ThisDrawing.Regen acAllViewports
   MsgBox "A circle command has been sent to the command line of the current drawing."
End Sub

VBA与其它应用程序交互:
1. 建立对另一个应用程序对象库的引用
2. 建立另一个应用程序的例程
  Dim ExcelAppObj as Excel.Application
  Set ExcelAppObj = New Excel.Application
3. 结合对象编程
4. 退出

VBA使用DAO
1 建立Microsoft DAO对象库的参考.
2 打开数据库.
  Dim db As Database
  Set db = DBEngine.Workspaces(0).     
OpenDatabase("C:\X.MDB")
3  编制利用AutoCAD对象模型和DAO对象模型的代码.

VBA获取Windows APIs
声明Windows API:
1. 包含你想调用的进程的DLL名称
2. 在DLL中的进程名称
3. 在你的程序中你想要的名称
4. 进程所需参数
5. 返回值类型(如果你要调用的是一个函数)

调用Windows API:
参考 Win32api.txt
#If Win32 Then   
Declare Sub MessageBeep Lib "User32” Alias "SomeBeep" (ByVal N As Long)
#Else
    Declare Sub MessageBeep Lib "User” Alias "SomeBeep" (ByVal N As Integer)
#End If
Sub CallMyDll()
   Call MessageBeep(1)
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:16 , Processed in 0.413540 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表