Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3491|回复: 16

[已解决]可否举一个最简单的API示例

[复制链接]
发表于 2010-2-8 16:39 | 显示全部楼层 |阅读模式

因为我完全不懂api是什么。就象用:

Sub a()
    Range("A1") = 100
End Sub

来理解VBA对excel的作用。尽管很片面,但有了第1次成功的接触后,可能从此就增加了学习信心 .... 

PS:由于怕看不懂,希望尽可能短、简单,谢谢!![em04]

最佳答案
2010-2-9 08:30
  Windows API是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么.
  这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法. 这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数 。同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
       API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).

 


'声明Sleep函数
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Test()
    MsgBox "点击确定后将延时2秒钟"
    Sleep 2000  '延时2秒钟
    MsgBox "程序再次执行"
End Sub
发表于 2010-2-8 16:45 | 显示全部楼层
回复

使用道具 举报

发表于 2010-2-8 17:00 | 显示全部楼层

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Sub 数组一维转多维()
    Dim arrsrc(1 To 100000), arrdest(1 To 5000, 1 To 20), i As Long
    For i = 1 To 100000
        arrsrc(i) = i
    Next
    CopyMemory ByVal VarPtr(arrdest(1, 1)), ByVal VarPtr(arrsrc(1)), 16 * UBound(arrsrc)
    [a1].Resize(5000, 20) = arrdest
    MsgBox "ok"
    Stop
End Sub
回复

使用道具 举报

 楼主| 发表于 2010-2-8 17:23 | 显示全部楼层

谢谢吕布!

最长的2句,我不懂。

这里,使用api对3楼示例有什么好处哇?

[em04]
回复

使用道具 举报

发表于 2010-2-8 17:38 | 显示全部楼层

一句话便把数组由一维转换成2维了啊,比用循环快多了

Private Declare Sub 这句是把DLL里的函数RtlMoveMemory引入进来,改名叫CopyMemory

CopyMemory ByVal VarPtr(arrdest(1, 1)), ByVal VarPtr(arrsrc(1)), 16 * UBound(arrsrc)这一句是从arrsrc(1)的内存地址开始,拷贝16 * UBound(arrsrc)字节的内存到arrdest(1, 1)的内存地址处

完成后把一维数组arrsrc(1 To 100000)转换成二维数组arrdest(1 To 5000, 1 To 20),

回复

使用道具 举报

发表于 2010-2-8 17:52 | 显示全部楼层

我想API是指系统DLL里的函数,实际上也可以用自己DLL里的函数
回复

使用道具 举报

 楼主| 发表于 2010-2-8 20:18 | 显示全部楼层

QUOTE:
以下是引用吕?布在2010-2-8 17:00:00的发言:
Option
  Explicit

Private
  Declare
  Sub
   CopyMemory
   Lib "kernel32" Alias "RtlMoveMemory" (pDst
   As Any, pSrc
   As Any, ByVal
   ByteLen
   As
  Long)
Sub 数组一维转多维()
    Dim arrsrc(1 To 100000), arrdest(1 To 5000, 1 To 20), i As
  Long
    For i = 1 To 100000
        arrsrc(i) = i
    Next
    CopyMemory ByVal VarPtr(arrdest(1, 1)), ByVal VarPtr(arrsrc(1)), 16 * UBound(arrsrc)
    [a1].Resize(5000, 20) = arrdest
    MsgBox "ok"
    Stop
End
  Sub

我对照着《excel vba技巧引用》的第13例 --- EXCEL文件打开时播放音乐,和3楼示例,比较:

1、与常见的调用带参数函数相比,引用api函数,不同的只是:声明api函数时,要多加(2处)黄色部分;调用时,没区别。

2、红字修改后出错;蓝字修改后,仍正常。红字和蓝字是系统(api函数自己)定义的名字;还是吕布起的名字呀?可不可这样分,函数分为以下3类:

  • 用户自己编写的函数。
  • EXCEl自带的。
  • api函数。

3、每个api函数都是一个完整的函数(或函数集,即一个api函数里有包含有很多api函数),只是因为它们不包含于excel中,所以调用时,需要‘特别’声明?也正是因为api函数不在excel中,所以它有可能实现VBA无法达到的功能?也就说,当你希望excel可以‘不务正业’时,就很需要了解api函数了。

是这样吗?

[此贴子已经被作者于2010-2-8 20:21:37编辑过]
回复

使用道具 举报

发表于 2010-2-9 08:30 | 显示全部楼层    本楼为最佳答案   

  Windows API是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么.
  这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法. 这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数 。同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
       API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).

 


'声明Sleep函数
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Test()
    MsgBox "点击确定后将延时2秒钟"
    Sleep 2000  '延时2秒钟
    MsgBox "程序再次执行"
End Sub
回复

使用道具 举报

发表于 2010-2-9 08:32 | 显示全部楼层

都是百度上的。

你将会遇到一些问题:

  假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用. 在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.
回复

使用道具 举报

发表于 2010-2-9 09:17 | 显示全部楼层

   CopyMemory
   Lib "kernel32" Alias "RtlMoveMemory" (pDst
   As Any, pSrc
   As Any, ByVal
   ByteLen

里面,CopyMemory是自己改的函数名字,在VBA中使用。相当于在VBA中给函数起别名,可以改动,他的真实名称是RtlMoveMemory

kernel32是API函数所在的DLL,可能是因为是系统DLL的原因吧,省略了路径和.DLL,实际上是表示kernel32.dll,不能更改,但是我想能加上路径的后缀名。

RtlMoveMemory是API函数所在的DLL,可能是因为是系统DLL的原因吧,省略了路径和.DLL,实际上是表示kernel32.dll,不能更改,因为他在DLL里导出的函数名便是RtlMoveMemory,改成其它的便找不到这个函数了。当然一个DLL里极可能不止一个导出函数。这样也可以是其它的函数,但是只能是DLL里导出的。怎样查看DLL导出函数,网上有工具的。API的话也可以查看MSDN。

括号里的是形式参数,也可以改,但是参数类型和ByVal还是ByRef有讲究的,我现在一般只会用人家定义好的。

另外再讲一下DLL,DLL也叫动态链接库,DLL一旦调入内存,便可以提供内存共享,可供所有应用程序调用。而正常的应用程序的内存是相互独立的,其它应用程序进不去的。这样可以使用DLL的方式,一些人写好一些具有一定功能的函数,另一些人可以调用这些函数而不必知道函数是用的什么语言,怎么编写的。

[此贴子已经被作者于2010-2-9 9:23:27编辑过]
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-16 16:53 , Processed in 0.240255 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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