中企动力 > 商学院 > excel中vba的使用
  • ?

    VBA代码之九:如何利用VBA代码进行选择操作

    褚君浩

    展开

    今日和大家分享VBA的实用语句之九,这节主要是讲解选择的方法在VBA中的实现方法,如果在EXCEL中主要轻点鼠标就可以实现,那么在VBA中是如何实现的呢?我们看下面的代码。

    1 Sheets("BBC").Activate.

    语句说明:执行上述代码后,选择一个名为"BBC"的工作表:

    备注:在工作表的操作时可以用select.

    2 Range("A1").Select

    语句说明:执行上述代码后,选择一个名为" A1"的单元格:

    备注:RANGE是单元格,也可以用CELLS(M,N)来代替,其中M是行,N是列。

    3 Range("A1:G8").Select

    语句说明:执行上述代码后,选择"A1:G8"的连续单元格:

    选择不连续的单元格:

    Range("A1,B6,D9").Select

    Range("A1,B6:B10,D9").Select

    语句说明:执行上述代码后,选择不连续单元格:"A1,B6,D9","A1,B6:B10,D9"

    备注:CELLS()的单元格表示方式是不能用这种表示方法的。

    4 Cells.Select

    语句说明:执行上述代码后,选择整个工作表:

    备注:注意select和selection的区别。

    5 Range("A1").CurrentRegion.Select

    语句说明:执行上述代码后,选择当前单元格所在的区域(遇到空行/空列即止):

    备注:CurrentRegion的意义是区域,CurrentRegion属性返回代表当前区域的Range对象。当前区域是指包含有当前单元格的由空行和空列围绕组成的区域。在该区域中,必须保证区域中的每一行或列中至少有一个存在数据的单元格。 但是,该属性在受保护的工作表中无效。如何理解上面“由空行和空列围绕组成的区域”呢?我们看下面的实例:

    代码:

    现在有下面的区域:、

    执行代码后:

    上面深色区域是选择后的区域。它是由空格包围的。

    6 Rows("1").Select

    Columns("A").Select

    或者:

    ActiveCell.EntireRow.Select

    ActiveCell.EntireColumn.Select

    语句说明:执行上述代码后,选择行或列。

    7 Columns("A:C").Select

    Rows("1:5").Select

    语句说明:执行上述代码后,选择选择相邻的多行/多列:

    备注:使用"Columns/Rows":要注意和下面第八点的区别。

    8 Range("A:A, C:C, E:F").Select

    Range("1:1,5:6,9:9").Select

    语句说明:执行上述代码后,选择不相邻的多行/多列:

    备注:和选择相邻的多行/多列不同,使用"Range"而不是"Columns/Rows"

    9 Range("A1", Range("A1").End(xlDown)).Select

    Range(ActiveCell, ActiveCell.End(xlDown)).Select

    语句说明:执行上述代码后选择当前活动单元格向下至最后一个非空单元格:

    备注:注意理解End(xlDown)的意义,相当于CTRL+END

    今日回向:

    1 选择包括哪些内容?

    2 如何理解CurrentRegion属性?

  • ?

    excel多工作表合并最简单方法,不用写函数公式,不用写VBA代码!

    迎梅

    展开

    转载自百家号作者:excel函数教程

    工作簿中多表合并为一表,纯工具操作,不会写公式函数和VBA的同学们不用担心,看完之后就会了。操作版本为微软office2016,使用工具是Power Query,如果您的版本是excel2010或2013,可以在网上下载Power Query插件安装即可。

    以下图为例,需要将工作簿中的三个工作表合并为一个工作表。(不管你工作表有多少个,都可以轻松合并)

    选择数据选项卡-获取数据-至文件-从工作簿 ,然后选择电脑上要合并的工作簿点击导入即可

    导入之后出现导航器对话框,选择工作簿文件,点击下方编辑

    这时候进入查询编辑器对话框,然后点击Date列右边的扩展按钮,勾选展开,然后点击确定。

    这时可以看到数据已经展开显示出来了。

    但是因为每个工作表都有一行标题,所以标题也被合并进去了,这时候选择开始选项卡下的“将第一行用作标题”

    然后筛选姓名这一列,将“姓名”取消勾选,点击确定。

    之后将下面的滚动栏滚到最右边,可以发现有三列多余的数据,按住CTRL键选选择三列数据,点击开始选项卡下的删除列即可。

    最后点击开始选项卡的“关闭并上载至”

    就可以看到自动新建了一个合并后的工作表数据。

    如果以后分别在其它三个工作表中有增加了新数据,可以直接点击数据选项卡下的“全部刷新”,数据就会同步到合并工作表中。

  • ?

    在Excel中如何使用VBA使单元格的颜色产生变化

    牟书瑶

    展开

    首先,你必须有点VB的基本常识。

    只要会用8个最简单的语句,例如:

    for i = 1 to 20

    next

    if x=20 then

    goto 1000

    end

    然后:你点开工作薄,点开工具,再点开宏,录制新宏。这时,你把你所要的单元格点成你所要的颜色。然后关闭宏。你再键ALT +F11,你就进入VBA后台了,点击模块1,这就是刚才电脑纪录你动作的宏,其实就是电脑在帮你编程。你理解一下,再修改。

    只要你有悟性,慢慢地,你什么都会编的。反正先让电脑自己做宏,你学习并修改。我们现在可以在单元格里做动画。

    VBA用处很大,学会VBA及后台编程,按微软的说法,你就不再是一个EXCEL用户,而是一个专家。好好钻吧。

    我们就是先让电脑自己做宏,然后对照书修改。渐渐你就会做一些电脑自己做不出来的东西了!EXCEL非常神奇啊!里面可学的东西太多太多。而我们通常看到大家都在“用”EXCEL,那简直是在糟蹋EXCEL。

  • ?

    Excel VBA之自定义函数Function

    菲什加德

    展开

    =============================================================

    ====================

    || 版本号:Excel2013. ||

    VBA有两个基本过程,一个是Sub过程,一个是Function过程。

    其中Function过程就是自定义函数,本篇就来介绍它

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    自定义函数的基本语法

    Function也是保存在模块中

    如下:

    注:(1)带[]号的都是可选内容。第一行最后的As语句表示指定函数返回的数据类型。

    (2)如果想强制退出函数过程,则在需要位置加上语句 Exit Function

    (3)最后必须把过程计算的结果返回给函数名称。

    (4)使用自定义的Function与使用Excel已有的函数是一样的。但是要注意,私有的函数是

    不会出现在“插入函数”对话框里的。

    举一个例子,计算特定单元格区域背景颜色为黄色的单元格数目,该函数如下:

    注意:这个函数需要你传入所要计算的单元格区域

    设定自定义函数为易失性函数

    有时当工作表重新计算时,自定义的函数并不会重新计算。此时我们要手工将自定义的Function

    设定为易失性函数就可以了。设定也很简单,值需要在函数开始的第一句写上如下代码即可:

    注意:当表格改变时,易失性函数也会重新计算。但是想单元格背景色的改变不会导致表格重新计算,

    因此易失性函数也不会重新计算。

  • ?

    Excel如何用VBA自动合并同目录下的多个excel工作簿文件

    蚕宝宝

    展开

    在excel的使用过程中,有时候我们需要将同目录下有着相同标题的多个excel工作簿合并到一个excel工作簿中,比如下面这种情况,5个年级的学生名单合并到一个表里面去。

    常用的做法是手工打开每个文件,复制粘贴到学生名单汇总一个表里去。

    这里介绍一个偷懒的方法,用VBA代码自动合并。代码分4段,第1段是主代码,后面3段是自定义函数。建议把代码复制粘贴到个人工作簿的模块里,方便调用。打开学生名单汇总.xlsx ALT+F8运行该代码。

    以下是具体代码,复制粘贴

    Sub 同目录下合并多个excel工作簿()

    'On Error Resume Next '// 发生错误,自动执行下一句,就是忽略错误

    Application.ScreenUpdating = False '//关闭屏幕刷新

    Application.DisplayAlerts = False '//关闭系统提示

    t = Timer '//开始时间

    Set SH0 = ActiveWorkbook.Worksheets(1)

    SH0.Cells.Clear '//清空保存区域,全部数据第一行是标题行,且只占一行,无合并单元格

    ARR = FileAllArr(ActiveWorkbook.Path, "*.xlsx", ActiveWorkbook.Name, False) '//详见函数说明

    SHName = "sheet1" '//要求所有工作簿内需要统计的工作表名称相同,

    For i = 0 To UBound(ARR)

    Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ARR(i) '//Excel2007

    ' Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';data source=" & & ARR(I) '//OFFICE2003,根据情况选择

    StrSQL = "SELECT *,'" & GetPathFromFileName(ARR(i), False) & "' AS 来自工作簿 FROM [" & SHName & "$]" '//SQL语句自己发挥吧,这里是精髓。

    IROW = SH0.Range("A1048576").End(3).Row + 1

    If IROW <= 2 Then

    IROW = 1

    Crr = GET_SQLCoon(StrSQL, Str_coon, True) '//第一次,带上标题

    Else

    Crr = GET_SQLCoon(StrSQL, Str_coon, False)

    End If

    SH0.Range("A" & IROW).Resize(UBound(Crr, 1) + 1, UBound(Crr, 2) + 1) = Crr '//粘贴查询结果

    Next

    Application.ScreenUpdating = True '//恢复屏幕刷新

    Application.DisplayAlerts = True '//恢复系统提示

    MsgBox "汇总用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!" '//提示所用时间

    End Sub

    Rem 下面是为方便整理的自定义函数,上面的代码执行必不可少哟!!

    '*******************************************************************************************************

    '功能: 查找指定文件夹含子文件夹内所有文件名或文件夹名(含路径)

    '函数名: FileAllArr

    '参数1: Filename 需查找的文件夹名 不含最后的"\"

    '参数2: FileFilter 需要过滤的文件名,可省略,默认为:[*.*]

    '参数3: Liwai 剔除例外的文件名,可省略,默认为:空,一般为:ThisWorkbook.Name

    '参数4: Files 是否只要文件夹名,可省略,默认为:FALSE

    '返回值: 一个字符型的数组

    '使用方法:arr = FileAllArr(ThisWorkbook.Path, "*.xls", ThisWorkbook.Name,false)

    '*******************************************************************************************************

    Public Function FileAllArr(ByVal Filename As String, Optional ByVal FileFilter As String = "*.*", Optional ByVal Liwai As String = "", Optional ByVal Files As Boolean = False) As String()

    Set Dic = CreateObject("Scripting.Dictionary") '创建一个字典对象

    Set Did = CreateObject("Scripting.Dictionary")

    Dic.Add (Filename & "\"), ""

    i = 0

    Do While i < Dic.Count

    Ke = Dic.keys '开始遍历字典

    MyName = Dir(Ke(i), vbDirectory) '查找目录

    Do While MyName <>""

    If MyName <> "." And MyName <> ".." Then

    If (GetAttr(Ke(i) & MyName) And vbDirectory) = vbDirectory Then '如果是次级目录

    Dic.Add (Ke(i) & MyName & "\"), "" '就往字典中添加这个次级目录名作为一个条目

    End If

    End If

    MyName = Dir '继续遍历寻找

    Loop

    i = i + 1

    Loop

    Dim arrx() As String

    i = 0

    If Files = True Then '//是否只输出文件夹名

    For Each Ke In Dic.keys '以查找总表所在文件夹下所有excel文件为例

    ReDim Preserve arrx(i)

    If Ke <> Filename & "\" Then '//自身文件夹除外

    arrx(i) = Ke

    i = i + 1

    End If

    Next

    FileAllArr = arrx

    Else

    For Each Ke In Dic.keys '以查找总表所在文件夹下所有excel文件为例

    MyFileName = Dir(Ke & FileFilter) '过滤器:EXCEL2003为:*.xls,excel2007为:*.xlsx

    Do While MyFileName <>""

    If MyFileName <> Liwai Then '排除例外文件

    ReDim Preserve arrx(i)

    arrx(i) = Ke & MyFileName

    i = i + 1

    End If

    MyFileName = Dir

    Loop

    Next

    FileAllArr = arrx

    End If

    End Function

    '****************************************************************

    '*'****************************************************************************************************

    '函数: GetPathFromFileName 根据全路径获得文件名

    '参数1:strFullPath 完整路径

    '参数2:kzm true 返回字符串含扩展名

    '参数3:strSplitor 各级文件夹分隔符

    '作用: 从完整路径获取返回: 文件名(true带扩展名)

    '使用方法: msgbox GetPathFromFileName("C:\windows\text.txt",true)

    '*'****************************************************************************************************

    Public Function GetPathFromFileName(ByVal strFullPath As String, Optional ByVal kzm As Boolean = True, Optional ByVal strSplitor As String = "\") As String

    Dim FileName1 As String

    Dim FNAME As String

    FileName1 = Left$(strFullPath, InStrRev(strFullPath, strSplitor, , vbTextCompare))

    FileName1 = Replace(strFullPath, FileName1, "")

    If kzm = False Then

    GetPathFromFileName = Left(FileName1, InStr(FileName1, ".") - 1)

    Else

    GetPathFromFileName = FileName1

    End If

    End Function

    '*'****************************************************************************************************

    '*****************************************************************************************

    '函数名: GET_SQLCoon

    '函数功能: 获得指定SQL的查询结果,自定义连接字符串,可以连接各种数据库

    '返回值: 返回一个二维数组

    '参数1: StrSQL 字符类型 SQL查询语句

    '参数2: Str_coon 字符类型 数据库连接语句

    '参数3: Biaoti 可参数选 是否输出标题,默认带有标题

    '使用方法: Arr = GET_SQLCoon(StrSQL,Str_coon,true)

    ' Arr(0,1) '//数组第一行为标题行,从i=1 开始是数据

    ' Sh2.Range("A2").Resize(UBound(ARR, 1) + 1, UBound(ARR, 2) + 1) = ARR

    '*****************************************************************************************

    Public Function GET_SQLCoon(ByVal StrSQL As String, ByVal Str_coon As String, Optional Biaoti As Boolean = True) As Variant()

    On Error Resume Next ' 改变错误处理的方式。

    Dim Cn, RS

    Err.Clear

    Set Cn = CreateObject("Adodb.Connection") '//新建一个ADO连接

    Set RS = CreateObject("adodb.recordset")

    Cn.Open Str_coon

    RS.Open StrSQL, Cn, 1, 3

    If RS.RecordCount > 0 Then '//如果找到数据

    If Biaoti = True Then

    ReDim ARR(0 To RS.RecordCount, 0 To RS.Fields.Count - 1)

    For a = 0 To RS.Fields.Count - 1 '//导入标题

    ARR(0, a) = RS.Fields(a).Name

    Next

    For i = 0 To RS.RecordCount - 1 '//导入数据

    For a = 0 To RS.Fields.Count - 1

    ARR(i + 1, a) = RS.Fields(a).Value

    Next a

    RS.MoveNext

    Next

    Else

    ReDim ARR(0 To RS.RecordCount - 1, 0 To RS.Fields.Count - 1)

    For i = 0 To RS.RecordCount - 1 '//导入数据

    For a = 0 To RS.Fields.Count - 1

    ARR(i, a) = RS.Fields(a).Value

    Next a

    RS.MoveNext

    Next

    End If

    Else '//如果没有找到数据

    ReDim ARR(1, 1)

    ARR(0, 0) = ""

    End If

    GET_SQLCoon = ARR

    Cn.Close '//关闭ADO连接

    Set RS = Nothing

    Set Cn = Nothing '//释放内存

    End Function

    '*****************************************************************************************

  • ?

    python操作Excel,相比VBA你更喜欢哪个

    资乐珍

    展开

    大家都知道在excel中用VBA代码可以解决很多批处理操作问题,因为VBA是excel原生脚本语言,所以在便利性上有着得天独厚的优势,只要你电脑有excel,那么就可以立刻使用这个VBA脚本代码来解决问题。其实除了vba还有很多脚本语言可以来操作excel,比如python脚本。

    python跟vba一样都是脚本类语言,只不过python的用途更广些,而且代码好看些。由于是独立的程序,需要单独安装,这个有些麻烦,除此之外,如果你掌握好了相关的知识之后完全可以用他来任意处理excel文档。

    下面说一下在windows系统上,如何使用python来连接操作excel文档。

    首先要从python官网下载python主程序,安装好后,然后下载连接excel的接口模块程序pywin32,进行安装,2个步骤完成之后,就可以打开python shell界面,进行代码输入了。我这里使用的python版本是2.7,这个看自己的习惯喜好了。

    python excel

    小实例:在d盘的test.xls文档单元格A1中输入内容

    >>> import win32com.client #加载pywin32模块

    >>> xl=win32com.client.Dispatch("Excel.Application") #建立连接EXCEL程序的对象xl

    >>> book=xl.Workbooks.Open("d:\\test.xls") #用xl打开d盘下的test.xls工作簿

    >>> book.worksheets(1).cells(1,1).Value="输入的内容" #在工作簿的第一个表格第一个单元格输入内容

    >>> book.Save() #保存工作簿

    >>> book.Close() #关闭工作簿

    python excel

    请点击此处输入图片描述

    一步一步运行完之后(当然也可以保存成脚本文件运行),用鼠标打开d盘下的test.xls文件,就可以看到刚刚输入的内容了。

    python excel

    请点击此处输入图片描述

  • ?

    关于Excel VBA编程的小技巧

    黑白猜

    展开

    1、 根据条件删除行

    Sub deleteRows(strTable, condition1, condition2)

    Dim i, j, iMax, jMax As Long

    Dim iicondition1, iicondition2 As Integer

    With Worksheets(strTable)

    iMax = .UsedRange.Rows.Count

    jMax = .UsedRange.Columns.Count

    i = 2

    Do While i < iMax + 1

    iicondition1= .Cells(i, 1)

    iicondition2 = .Cells(i, 2)

    If (iicondition1= condition1And iicondition2 = condition2) Then

    .Rows(i & ":" & i).Delete shift:=xlUp

    iMax = iMax - 1

    Else

    i = i + 1

    End If

    Loop

    End With

    End Sub

    2、 删除所以的使用range

    Worksheets("sheetName").UsedRange.Delete shift:=xlUp

    3、打开某指定路径的文件夹对话框

    Function GetFileName(ByVal DialogType As MsoFileDialogType, ByVal defaultPath As String) As String

    With Application.FileDialog(DialogType)

    .Title = "XXXX:"

    .AllowMultiSelect = False

    .Filters.Clear

    .Filters.Add "Excel Files", "*.xlsm"

    .Filters.Add "All Files", "*.*"

    .InitialFileName = defaultPath

    If .Show = True Then

    GetFolderName = .SelectedItems(1)

    End If

    End With

    End Function

    4、截取字符段

    从右边开始,查找某字符,然后截取其后面的字符串。

    xlsPath2 = Right(xlsPath, InStr(StrReverse(xlsPath), "\") - 1)

    5、Sharepoint数据的刷新

    Worksheets("Sharepoint对应的sheet").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False

    6、当前使用的range的取得

    .UsedRange ‘对应的range

    .UsedRange.Rows.Count ‘对应的行号

    .UsedRange.Columns.Count 对应的列号

    7、在Excel内部打开另外一个Excel (不显示,隐藏)并读取其数据

    Set xlsApp = New Excel.Application

    xlsApp.Visible = False

    xlsPath = ThisWorkbook.Path

    Set xlsWB = xlsApp.Workbooks.Open(xlsPath, Null, ReadOnly)

    ‘读取/写入对应的sheet

    X = xlsWB.worksheets(“xxxx”).cells(i,j)

    xlsWB.worksheets(“xxxx”)..Cells(i, j).Formula = "=E” & i

    8、计算处理

    '如果你的表中有大量的计算单元格,那就需要关闭自动计算,否则慢的要死

    ‘在VBA开始,设置为手动

    'Application.Calculation = xlCalculationManual

    'Application.ScreenUpdating = False

    ‘在VBA开始,设置为自动

    'Application.Calculation = xlCalculationAutomatic

    'Application.ScreenUpdating = False

    注意,还有一种方法是再打开本excel的时候,就设置为手动,对于需要计算的sheet,单独在其数据填充完毕后,执行计算操作。

    例如: Worksheets("XXXXX”).Calculate ‘这是效率最高一种方法。当然,你也可以对某些range,单独进行range计算。

    9、Range到range的只读拷贝、黏贴

    Worksheets("srcSheet").Range(.Cells(1, 1), .Cells(x,y)).Copy

    Worksheets("dstSheet").Cells(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

    10、Cell内容的替换操作

    Worksheets("CostTable").Cells.Replace What:="Original Content", Replacement:="replease Content", LookAt:=xlPart, _

    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    11、自动填充

    Worksheets("xxxx")..Range("D8:F8").AutoFill Destination:=.Range(.Cells(8, 4), .Cells(rMax, 8)), Type:=xlFillDefault

    12、获取pivot的使用区域、

    Set pvt = Worksheets("xxxx").PivotTables("PivotTable_xxxx")

    Set rngTable = pvt.TableRange1

    13、刷新pivot

    Worksheets("xxxx").PivotTables("PivotTable_xxxx").PivotCache.Refresh

  • ?

    Excel2010三种快速打开VBA界面的小技巧

    幼南

    展开

    Visual Basic for Application(简称VBA)是一种必须依赖母系程序方能使用的程序,属于VB程序语言的一个子集。我们常用的Excel电子表格除了常规的可视化命令之外,还可以通过VBA代码来操控Excel实现一些较复杂的逻辑运算及统计分析等。我们不仅可以使用代码实现数据的统计运算,还能实现图表的自动生成于刷新,以及图形的旋转与移动。在网上我们可以找到有很多大牛基于Excel的VBA,开发了一些具有特定功能的代码,以及酷炫的游戏界面等。如果您对这方面感兴趣的话,那你必须掌握的第一步操作就是打开VBA界面来认实它。

    复杂的逻辑运算使我们身心俱疲

    闲话少聊,下面就重点介绍一下从Excel窗口切换到VBA界面的操作技巧。

    方法一是通过功能区的选项卡来实现。首先在菜单栏中找到开发工具项,然后在代码功能模块中找到Visual Basic命令按钮,单击它即可快速切换到VBA界面。若菜单栏中没有开发工具这一项,需要设置自定义功能区下的主选项卡来调出该命令。

    功能区的主选项卡-开发工具

    2.方法二是通过工作表标签来实现。首先在Excel界面左下角找到工作表标签区域,右键单击任一一个工作表标签,本教程以Sheet1工作表为例,在弹出的右键菜单中选择查看代码命令,随后即可激活VBA界面。

    Excel工作表标签

    3.方法三是通过快捷键法实现。在Excel操作界面下,按下组合键Alt+F11即可快速切换到VBA界面;在VBA界面下按此组合键即可快速关闭VBA窗口。

  • ?

    Excel中的VBA代码你可以写出来,可是你真的会优化代码吗?

    甄书瑶

    展开

    我们很多时候在用Excel VBA去实现某一个功能的时候,也许会用到很多行的代码去实现我们最终要的结果。

    可是有时候你殊不知,有些代码是经过录制宏产生的,或者语句繁琐,变量不正确从而造成你所写的程序运行的时间非常久,或者造成计算机的CPU使用率达到100%,严重可导致系统崩溃发生。

    但是这样的结果显而易见,并不是我们想要的结果。我们想要的是一个可靠的,高效率的,简化操作的,提高劳工效率,减少错误率的,适应性强的程序。

    所以我们不得不寻求更好的方法去改善,去优化代码,以寻求高效率完成我们的工作。

    下面我们重点和大家分享一下,怎么去优化我们的代码:

    1.关闭屏幕刷新,速度可以提升30%的速度。所以大家在写完代码的时候,不妨在我们程序最开始加上这句话,当然在程序执行完之前,也就是最后一句话的时候,你要记得将屏幕刷新打开。

    Sub test()

    Application.DisplayAlerts = False

    Cells(1, 1) = 1

    Application.DisplayAlerts = True

    End Sub

    2. 使用工作表函数,这句话的意思就是说我们某些时候,可以优先考虑Excel自带的函数去实现这个,而不是我们自己去写代码。当然效果都是一样的,但是时间可能就不是一样。

    Sub ShtFunctions()

    a.使用循环进行数据累加计算

    For i = 1 To 40000

    MySum = MySum + Cells(i, 1)

    Next

    b.直接使用工作表进行求和

    Cells(1, 1) = Application.Sum(Range("A1:A40000"))

    End Sub

    3. 使用With-End With语句,减少引用对象的寻找速度,提高程序的效率。当然这样还有一个优点,就是我们要改变引用对象的时候,只需改变一个位置即可,这样也便于后期的维护和修改。

    Sub test()

    With Range("E5").Font

    .Color = -16776961

    .Font.Bold = True

    .Name = "宋体"

    .Size = 9

    .Name = "Arial Unicode MS"

    .Size = 9

    End With

    End Sub

    4.数据类型的正确选用,这个也是非常关键的。这个就好像你去打水喝,正确的应该是拿杯子过去,但是你拿着一个很大的桶去接水喝,当然都可以完成喝水这个动作,但是明显就可以看出拿桶的那个人选择就有问题。其实在我的Excel中处理数据的能力也是不一样的,处理速度最快的是long>integer>byte>Single>Double>Currency。需要注意的是,如果我们不定义变量,那么系统默认为Variant类型,当我定义合适,速度就会有提升,所以每次我们千万记得要选择最合适自己的啦!

    5.使用数组,数组和字典是VBA的核心功能,所有在可以使用数组的时候,千万记得使用数组。在某些时候,在使用数组和不使用数组对比下,速度可能相差100倍。尽量减少变量的使用,增加数组和字典的配套使用。还有就是多使用动态的数据,少使用静态的数据,数组的Redim和Preserve要常记得。

    6.多清除对象的缓存,比如 Set d = Nothing,这句话的意思就是卸除对象的引用。这样也可以稍微加快一点执行的速度。另外我们可以通过减少循环的次数,减少类模块的使用,减少模块的使用,减少我们语句中的激活的次数,或者寻找更优质效率更高的代码。

    以上就是自己在学习VBA的时候,自己的一点点优化代码的一点点方法,可能还有其他的更好的优化只能慢慢去了解去学习,慢慢积累。虽然Excel VBA并不万能的,但是能帮助我们提高工作效率,就已经足够让你我欣慰。与君共勉之!

    PS:学习的苦难需要我们主动面对,生活的苦难你躺着它自己主动就过来啦!与君共勉!!!

    以上就是今天要和大家分享的技巧,希望对大家有所帮助,祝各位一天好心情!

    唯有不断学习,才能不被淘汰!

    Excel中每一个方法都有特定的用途,不是他们没有用处,只是你不了解或者暂时用不着,建议你收藏起来,万一哪天用着呢?

  • ?

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

    觅海

    展开

    [ 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用来指定增加的工作表数目。

    --------------------------------------------------------------------------------

    [ 02]复制工作表(Copy方法)

    Sub CopyWorksheet()

    MsgBox "在当前工作簿中复制工作表sheet1并将所复制的工作表放在工作表sheet2之前"

    Worksheets("sheet1").Copy Before:=Worksheets("sheet2")

    MsgBox "在当前工作簿中复制工作表sheet2并将所复制的工作表放在工作表sheet3之后"

    Worksheets("sheet2").Copy After:=Worksheets("sheet3")

    示例说明:Copy方法带有2个可选的参数,即参数Before和参数After,在使用时两个参数只参选一。

    [ 03]移动工作表(Move方法)

    Sub MoveWorksheet()

    MsgBox "在当前工作簿中将工作表sheet3移至工作表sheet2之前"

    Worksheets("sheet3").Move Before:=Worksheets("sheet2")

    MsgBox "在当前工作簿中将工作表sheet1移至最后"

    Worksheets("sheet1").Move After:=Worksheets(Worksheets.Count)

    示例说明:Move方法与Copy方法的参数相同,作用也一样。

    [ 04]隐藏和显示工作表(Visible属性)

    [ 04-01]

    Sub testHide()

    MsgBox "第一次隐藏工作表sheet1"

    Worksheets("sheet1").Visible = False

    MsgBox "显示工作表sheet1"

    Worksheets("sheet1").Visible = True

    MsgBox "第二次隐藏工作表sheet1"

    Worksheets("sheet1").Visible = xlSheetHidden

    MsgBox "第三次隐藏工作表sheet1"

    Worksheets("sheet1").Visible = xlSheetVisible

    MsgBox "第四隐藏工作表sheet1"

    Worksheets("sheet1").Visible = xlSheetVeryHidden

    MsgBox "第五隐藏工作表sheet1"

    示例说明:本示例演示了隐藏和显示工作表的各种情形。其中,使用xlSheetVeryHidden常量来隐藏工作表,将不能通过选择工作表菜单栏中的“格式”——“工作表”——“取消隐藏”命令来取消隐藏。

    [ 05]

    Sub ShowAllSheets()

    MsgBox "使当前工作簿中的所有工作表都显示(即将隐藏的工作表也显示)"

    Dim ws As Worksheet

    For Each ws In Sheets

    ws.Visible = True

    Next ws

    [ 06]获取工作表数(Count属性)

    [ 05-01]

    Sub WorksheetNum()

    Dim i As Long

    i = Worksheets.Count

    MsgBox "当前工作簿的工作表数为:" & Chr(10) & i

excel中vba的使用

所有视频需要登录后,才能观看

请先登录您的帐号,即可完整播放,如果您尚未注册帐号,请先点击注册。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP