当前位置:文档之家› 递归vba

递归vba

递归vba
递归vba

递归是怎么一回事? 递归通俗的讲就是一个函数在其代码中反复调用自身。你应该知道菲波纳契数列,这个数列的定义是:

f(x)=1 (x=1)

f(x)=2 (x=2)

f(x)=f(x-1)+f(x-2) (x>2)

也就是说从第三项开始的每一项的值都等于是前两项之和。这在数学中叫递推数列--高中数学内容。

说到本质的话,递归是一段程序的代码反复效用,把程序的参数等变量保存在一个堆栈里,直到到了边界条件以后再层层返回,将堆栈中的数据弹出计算,最后得到结果。

补充一下,递规包括直接递规和间接递规。直接递规是指在代码中反复调用自身,而间接递规是间接地调用自身。

递归概念最通俗的形象比喻:

打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路上的下一个分岔口,于是小队长再分派人手各自去探路??只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。所不同的是,计算机的递归法是把这个并行过程串行化了。

递归算法的基本思想是:

把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

什么是递归函数(recursive function)

递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。

VB函数递归使用实例链接:

https://www.doczj.com/doc/c511423892.html,/t/20050125/22/3753710.html

用VB函数Dir实现递归搜索目录实例链接:

https://www.doczj.com/doc/c511423892.html,/Develop/article/28/68489.shtm

遍历所有文件夹的递归函数(epower2002)

Sub Main()

ProcessDirectory("E:\My Documents")

Console.ReadLine()

End Sub

Private Sub ProcessDirectory(ByVal targetDirectory As String)

If Directory.Exists(targetDirectory) Then

If Directory.GetFileSystemEntries(targetDirectory).Length = 0 Then

' Empty folder

Console.WriteLine("Folder " & targetDirectory & " is empty")

Else

' Recurse subdirectories of this directory

Dim subdirectory As String

Dim subdirectoryEntries As String() =

Directory.GetDirectories(targetDirectory)

For Each subdirectory In subdirectoryEntries

Console.WriteLine("Folder is " & subdirectory)

ProcessDirectory(subdirectory)

Next subdirectory

End If

End If

End Sub

https://www.doczj.com/doc/c511423892.html,/art/1111/20041219/692239_1.html

查找给定文件夹下的全部文件,递归调用堆栈溢出:

链接:https://www.doczj.com/doc/c511423892.html,/t/20060303/09/4589903.html

递归算法

用自身的结构来描述自身,称递归

VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function 函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。

递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。

例:编fac(n)=n! 的递归函数

Function fac(n As Integer) As Integer

If n = 1 Then

fac = 1

Else

fac = n * fac(n - 1)

End If

End Function

递归程序的基本步骤

每一个递归程序都遵循相同的基本步骤:

1. 初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以

向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。

2. 检查要处理的当前值是否已经与基线条件相匹配。如果匹配,则进行处理并返回值。

3. 使用更小的或更简单的子问题(或多个子问题)来重新定义答案。

4. 对子问题运行算法。

5. 将结果合并入答案的表达式。

6.返回结果。

递归算法的基本思想

递归算法一般都包含三个基本部分:

1、当前问题Q n

2、从较简单的问题Q n-1到Q n的操作Op n-1

3、已解决的基础问题Q0

这样,当前问题Q n就可以被一步一步化简为:

Q n

Op n-1 + Q n-1

...

Op n-1 + Op n-2 + Op n-3 ... +Q0

这样一些列确定的步骤而最终得到解决。

递归算法解题的一般思路

在一个子程序(过程或函数)的定义中又直接或间接地调用该子程序本身,称为递归。递归是一种非常有用的程序设计方法。用递归算法编写的程序结构清晰,具有很好的可读性。递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

利用递归算法解题,首先要对问题的以下三个方面进行分析:

一、决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。

二、问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。

三、解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。把这些步骤或等式确定下来。

把以上三个方面分析好之后,就可以在子程序中定义递归调用。其一般格式为:

if 边界条件1成立 then

赋予边界值1

【elseif 边界条件2成立then

赋予边界值2

┇】

else

调用解决问题的通式

endif

例1:计算勒让德多项式的值

x、n由键盘输入。

分析:当n=0或n=1时,多项式的值都可以直接求出来,只是当n>1时,才使问题变得复杂,决定问题复杂程度的参数是n。根据题目提供的已知条件,我们也很容易发现,问题的边界条件及边界值有两个,分别是:当n=0时P n(x) =1和当n=1时P n(x) =x。解决问题的通式是:

P n(x) =((2n-1)P n-1(x) -(n-1)P n-2(x))/n。

接下来按照上面介绍的一般格式定义递归子程序。

function Pnx(n as integer)

if n=0 then

Pnx=1

elseif n=1 then

Pnx=x

else

Pnx=((2*n-1)*Pnx(n-1)-(n-1)*Pnx(n-2))/n

endif

end function

例2:Hanoi塔问题:传说印度教的主神梵天创造世界时,在印度北部佛教圣地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着三根宝石针,在其中一根宝石针上,自下而上地放着由大到小的64个金盘。这

就是所谓的梵塔(Hanoi),如图。梵天要求僧侣们坚持不渝地按下面的规则把64个盘子移到另一根针上:

(1) 一次只能移一个盘子;

(2) 盘子只许在三根针上存放;

(3) 永远不许大盘压小盘。

梵天宣称,当把他创造世界之时所安放的64个盘子全部移到另一根针上时,世界将在一声霹雳声中毁灭。那时,他的虔诚的信徒都可以升天。

要求设计一个程序输出盘子的移动过程。

分析:为了使问题更具有普遍性,设共有n个金盘,并且将金盘由小到大依次编号为1,2,…,n。要把放在s(source)针上的n个金盘移到目的针o(objective)上,当只有一个金盘,即n=1时,问题是比较简单的,只要将编号为1的金盘从s针上直接移至o针上即可。可定义过程move(s,1,o)来实现。只是当n>1时,才使问题变得复杂。决定问题规模的参数是金盘的个数n;问题的边界条件及边界值是:当n=1时,move(s,1,o)。

当金盘不止一个时,可以把最上面的n-1个金盘看作一个整体。这样n个金盘就分成了两个部分:上面n-1个金盘和最下面的编号为n的金盘。移动金盘的问题就可以分成下面三个子问题(三个步骤):

(1)借助o针,将n-1个金盘(依照上述法则)从s针移至i(indirect)针上;

(2)将编号为n的金盘直接从s针移至o针上;

(3)借助s针,将i针上的n-1个金盘(依照上述法则)移至o针上。如图

其中第二步只移动一个金盘,很容易解决。第一、第三步虽然不能直接解决,但我们已经把移动n 个金盘的问题变成了移动n-1个金盘的问题,问题的规模变小了。如果再把第一、第三步分别分成类似的

三个子问题,移动n-1个金盘的问题还可以变成移动n-2个金盘的问题,同样可变成移动n-3,…,1个金盘的问题,从而将整个问题加以解决。

这三个步骤就是解决问题的通式,可以以过程的形式把它们定义下来:

hanoi(n-1,s,o,i)

move(s,n,o)

hanoi(n-1,i,s,o)

参考程序如下:

declare sub hanoi(n,s,i,o)

declare sub move(s,n,o)

input "How many disks?",n

s=1

i=2

o=3

call hanoi(n,s,i,o)

end

sub hanoi(n,s,i,o)

rem 递归子程序

if n=1 then

call move(s,1,o)

else

call hanoi(n-1,s,o,i)

call move(s,n,o)

call hanoi(n-1,i,s,o)

endif

end sub

sub move(s,n,o)

print "move disk";n;

print "from";s;"to";o

end sub

递归找迷宫

EXCEL VBA]EXCEL中用递归实现任意n(3≤n≤256)阶幻方

本文Tag:excel vba excel 递归幻方

p,

https://www.doczj.com/doc/c511423892.html,/Article/38fedcf4-a4ed-4dd7-bb3c-5fb5362ca477.html

EXCEL VBA]EXCEL中用递归实现任意n(3≤n≤256)阶幻方

下面代码将实现任意n(3≤n≤256)阶幻方,显示在EXCEL的A1:IV256中

Sub magicsquare(ByVal n As Long, ByRef matrix())

Dim i As Long, j As Long, k As Long, p As Long, a(), temp As New Collection ReDim matrix(1 To 256, 1 To 256)

If n < 3 Then MsgBox "n must be larger than 2! ": Exit Sub

If n Mod 4 = 0 Then

ReDim a(1 To n, 1 To n)

ReDim b(1 To n, 1 To n)

For i = 1 To n

For j = 1 To n

matrix(i, j) = IIf((i Mod 4) \ 2 = (j Mod 4) \ 2, n * n + 1 - (i - 1) * n - j, (i - 1) * n + j)

Next

Next

Else

If n Mod 4 = 2 Then

p = n / 2

ReDim a(1 To p, 1 To p)

magicsquare p, a

For i = 1 To p

For j = 1 To p

matrix(i, j) = a(i, j)

matrix(i + p, j) = a(i, j) + 3 * p * p

matrix(i, j + p) = a(i, j) + 2 * p * p

matrix(i + p, j + p) = a(i, j) + p * p

Next

Next

For i = 1 To (n - 2) / 4

temp.Add i

Next

For i = 3 * (n - 2) / 4 + 1 To n

temp.Add i

Next

For i = 1 To p

For j = 1 To temp.Count

k = matrix(i, temp(j))

matrix(i, temp(j)) = matrix(i + p, temp(j))

matrix(i + p, temp(j)) = k

Next

Next

Else

For j = 0 To n - 1

For i = 0 To n - 1

If j = 0 Then matrix(j + 1, i + 1) = IIf(i >= (n - 1) / 2, 0, n * (n + 1)) + (i - (n - 1) / 2) * (n + 2) + 1

If j > 0 Then matrix(j + 1, i + 1) = 1 + (n * n + matrix(j, i + 1) + IIf(matrix(j, i + 1) Mod n = 0, 0, n)) Mod n ^ 2

Next

Next

End If

End If

End Sub

Sub makemagicsquare()

Dim arr(), n As Long

Randomize

n = CLng(InputBox("please enter an integer", "infomation",

3+Int(Rnd*254)))

magicsquare n, arr

Range("a1").Resize(256, 256) = arr

Range("a1").Resize(256, 256).Columns.AutoFit

End Sub

https://www.doczj.com/doc/c511423892.html,/northwolves/archive/2006/09/28/1303247.aspx

clamber

各位兄弟看看,VBA中的递归怎么不行呢?

Private Sub CommandButton1_Click()

Dim aa, bb As Long

aa = 10

bb = f_1(aa)

[color=Red]''bb = f_1(aa)不行,''bb = f_1(10)就可以,可是我有时我想动态指定aa的值.[/color]

MsgBox bb

End Sub

Public Function f_1(temp As Long) As Variant

If temp = 1 Then

f_1 = 1

Else

f_1 = temp * f_1(temp - 1)

End If

End Function

2004-12-21 15:46 clamber

报告的出错类型是"Bybef argument type mismatch"

2004-12-21 15:56 apolloh

Dim aa as long, bb As Long

2004-12-21 15:59 zgh058

如下:

Private Sub CommandButton1_Click()

Dim aa, bb As Long

aa = 10

bb = f_1((aa))

MsgBox bb

End Sub

Public Function f_1(temp As Long) As Variant

If temp = 1 Then

f_1 = 1

Else

f_1 = temp * f_1(temp - 1)

End If

End Function

2004-12-21 16:01 zgh058

还是3楼正解,我取了个捷径,只是在避免出错而已。

2004-12-21 16:16 clamber

多谢!3,4 楼的前辈拉.

问题已经解决,但是为什么分两行声明就可以呢?

兄弟这段时间有一个任务--就是用VBA写个程序展开MRP 中的BOM,以后还要麻烦大家.大家一定要帮忙

呀!

2004-12-22 14:30 wangmingbai

在vba里Dim aa, bb As Long,意思是dim aa as Variant,bb As Long。

2004-12-23 15:23 jidanbing

长知识

https://www.doczj.com/doc/c511423892.html,/cdb/archiver/?tid-31680.html

T-SQL实现递归查询

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[Test]

GO

CREATE TABLE [dbo].[Test] (

[id] [int] NOT NULL ,

[Parentid] [int] NULL

) ON [PRIMARY]

GO

查询语句

SELECT root.id, root.ParentidFROM Test root

WHERE root.id=1

UNION ALL

SELECT sub.id, sub.Parentid

FROM Test sub, Test super

WHERE sub.Parentid= super.id

https://www.doczj.com/doc/c511423892.html,/netlm/archive/2006/09/18/507005.html

怎样实现sql中select递归

2007年01月26日

网友的提问:

如我有一表有如下字段,ID1,Id2,bz

怎么实现id2的值等于id1值的记录

如:a1,b1,c1

b1,d1,c1

b1,e1,c1

d1,g1,c1

d1,t1,c1

g1,*,c1

t1,*,c1

..........

.......

网友1回答:

select * from 表where id2 = id1

网友2回答:

是不是想更新表??

update 表set id2=id1

网友3回答:

楼上抢先了:)[:(]

网友4回答:

递归啊,兄弟们,刚才那些还要100分

网友5回答:

能不能说清楚点呀

https://www.doczj.com/doc/c511423892.html,/exhibit.php/OTAy.html

SQL在存储过程中使用递归

2007-01-25 17:55

递归的基本概念非常简单:一段给定的代码对自身进行调用,直到某些边界条件得到满足。在本文中,我们将演示如何在T-SQL中使用递归。

在我的眼中,递归是最为精致的程序结构之一。我已经在许多场合用不同的编程语言实现过它。递归的基本概念非常简单:一段给定的代码对自身进行调用,直到某些边界条件得到满足。我将通过下面的内容展示如何在T-SQL中使用递归。我所用到的是递归的经典例子:阶乘计算。

阶乘的意思就是将小于等于这一数字的所有数字相乘,直至乘到2。例如,factorial(10)即等于10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2(你也可以加上“*1”,但似乎是多此一举)。

以下代码即实现了阶乘:

CREATE PROCEDURE [dbo].[Factorial_ap]

(

@Number Integer,

@RetVal Integer OUTPUT

)

AS

DECLARE @In Integer

DECLARE @Out Integer

IF @Number != 1

BEGIN

SELECT @In = @Number – 1

EXEC Factorial_ap @In, @Out OUTPUT

SELECT @RetVal = @Number * @Out

END

ELSE

BEGIN

SELECT @RetVal = 1

END

RETURN

GO

假设你需要计算factorial(n),这一过程将对自身调用(n-2)次。SQL Server 允许调用深度高达32次的递归,但到了13次的时候,你就会遭遇到算法溢出(arithmetic overflow)警告。如果你希望计算大型数据的阶乘,你应该将变量声明为BigInt 而非Integer。这样一来你就可以计算factorial(20),结果是2,432,902,008,176,640,000。这一结果的增长是如此迅速,因而如果是计

算factorial(21),那么这一限制将被再次突破。

尽管阶乘机制非常美妙,但在日常编程中似乎没有多少机会用到。然而,上面的代码还是精确的展示了递归的基本原理和具体的实践。

在一些实际问题中,递归都将是一种有价值的编程技巧。其中一个经典的编程问题名为“Bill of Materials(用料单)”。该问题有至少两种应用:

给出所需对象的一个实例,求出构造此实例的用料单;

指定组成某个对象的若干对象的详细目录,求出能够构造出多少对象?

现在让我们来假设我们已经有了对象O,它是由四个X对象和三个Y对象以及七个Z对象组成。因此,要构造一个单独的O对象显然我们将会需要四个X对象、三个Y对象和七个Z对象。然而,对象Y和Z都需要一定数量的Q对象(例如对螺丝指定周长、螺栓样式、螺帽样式)。因此我们需要分析对象Y和X,确定它们所需要的Q对象个数,然后再确定我们能提供相应总数。如果不能,那么我们将无法创建对象Q。

SQL Server 2000无法较方便的解决这一问题,除非你能够提前知道递归层次。然而,SQL 2005测试版在这一问题上已经进行了很长时间的研究。SQL项目负责人Joe Celko提供了非常巧妙的解决办法,该办法涉及到在行插入(row-insert)时间对递归层次进行跟踪。这一解决方案非常有用,但需要使用触发器或类似机制通过每一次插入、更新或删除来更新层次深度队列。你可以查看

https://www.doczj.com/doc/c511423892.html,/trilfly/blog/item/ce89d603549f06ec08fa930f.html

递归

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。

能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

斐波那契数列为:0、1、1、2、3、……,即:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

写成递归函数有:

int fib(int n)

{ if (n==0) return 0;

if (n==1) return 1;

if (n>1) return fib(n-1)+fib(n-2);

}

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。

在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

https://www.doczj.com/doc/c511423892.html,/blog/

镜里照镜——递归法破解难题

问:“前几种办法的确名如其法,比较笨。有没有比较潇洒一点的算法?递归属不属于些类算法呀?”

答:“递归一种非常奇妙和美妙的算法形式,奇妙美妙的背后是比较难理解。但用起来却异常简洁。”

什么是递归

说白了递归就象我们讲的那个故事:山上有座庙,庙里有个老和尚,老和尚在讲故事,它讲的故事是:山上有座庙,庙里有个老和尚,老和尚在讲故事,它讲的故事是:……

也就是直接或间接地调用了其自身。

就象上面的故事那样,故事中包含了故事本身。因为对自身进行调用,所以需对程序段进行包装,也就出现了函数。

函数的利用是对数学上函数定义的推广,函数的正确运用有利于简化程序,也能使某些问题得到迅速实现。对于代码中功能性较强的、重复执行的或经常要用到的部分,将其功能加以集成,通过一个名称和相应的参数来完成,这就是函数或子程序,使用时只需对其名字进行简单调用就能来完成特定功能。

函数又可分为自定义的和系统附带的,但不管是自定义的还是系统的,他们都对相应的功能进行了封装,以利于我们经常性地使用。例如我们的对一个小数取整数INT()函数,不论什么样的小数,往()中一放,将来得到的值就自动将小数去除了。函数执行完将返回一个值,当然这个值可以是各种类型的,子程序仅仅执行一个过程,不返回数值。

函数和子程序是执行递归的干将。

示例:小猴吃枣

小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?

从上题中我们可看到一个令人欣喜的规律,第十天为1,第九到第一天中后一天与1的和的两倍与前一天相等。下面就对这一规律做了描述:

Private Function monkey(ByVal x As Integer) As Integer

If x >= 10 Then

monkey = 1

Else

monkey = 2 * (monkey(x + 1) + 1)

End If

End Function

我们定义monkey()函数的时候通过monkey()自身来进行了定义,这就是递归。递归是个特殊的循环,是一个有着非常美妙的循环规则的循环。上题中我们只要将monkey(1),即第一天打印出来,一切OK。而这中间究竟是怎么工作的,我们可以不管。

正是有了monkey()函数,在对其自身调用的过程中实现了我们的所求,关于函数、子程序和他们之间发生的故事还有很多,仅仅列举了其中奇妙的几点,还有许多东东等着您的发现和利用。

https://www.doczj.com/doc/c511423892.html,/dhzhi777/blog/static/142996920069140841962/

如何实现窗体递归调用?

有一个窗体,上面一个TEXT,一个BUTTON,当点击BUTTON后,再NEW一个旧窗体的副本,并将旧窗体的TEXT传递到新窗体上,将新的窗体的TEXT=旧窗体的TEXT+“1”,如此递归调用如何实现?代码如何写?请赐教!

Private Sub Command1_Click()

Dim FrmNew As Form1

Set FrmNew = New Form1

FrmNew.Show

FrmNew.Text1 = Val(Me.Text1) + 1

End Sub

Private Sub Form_Load()

Me.Text1.Text = "0"

End Sub

https://www.doczj.com/doc/c511423892.html,/doc/vb/1653976_other.htm

vb能递归调用吗?

VB能其它很多高级语言一样,可以完成递归调用这种编程技术。

关键是递归调用中要控制好结束条件。

可以把递归函数调用自己看作是操作系统提供了另外一个名称不同而

内容相同的函数。程序每次调用函数时,操作系统工作如下:

1。保存活动函数的状态

2。将新函数装入内存

3。开始执行新函数

如果函数是递归的,即新函数与当前执行函数相同,则一切也还一样,

当然,由于函数已在内存,没必要再调用一次。

不知道你的递归函数执行时出的具体是什么问题,是死循环还是别的什么?

你在递归函数中要注意变量i是否定义为模块级变量,不是函数级,否则

调用一次VB默认循环变量从0开始。

你的函数中好象问题不少,是敲错了一些东西吧?

【在 zhvickie (成功) 的大作中提到: 】

∶ vb能递归调用吗

∶下面不能运行

∶ Private Sub Command1_Click()

∶ Dim X(2), Y(2), h

∶ Text1.Text = Test1()

∶ End Sub

∶ Function Test1()

∶ i = i + 1

∶ If i > 3 Then

∶ Else

∶ ...................

https://www.doczj.com/doc/c511423892.html,/smth/VisualBasic/Catalog/baseconcept/00 000017.htm

过程的递归调用

在调用一个子程序或函数的过程中又出现直接或间接调用该子程序或函数本身,称为过程的递归调用。

程序中不应出现无终止调用,而只应是有限次数的、有终止的递归调用,这可以用IF条件来控制,只在某一条件成立时才继续执行递归调用,否则就不再继续。

下面举一个例子来作说明。

例有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人的岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?

可以用式子表述如下:

10(n=1)

age(n)=(此处有大括号,请用图表示)

age(n-1)+2(n>1)

FUNCT I ON Age(n)

IF n=1 THENAge=10 ELS EAge=Age(n-1)+2

END FUNCTION

主程序如下:

DECLAREF UNCTION Age(n)

PRINT Age(5)

END

运行结果如下:

18

Age函数共被调用5次,其中Age(5)是主程序调用的,其余4次是在Age函数中调用的,即递归调用4次。

https://www.doczj.com/doc/c511423892.html,/online/jiaoyu/ejkaoshi-gb/0/43.htm

一些观点摘录:

我不喜欢用递归,除非我的确知道将会发生的最大递归次数,不然我绝不用。

因为它可能使堆栈溢出。

所谓栈,是一种先进后出的结构,系统栈也是这样,只是系统栈是不需要你手动控制入栈和出栈的。抛开递归不谈,先说函数调用,当某个函数执行到了某行要调用另一个函数,首先系统会将被调用的函数地址和参数压到系统栈中,然后运行被调用的函数,遇到其中的临时变量(自动变量)也将其压在栈里面,如果在这个函数中又调用其他函数,则将其他函数的地址和参数压进系统栈,再运行其他函数。当被调用的函数运行结束时将临时变量弹出(1。这是系统控制的,2。这是一个栈临时变量在参数后压入的所以先出来),然后是弹出参数,然后又回到调用函数。现在回到这个问题,递归函数也是一样的道理,首先调用该函数,该函数指针和参数进栈,运行中又碰到调用该函数,该函数的地址和当前的参数又压进栈(在前面那个函数指针参数等的上面)...依次类推,最后一直到n==0||n==1,好,现在最后一次压入的函数出栈了,然后是倒数第二个,...一直到最上面一层,最后运行完毕。系统栈的空间是有限的,这点切记,你可以把n搞的很大,看看发生什么情况:StackOverflow。

不知道是不是偶水平不够,不过决大多数工作的程序员不使用递归,系统分析员也不会建议手下的人用递归函数,尤其在一个比较大的项目实施的时候。

递归确实影响执行效率,不停地进栈出栈浪费了太多的时间。

递归在解决一些复杂问题时可以简化思路,

其实没有说一定那种算法一定不好,或者一定好,都有其适用的地方

递归有递归的优势,思路清晰,

非递归设计的好,则效率和程序更健壮。

资源占用比较高,速度慢。

如果有别的算法代替,尽可能不用。

要视具体的算法而定,不能一概而论。有时候用递归反而是最高效的。

VB不适合大量的复杂的数学运算,你可以用其它语言,如果没记错,Fortant应该比较适合。

递归是一种非常有用的程序设计方法。用递归算法编写的程序结构清晰,具有很好的可读性。

Excel VBA循环语句

l For… next for i=初始值 to 结束值 step 步长值 …… next 具体解释一下,初始值指的是循环开始的值,结束值指的是循环结束的值,实质上就是i值得一个判断,如果i值在起始值和结束值之间,那么进入循环语句,然后i值每运行到next语句后会自动加一个步长值,直至i值超出了初始值到结束值这个范围,循环才会结束。这里要说明一下”step 步长值“往往是省略掉的,省略掉的话,步长取默认值为1。下面将以一段小实例来具体说明这个结构的用法: 实例:在sheet1工作表中一次输出1到10这个数,显示在第一列中。 Sub 循环语句() Dim i As Integer For i = 1 To 10 Step 2 Cells(i, 1) =i Next End Sub Sub 循环语句() Dim i As Integer For i = 10 To 1 Step -1 Cells(i, 1) =i Next End Sub l For each… next For each 对象变量 in 对象集合 …… next 具体解释一下,这里我们看到和上一个结构的而不同的是上面一种结构主要是数值变量,而这种结构是对象变量。什么意思呢?each……in指的是在这个对象集合里面,一次将每一个对象都遍历一边。同样的道理,执行到next后对象自动指到下一个。具体我们来看一下下面的一个实例吧 实例:给一个数据区域内的所有单元格赋值,从1开始。 Sub 循环语句() Dim i As Integer For Each c In Range("a1:c5") i = i + 1 c.Value = i Next End Sub

使用VBA操作Word表格

使用VBA操作Word表格 一、生成表格 Private Sub CreateTable(mRows As Integer, mColumns) Dim mRange As Range Set mRange = Start:= End:= SelfGenTable = NumRows:=mRows, NumColumns:=mColumns) End Sub 上面过程的作用是在活动文档的末尾插入一个mRows行,mColumns列的表格。 二、在读写表格中的单元格 写入单元格使用如下代码: (Row:=curRow, Column:=curColumn). "文本" 上面代码的做用时在curRow行,curColumn列处插入字符“文本”。 其中TableObject为表格对象,如果使用了生成表格中的例子,那么可以用SelfGenTable 来替代TableObject。 三、调整单元格对齐方式 水平对齐设置 水平对齐常数(具体的常数可以查看帮助文件的说明) 如何选择单元格 选定特定单元格 (Row:=1,Column:=1).Select’选定单元格1,1 选定行 (i).Select’选定第i行 选定列 (i).Select’选定第i列 选定整个表格 首先执行表格元素选择程序,然后再使用设置对齐方式。 垂直对齐方式 垂直对齐常数 也是首先选择表格元素,可以使单个单元格,单个行、单个列或者整个表格。似乎也可以同时选择多个单元格、多个行、多个列,有兴趣的朋友可以自行寻找答案。 四、设置表格边线类型 下面的代码对整个表格的所有边线设置成细实线: With Selection .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle .Borders(wdBorderRight).LineStyle = wdLineStyleSingle .Borders(wdBorderTop).LineStyle = wdLineStyleSingle .Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle .Borders(wdBorderVertical).LineStyle = wdLineStyleSingle End With 同样是对Selection进行设置,所以可以依照上面的方法对特定的单元格、行或者列的边线

Excel VBA实例教程 #056:遍历工作表中的图形

工作表中的多个图形,如果使用系统缺省名称,如“文本框1”、“文本框2”这样前面是固定的字符串,后面是序号的,可以使用For...Next 语句遍历图形,如下面的代码所示。 1.Sub ErgShapes_1() 2. Dim i As Integer 3. For i = 1 To 4 4. Sheet1.Shapes("文本框 " & i).TextFrame.Characters.Text = "" 5. Next 6.End Sub 代码解析: ErgShapes_1过程清除工作表中四个图形文本框中的文字。 第3行到第5行代码,使用Shapes属性在工作表上的三个图形文本框中循环。 Shapes属性返回Shapes对象,代表工作表或图形工作表上的所有图形,可以使用Shapes(index)返回单个的Shape对象,其中index是图形的名称或索引号。 返回单个的Shape对象后使用TextFrame 属性和Characters方法清除文本框中的字符,关于Shape对象的TextFrame 属性和Characters方法请参阅技巧53 。 如果图形的名称没有规律,可以使用For Each...Next 语句循环遍历所有图形,根据Type属性返回的图形类型进行相应的操作,如下面的代码所示。 1.Sub ErgShapes_2() 2. Dim myShape As Shape 3. Dim i As Integer 4. i = 1 5. For Each myShape In Sheet1.Shapes 6. If myShape.Type = msoTextBox Then 7. myShape.TextFrame.Characters.Text = "这是第" & i & "个文本框" 8. i = i + 1 9. End If 10. Next 11.End Sub 代码解析: ErgShapes_2过程在工作表中的所有图形文本框中写入文本。 第5行代码使用For Each...Next 语句循环遍历工作表中所有的图形对象。 第6行到第9行代码如果图形对象是文本框则在文本框中写入文本。其中第6行代码根据Type属性判断图形对象是否为文本框,应用于Shape对象的Type属性返回或设置图形类型,MsoShapeType类型,请参阅表格54 1 。

VBA操作网页读取数据自动填入EXCEL表中

VBA操作网页读取数据自动填入EXCEL表中 Sub a正式查分程序() '运行时会出现错误提示,中止程序,更改j初值后重新运行 Dim ie, dmt Dim i, j, k, bb, nianfen As Integer Dim text1 As String '存储考号 Dim text2 As String '存储报名序号 Dim text3 As String '存储浏览器地址 Dim fuwuqi As String '存储服务器地址 Dim tijiao As String '存储提交命令 nianfen = 2012 '存储年份,每年更改“2012” fuwuqi = "http://218.28.109.125:81/cjcx/tmp_cx_zzcj.php" '自行更改为可用服务器 tijiao = "&cmdok=???" 'cmdok=???为提交命令 bb = Sheet3.Range("a65536").End(xlUp).Row '计算当前工作表sheet3的有效行数,需自行更改“sheet3” ' On Error Resume Next

'主程序 k = 0 For j = 2 To bb '循环变量从2到sheet2最后一行,出错后起始值改为当前行 k = k + 1 ' If k > 20 Then '每20行,可以增大“20”数值 ActiveWorkbook.Save '自动保存 ActiveWindow.ScrollRow = j '自动滚屏到当前行 k = 0 '循环变量清零 End If text1 = Cells(j, 1) '从当前行第一列读取考号,根据情况调整列“1”数值 text2 = Cells(j, 2) '从当前行第二列读取报名序号,根据情况调整列“2”数值 '生成查询地址 text3 = fuwuqi & "?textdate=" & nianfen & "&textkh=" & text1 & "&textzjhm=" & text2 & tijiao '创建网页对象

Excel-VBA操作文件四大方法之四利用API函数来处理文件

Excel-VBA操作文件四大方法之四 四、利用API函数来处理文件 通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应付几乎所有的文件操作。但是为了普及一下API,展示一下API的魅力,最后向大家介绍一下如何利用API函数来处理文件。另一方面也是本人对API情有独钟,为她做一下广告,呵呵。大家对API的强大也是有所耳闻了,在文件操作方面,API自然毫不逊色。 说明:为了文章简洁,我们先给出API函数的名称及功能,其完整的声明及常数就不再一一细诉,只在示例中给出其完整用法。 (一)处理驱动器及目录 下面是windows中提供的对于目录进行操作的API函数及其功能: CreateDirectory,CreateDirectoryEx 创建一个新目录 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace,GetDiskFreeSpaceEx 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDriveType 判断一个磁盘驱动器的类型 GetFullPathName 获取指定文件的完整路径名 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径GetSystemDirectory 这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作 GetTempPath 获取为临时文件指定的路径 GetVolumeInformation 获取与一个磁盘卷有关的信息 GetWindowsDirectory 这个函数能获取Windows目录的完整路径名。在这个目录里,保存了大多数windows应用程序文件及初始化文件 RemoveDirectory 删除指定目录 SetCurrentDirectory 设置当前目录 SetVolumeLabel 设置一个磁盘的卷标(Label) 下面通过几个例子来详细的了解一下其中主要的几个函数及其用法: 1、GetLogicalDrives 作用:判断系统中存在哪些逻辑驱动器字母 声明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long 说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推 示例: Public Sub Get_LogicalDrives() Dim LDs As Long, Cnt As Long, sDrives As String LDs = GetLogicalDrives sDrives = "Available drives:" For Cnt = 0 To 25 If (LDs And 2 ^ Cnt) <> 0 Then

Excel中用VBA-Worksheet基本操作应用示例

Application对象及其常用方法基本操作应用示例 Application对象代表整个Microsoft Excel应用程序,带有175个属性和52个方法,可以设置整个应用程序的环境或配置应用程序。 示例01-01:体验开/关屏幕更新(ScreenUpdating属性) Sub 关闭屏幕更新() MsgBox "顺序切换工作表Sheet1→Sheet2→Sheet3→Sheet2,先开启屏幕更新,然后关闭屏幕更新" Worksheets(1).Select MsgBox "目前屏幕中显示工作表Sheet1" Application.ScreenUpdating = True Worksheets(2).Select MsgBox "显示Sheet2了吗?" Worksheets(3).Select MsgBox "显示Sheet3了吗?" Worksheets(2).Select MsgBox "下面与前面执行的程序代码相同,但关闭屏幕更新功能" Worksheets(1).Select MsgBox "目前屏幕中显示工作表Sheet1" & Chr(10) & "关屏屏幕更新功能" Application.ScreenUpdating = False Worksheets(2).Select MsgBox "显示Sheet2了吗?" Worksheets(3).Select MsgBox "显示Sheet3了吗?" Worksheets(2).Select Application.ScreenUpdating = True End Sub 示例说明:ScreenUpdating属性用来控制屏幕更新。当运行一个宏程序处理涉及到多个工作表或单元格中的大量数据时,若没有关闭屏幕更新,则会占用CPU 的处理时间,从而降低程序的运行速度,而关闭该属性则可显著提高程序运行速度。 示例01-02:使用状态栏(StatusBar属性) Sub testStatusBar() Application.DisplayStatusBar = True '开启状态栏显示 '赋值状态栏显示的文本 Application.StatusBar = "https://www.doczj.com/doc/c511423892.html," End Sub 示例说明:StatusBar属性用来指定显示在状态栏上的信息。若不想再显示状态栏文本,可使用Application.StatusBar = False语句关闭状态栏显示,也可以在程序开始将原先的状态栏设置存储,如使用语句oldStatusBar = Application.DisplayStatusBar将状态栏原来的信息存储在变量oldStatusBar,在程序运行完成或退出时,将变量重新赋值给状态栏,如使用语句Application.DisplayStatusBar = oldStatusBar,以恢复状态栏原状。

ExcelVBA中for循环语句地用法

Excel VBA中for循环语句的用法 听语音 ? ?| ?浏览:21306 ?| ?更新:2015-05-30 16:57 ?| ?标签:excel ?1 ?2 ?3 ?4 ?5 ?6 分步阅读 for循环语句在VBA中扮演着比较重要的角色,为我们批量的处理表格数据提供了一个很好的途径,下面小编根据自己的一些亲身经验为大家分享一下Excel VBA中for循环语句的两个用法吧!

?office Excel软件 ?具备一定的VB基础更好 1. 1 我们常用的for循环语句有两种,一个是for ……next结构;一个是For each……next结构。这两种结构主要都是针对多数据循环遍历的时候用到的。 那么下面我将分别来介绍一下两种循环结构的具体用法,首先还是要打开VBA编辑器 2. 2 1.for……next结构 这个结构一般是这样的: for i=初始值to 结束值step 步长值 ……

next 具体解释一下,初始值指的是循环开始的值,结束值指的是循环结束的值,实质上就是i值得一个判断,如果i值在起始值和结束值之间,那么进入循环语句,然后i值每运行到next语句后会自动加一个步长值,直至i值超出了初始值到结束值这个围,循环才会结束。这里要说明一下”step 步长值“往往是省略掉的,省略掉的话,步长取默认值为1。下面将以一段小实例来具体说明这个结构的用法: 实例:在sheet1工作表中一次输出1到10这个数,显示在第一列中。 程序: Sub 循环语句() Dim i As Integer For i = 1 To 10 Cells(i, 1) = i Next End Sub

VBA操作文本文件

转载]VBA使用FileSystemObject将读取或写入文本文件 (2011-04-28 08:47:34) 转载▼ 标签: 转载 原文地址:VBA使用FileSystemObject将读取或写入文本文件作者:添成VBA使用FileSystemObject将读取或写入文本文件 原文链接: https://www.doczj.com/doc/c511423892.html,/?viewspace-662523 https://www.doczj.com/doc/c511423892.html,/?viewspace-662526 https://www.doczj.com/doc/c511423892.html,/wengene/archive/2010/08/12/5806500.aspx 在网上找到一样的版本,所以就都列在这里 ********************************************************************* ************** *************************** 正文 ******************************** ************** ********************************************************************* ************** 有时,我们需要将一个文本文件中的数据读取到Excel单元格中,或将指定单元格的内容按指定的格式导出到文本文件中,这时,我们就需要使用 Scripting.FileSystemObject对象来进行操作。在接下来的几篇里我们介绍如何使用FileSystemObject对象操作文本文件的。工欲善其事,必先利其器,那么我们就先花几篇文章来详细介绍下FileSystemObject对象。 一、如何创建FileSystemObject对象 在VBA中,是通过CreateObject函数返回FileSystemObject对象。 示例:

Excel VBA常用技巧代码

1.删除重复行 (1) 2.ActiveX控件的相关操作 (2) 3.单元格内容匹配 (2) 4.单元格填充公式 (3) 5.弹出打开对话框 (3) 6.操作文件夹下的所有工作簿 (3) 7.获取数据区域的最后一行和最后一列 (4) 8.获取列的字母顺序[A~IV] (4) 9.自定义函数返回数组并填充至单元格区域 (4) 10.绘制曲线图 (5) 11.单元格区域拷贝 (6) 12.操纵数据库(查、增、删、改) (6) 13.待定XX (7) 1.删除重复行 关键字:[a65536].End(xlUp).Row、Offset()、相关双层循环 Sub RemoveDuplicate() '删除重复行 For i = [a65536].End(xlUp).Row - 1 To 1 Step -1 '按倒叙删除 For j = [a65536].End(xlUp).Row To i + 1 Step -1 If Cells(i, 1).Value = Cells(j, 1).Value Then Rows(i).Delete End If Next Next End Sub Sub RemoveItem() '删除相邻重复,但不删除隔行重复 Dim i As Long With Range("A2") '以A2为基准进行单元格偏移 Do While .Offset(i, 0) If .Offset(i, 0).Value = .Offset(i - 1, 0).Value Then .Offset(i, 0).EntireRow.Delete i = i + 1 Loop End With End Sub

使用VBA操作文件

使用VBA操作文件(4):FileSystemObject对象 使用VBA操作文件(4):FileSystemObject对象 FileSystemObject对象位于File System对象模型的最高层,并且是该层次中惟一可以在外部创建的对象,也就是说它是惟一能使用New关键字的对象。 FileSystemObject对象有许多用来操作文件系统的方法和属性。下面先看一个例子,如下面的代码: Sub FileInfo() Dim fs As Object Dim objFile As Object Dim strMsg As String Set fs = CreateObject("Scripting.FileSystemObject") Set objFile = fs.GetFile("C:\Windows\System.ini") strMsg = "文件名:" & https://www.doczj.com/doc/c511423892.html, & vbCrLf strMsg = strMsg & "硬盘:" & objFile.Drive & vbCrLf strMsg = strMsg & "创建日期:" & objFile.DateCreated & vbCrLf strMsg = strMsg & "修改日期:" & objFile.DateLastModified & vbCrLf MsgBox strMsg, , "文件信息" End Sub FileInfo过程首先使用CreateObject函数创建一个FileSystemObject对象,用来访问计算机的文件系统。然后,使用GetFile方法创建一个File对象并返回对System.ini文件的引用。接着,利用File对象的Name属性、Drive属性、DateCreated属性、DateLastModified属性返回文件的相应信息。 下面详细介绍FileSystemObject对象的方法和属性。 BuildPath方法 其语法为: oFileSysObj.BuildPath (Path,Name)

VBA文件及文件夹操作

VBA文件及文件夹操作 1.VBA操作文件及文件夹 on error resume next下测试 A,在D:\下新建文件夹,命名为folder 方法1:MkDir "D:\folder" 方法2:Set abc = CreateObject("Scripting.FileSystemObject") abc.CreateFolder ("D:\folder") B,新建2个文件命名为a.xls和b.xls Workbooks.Add ActiveWorkbook.SaveAs Filename:="D:\folder\a.xls" ActiveWorkbook.SaveAs Filename:="D:\folder\b.xls" C,创建新文件夹folder1并把a.xls复制到新文件夹重新命名为c.xls MkDir "D:\folder1" FileCopy "D:\folder\a.xls", "D:\folder1\c.xls" D,复制folder中所有文件到folder1 Set qqq = CreateObject("Scripting.FileSystemObject") qqq.CopyFolder "D:\folder", "D:\folder1" D,重命名a.xls为d.xls name "d:\folder1\a.xls" as "d:\folder1\d.xls" E,判断文件及文件夹是否存在 Set yyy = CreateObject("Scripting.FileSystemObject")

If yyy.FolderExists("D:\folder1) = True Then ... If yyy.FileExists("D:\folder1\d.xls) = True Then ... F,打开folder1中所有文件 Set rrr = CreateObject("Scripting.FileSystemObject") Set r = rrr.GetFolder("d:\folder1") For Each i In r.Files Workbooks.Open Filename:=("d:\folder1\" + https://www.doczj.com/doc/c511423892.html, + "") Next G,删除文件c.xls kill "d:\folder1\c.xls" H,删除文件夹folder Set aaa = CreateObject("Scripting.FileSystemObject") aaa.DeleteFolder "d:\folder" 2.8excel vba一次性获取文件夹下的所有文件名的方法 小生今天上网下载了一个财务常用报表的文件包,里面有几百个excel工作表,要是手工一个一个的获得文件名的话,那我可是要忙十天半月哦。于是想到昨论坛就是vba论坛,昨不充分利用excel 自身的高级应用呀,呵呵,实现的代码如下,把工作量几天的任务可是一下子就完成了,这就是excel vba 给你工作提高效率的结果! excle vba自动获取同一文件夹下所有工作表的名称红色代码: 按Alt+F11,打开VBA编辑器,插入一个模块,把下面的代码贴进去,按F5执行 Sub t() Dim s As FileSearch '定义一个文件搜索对象

Excel VBA编程 For Each...Next

Excel VBA编程For Each...Next For Each…Next语句会重复一个语句块,而它是作用于集合中的每个对象或是数组中的每个元素。当循环执行一次则Visual Basic会自动设置一个变量。 语法: For Each element In group [statements] [Exit For] [statements] Next [element] 在该语句中,主要包含3个参数,其功能如下: ●element 必要参数。用来遍历集合或数组中所有元素的变量。对于集合来说,element可能是一 个Variant变量、一个通用对象变量或任何特殊对象变量。对于数组而言,element只能是一个 Variant变量。 ●group 必要参数。表示对象集合或数组的名称(用户定义类型的数组除外)。 ●statements 可选参数,针对group中的每一项执行的一条或多条语句。 Dim s(2) s(0) = "000000": s(1) = "1111111": s(2) = "222222222" For Each f In s MsgBox f Next 在使用For Each...Next语句过程中,应注意以下几点内容: ●如果集合中至少有一个元素,就会进入For…Each块执行。一旦进入循环,便先针对group中第 一个元素执行循环中的所有语句。如果group中还有其它的元素,则会针对它们执行循环中的语 句,当group中的所有元素都执行完了,便会退出循环,然后从Next语句之后的语句继续执行。 ●在循环中可以在任何位置放置任意个Exit For语句,随时退出循环。 ●可以将一个For…Each…Next循环放在另一个之中来组成嵌套式For…Each…Next 循环。但是每 个循环的element必须是唯一的。

Excle VBA 操作调用文件方法总结

Excel-VBA操作文件方法总结 一、利用Excel对象来处理文件 (4) 1、打开Excel文件 (4) 2、打开文本文件 (4) 3、打开其他文件 (5) 4、保存文件 (6) 5、关闭文件 (6) 6、综合实例 (7) 7、总结 (8) 二、利用VBA文件处理语句来处理文件 (8) (一)文件处理 (8) 1、Name 语句 (8) 2、FileCopy 语句 (9) 3、Kill 语句 (9) 4、GetAttr 函数 (9) 5、SetAttr 语句 (10) 6、FileLen 函数 (10) 7、FileDateTime 函数 (10) (二)目录处理 (10) 1、CurDir 函数 (10) 2、ChDir 语句 (11) 3、ChDrive 语句 (11) 4、Dir 函数 (11) 5、MkDir 语句 (13) 6、RmDir 语句 (13) (三)处理文本文件 (13) 1、Open 语句 (13) 2、Close 语句 (14) 3、Reset 语句 (14) 4、FreeFile 函数 (14) 5、EOF 函数 (15) 6、LOF 函数 (15) 7、Loc 函数 (15) 8、Input # 语句 (15) 9、Write # 语句 (16) 10、Line Input # 语句 (17) 11、Input 函数 (17)

12、Print # 语句 (18) 13、Width # 语句 (19) (四)处理二进制文件 (19) 1、Put 语句 (19) 2、Get 语句 (20) 3、Seek 语句 (20) 4、Seek 函数 (21) (五)总结 (21) 三、利用FileSystemObject对象来处理文件 (21) (一)准备工作 (22) (二)FileSystemObject对象的方法 (22) 1、GetDrive 方法 (22) 2、GetDriveName 方法 (23) 3、GetExtensionName 方法 (23) 4、GetBaseName 方法 (23) 5、GetAbsolutePathName 方法 (23) 6、GetFile 方法 (24) 7、GetFileName 方法 (24) 8、GetFolder 方法 (24) 9、GetSpecialFolder 方法 (24) 10、GetParentFolderName 方法 (25) 11、GetTempName 方法 (25) 12、BuildPath 方法 (25) 13、CreateFolder 方法 (25) 14、CopyFolder 方法 (25) 15、MoveFolder 方法 (26) 16、DeleteFolder 方法 (27) 17、FolderExists 方法 (27) 18、DriveExists 方法 (27) 19、FileExists 方法 (27) 20、CreateTextFile 方法 (27) 21、OpenTextFile 方法 (28) 22、CopyFile 方法 (28) 23、MoveFile 方法 (28) 24、DeleteFile 方法 (29) (三)处理驱动器 (29) (四)处理文件夹 (30) 1、获取文件夹的信息 (30) 2、Folder对象的方法 (30) ⑶Delete 方法 (31) ⑷CreateTextFile 方法 (31)

在VBA中对名称的基本操作

在VBA中对名称的基本操作 (1) 创建名称 ①可以使用下面的代码在当前工作簿中创建名称: https://www.doczj.com/doc/c511423892.html,s.Add Name:="MyName", RefersToR1C1:="=Sheet1!R2C2:R6C4"或者https://www.doczj.com/doc/c511423892.html,s. Add Name:="MyName", RefersTo:="=Sheet1!$B$2:$D$6" 上面的代码在当前工作簿中将工作表Sheet1内的区域B2:D6命名为MyName,该名称为全局名称。在所命名的名称中不能出现空格和单元格引用,并且,如果对命名区域使用A1样式的引用,则最后使用绝对引用,否则所命名的区域将会不确定。 在所命名的名称前加上工作表名,则创建局部名称,如: https://www.doczj.com/doc/c511423892.html,s.Add Name:="Sheet1!MyName1", RefersTo:="=Sheet1!$B$2:$D$6" 上面的代码在工作表Sheet1中命名区域B2:D6为MyName1,该名称为局部名称。 也通过引用指定工作表来创建局部名称,如: Worksheets("sheet2").Names.Add Name:="MyName2", RefersTo:="=Sheet2!$A$1:$B$3" 上面的代码在工作表Sheet2中创建一个局部名称MyName2,代表Sheet2中的单元格区域A1:B3。 ②一种简单的命名方法。例如: Worksheets("Sheet1").Range("B8:C10").Name = "MyName3" 上面的代码将工作表Sheet1中的单元格区域B8:C10命名为MyName3,为全局名称。 Worksheets("Sheet2").Range("H15:G16").Name = "Sheet2!MyName4" 上面的代码将工作表Sheet2中的单元格区域H15:G16命名为MyName4,为局部名称。 注意,这种方法只能应用于命名单元格区域,不能够用来命名公式、数字等。 ③在当前工作表中命名局部区域,该区域为其它工作表中的单元格区域。 Worksheets("Sheet1").Range("E6:F8").Name = "Sheet2!MyName5" 或者: Worksheets("sheet2").Names.Add Name:="MyName5", RefersTo:="=Sheet1!$E$6:$F$8" 上面的代码在工作表Sheet2中命名工作表Sheet1中单元格区域E6:F8为MyName5,该名称为Sheet2中的局部名称。

用vba遍历文件夹和子文件夹中的所有文件

在VBA遍历文件夹和子文件夹中所有文件,常用两种方法,一种是使用VBA的filesercth 对象,另外一种是使用FileSystemObject(windows文件管理工具)和递归方法。兰色对代码进行了注解,希望对大家有所帮助 第二种方法:引用FileSystemObject对象 注意:要使用FileSystemObject对象,需要首先引用一下,具体方法,VBE--工具--引用--找到miscrosoft scription runtime项目并选中 代码及注释: Dim ArrFiles(1 To 10000) '创建一个数组空间,用来存放文件名称 Dim cntFiles% '文件个数 Public Sub ListAllFiles() Dim strPath$ '声明文件路径 Dim i% 'Set fso = CreateObject("Scripting.FileSystemObject") Dim fso As New FileSystemObject, fd As Folder '创建一个FileSystemObject对象和一个文件夹对象 strPath = ThisWorkbook.Path & "\" '"设置要遍历的文件夹目录 cntFiles = 0 Set fd = fso.GetFolder(strPath) '设置fd文件夹对象 SearchFiles fd '调用子程序查搜索文件 Sheets(1).Range("A1").Resize(cntFiles) = Application.Transpose(ArrFiles) '把数组内的路径和文件名放在单元格中 End Sub Sub SearchFiles(ByVal fd As Folder) Dim fl As File Dim sfd As Folder For Each fl In fd.Files '通过循环把文件逐个放在数组内 cntFiles = cntFiles + 1 ArrFiles(cntFiles) = fl.Path Next fl If fd.SubFolders.Count = 0 Then Exit Sub 'SubFolders返回由指定文件夹中所有子文件夹(包括隐藏文件夹和系统文件夹)组成的Folders 集合 For Each sfd In fd.SubFolders '在Folders 集合进行循环查找 SearchFiles sfd '使用递归方法查找下一个文件夹 Next End Sub

EXCEL VBA工作表操作全能方法小结

EXCEL VBA工作表操作全能方法小结 [示例04-01]增加工作表(Add方法) Sub AddWorksheet() MsgBox "在当前工作簿中添加一个工作表" Worksheets.Add MsgBox "在当前工作簿中的工作表sheet2之前添加一个工作表" Worksheets.Add before:=Worksheets("sheet2") MsgBox "在当前工作簿中的工作表sheet2之后添加一个工作表" Worksheets.Add after:=Worksheets("sheet2") MsgBox "在当前工作簿中添加3个工作表" Worksheets.Add Count:=3 End Sub 示例说明:Add方法带有4个可选的参数,其中参数Before和参数After指定所增加的工作表的位置,但两个参数只能选一;参数Count用来指定增加的工作表数目。 -------------------------------------------------------------------------------- [示例04-02]复制工作表(Copy方法) Sub CopyWorksheet() MsgBox "在当前工作簿中复制工作表sheet1并将所复制的工作表放在工作表sheet2之前" Worksheets("sheet1").Copy Before:=Worksheets("sheet2") MsgBox "在当前工作簿中复制工作表sheet2并将所复制的工作表放在工作表sheet3之后" Worksheets("sheet2").Copy After:=Worksheets("sheet3") End Sub 示例说明:Copy方法带有2个可选的参数,即参数Before和参数After,在使用时两个参数只参选一。 -------------------------------------------------------------------------------- [示例04-03]移动工作表(Move方法) Sub MoveWorksheet() MsgBox "在当前工作簿中将工作表sheet3移至工作表sheet2之前" Worksheets("sheet3").Move Before:=Worksheets("sheet2") MsgBox "在当前工作簿中将工作表sheet1移至最后" Worksheets("sheet1").Move After:=Worksheets(Worksheets.Count) End Sub 示例说明:Move方法与Copy方法的参数相同,作用也一样。

VBA操作VBA代码本身

VBA操作VBA代码 dadaV20190409 '基本概念: '1、VBE对象:根对象,表示在VBA编辑器中存在的所有对象的最上层对象; '2、VBAproject对象: VBE编辑器中的工程; '3、VBComponents对象:表示工程中所有的部件集合,包括Excel对象、窗体、模块、类模块; '4、CodeModule 对象:表示部件中相关的代码; '(更具体详解请示参见Visual Basic 2010 开发参考)以下内容为程序具体内容,可直接复制至VBE运行。 '一、返回模块的行数、内容、过程名 '1.返回模块的行数 Sub 返回模块A中的总行数() MsgBox ThisWorkbook.VBProject.VBComponents("VBA操作VBA本身代码").CodeModule.CountOfLines '模块名称:"VBA操作VBA本身代码",根据自身情况修改End Sub Sub 返回过程test1中的总行数() MsgBox ThisWorkbook.VBProject.VBComponents("VBA操作VBA本身代码").CodeModule.ProcCountLines("test1", vbext_pk_Proc) 'ProcCountLines返回在过程声明之前的所有空行及注释行的计数,并且,如果该过程是一段代码模块的最后一个,那么此过程之后的所有空行也计入。 End Sub

Sub 返回过程test1中开始行数() MsgBox ThisWorkbook.VBProject.VBComponents("VBA操作VBA本身代码").CodeModule.ProcBodyLine("test1", vbext_pk_Proc) '模块名称:"VBA操作VBA本身代码",根据自身情况修改 End Sub 'vbext_pk_Get 指定一个返回属性值的过程 'vbext_pk_Let 指定一个赋值给属性的过程 'vbext_pk_Set 指定一个给对象设置引用的过程 'vbext_pk_Proc 指定所有过程除了Property 过程 '2.返回模块的内容 Sub 返回过程test1中的所有代码() Dim 开始行数, 总行数 With ThisWorkbook.VBProject.VBComponents("VBA操作VBA本身代码").CodeModule '模块名称:"VBA操作VBA本身代码",根据自身情况修改 开始行数= .ProcBodyLine("test1", vbext_pk_Proc) 总行数= .ProcCountLines("test1", vbext_pk_Proc) MsgBox .Lines(开始行数, 总行数) End With End Sub '3.返回过程名 Sub 返回第7行所在的过程名() '(程序运行错误,原因不明!) MsgBox ThisWorkbook.VBProject.VBComponents("VBA操作VBA本身代码").CodeModule.ProcOfLine(215, vbext_pk_Proc) '模块名称:"VBA操作VBA本身代码",根据自身情况修改 End Sub

Excel-VBA-操作-Word(入门篇)

Excel-VBA-操作-Word(入门篇)

本文的对象是:有一定Excel VBA基础,对Word VBA还没有什么认识,想在Excel 中通过VBA操作Word还有困难的人。 一、新建Word引用 需要首先创建一个对Word Application 对象的引用。在VBA中,工具-引用,选取“MicroSoft Word 11.0 Object Library”。 方法一、New Word.Application Dim Wordapp As Word.Application Set Wordapp = NewWord.Application Wordapp.Visible = True '可见 'Wordapp.ScreenUpdating =False '屏幕刷新 Dim WordD As Word.Document '定义word类 Set WordD = Wordapp.Documents.Add '新建文档 ‘Set WordD = Wordapp.Documents.open(filename)'打开文档…… WordD.Close '关闭文档 Set WordD = Nothing WordApp.Quit '退出Word对象 方法二、CreateObject Dim WordApp As Object Set WordApp =CreateObject("Word.Application") '新建Word对象‘后续操作及退出一样…… 方法三、GetObject 文件已打开的情况下,使用:SetWordD=GetObject(filename),可建立对文档的引用,如果文件没有打开,则还需要先用方法一或二来操作。 至于方法一和方法二的区别,在网上询问了一下,大师们的回答是: 方法一:前期绑定,好处是在对象后输入句点可以给出快速提示,因为需要先引用对象,所以容易出现版本兼容问题。 方法二:后期绑定,没有提示,根据运行代码机器上对象的版本创建对象,兼容性好。

相关主题
文本预览
相关文档 最新文档