= VLOOKUP(E32,Sheet2!$B1:$C6,1,FALSE) E32 in Sheet2!$B1:$C6 取$B1:$C6的第一列值 FASLE=精确匹配 ==============================================================================================================================================================================================================================================excel 宏开发 开发工具-->>插入-->>按钮 我们按快捷键Ctrl+G调出立即窗口(用来显示debug.print输出值和调试输出) 批量注释:在VBE窗口中,“视图”――“工具”――“编辑”――“设置注释块” 【或解除注释块】 ------------------------------------------------------------------------------------------------------------------------------问题: 1、无法运行“a. xlsx!按钮”宏。可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用。【解决】:开发者工具--宏安全性--启用所有宏 2、无法在未启用宏的工作簿中保存以下功能:.VB项目 若要使保存的文件具有这些功能,请单击“否”,然后从“文件类型”列表中选择-个启用宏的文件类型。 若要继续保存为未启用宏的工作簿,请单击“是”。 【解决】:点击否,另存为*.xlsm格式 ------------------------------------------------------------------------------------------------------------------------------代码格式优化 Application.Workbooks("Book1").Worksheets("sheet1") _ .Range("A1:D100").Font.Bold = True 更改长行代码为短行代码,在子句后面输入一个空格和一个下划线(_),然后换行,这就把一行代码分成两行。 Dim a%, b%, c%: a = 1: b = 2: c = 3 把多行合并为一行,在第一行代码后加上英文冒号(:),可以接着写第二行代码 ------------------------------------------------------------------------------------------------------------------------------测试示例 Sub 按钮() MsgBox "现在的时间是:" & Time() '现在的时间是: 23:16:59 Dim wrows As Integer, wcols As Integer Let wrows = ActiveSheet.UsedRange.Rows.Count Let wcols = ActiveSheet.UsedRange.Columns.Count Let trows = Application.CountA(ActiveSheet.Range("A:A")) Debug.Print "A列空" & wrows - trows & "行" MsgBox ("共有" & wrows & "行," & wcols &"列,A列空" & wrows - trows & "行") End Sub --------------------------------------------------------------------------------------------------【变量】 字节型(Byte)、整数型(Integer)、长整数型(Long)、单精度浮点型(Single)、双精度浮点型(Double)、货币型(Currency)、小数型(Decimal)、字符串型(String)、日期型(Date)、布尔型(Boolean) Dim I As Integer, zROW As Integer, xzN As Integer 声明常量--常量定义:Const 变量名称 As 数据类型=数值 Const pi As Single=3.14 变量声明格式:Dim|Private|Public|Static <变量1> as <类型1> [,<变量2> as <类型2> …..] Dim 可以用在任何场合定义变量 Private 可以用于定义窗体级或模块级,不能在过程中使用 Public 用于窗体级或者模块级定义全局变量,不能在过程内部使用 Static 只能在过程内部使用,用于定义静态的局部变量,静态变量,整个代码运行期间值不变 给变量赋值 Dim str As String '声明str字符串变量 Let str = "一起来学习VBA" '给str赋值 Dim rng = Range   '声明rng变量为Range类型 Set rng = Worksheets("sheet1").Range("A1") '给变量rng赋值 rng.Value = "欢迎来到ExcelHome论坛" '将文本写入变量指定的单元格 【数组】-------------- Dim arr As Variant '定义变量 arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) '将1-10的自然数赋给数组 MsgBox "arr数组的第2个元素为:" & arr(1) arr = Split("邓成,林梅,张青,孔丽,冯吉维,孔佳", ",") '第一个参数包含分隔符或字符串变量,第二个参数是分隔符,Split函数返回的数组的最小索引都是0 MsgBox "arr数组的第2个元素为:" & arr(1) arr = Range("A1:C3").Value '将A1:C3单元格内容存储到数组arr里 Range("E1:G3").Value = arr '将数组arr的数据写入大E1:G3 ,将数组的值写入到单元格区域时,单元格区域的大小必须与数组相同 arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) '将一维数组写入单元格区域,单元格区域必须在同一行。如果要写入垂直的一列单元格区域,必须先使用工作表的Transpose函数进行转换 Range("A1:A9").Value = Application.WorksheetFunction.Transpose(arr) Dim arr As Variant, txt As String arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) txt = Join(arr, "@") '分割符@可以省略,如果省略,默认使用空格作为分隔符 MsgBox txt ------------------------------------------------------------------------------------------------【逻辑运算符】 And 执行逻辑"与”运算 表达式1 And表达式2|两 个表达式都为True,则返回True Or 执行逻辑"或”运算 表达式1Or表达式2 只要有一个表达式为True,则返回 True Not 执行逻辑“非”运算 Not表达式 表达式为True,返回False Like 比较两个字符串是否匹配 字符串1 Like字符串2 ------------------------------------------------------------------------------------------------【通配符】 * 代替任意多个字符 "李家军" Like "*家*" = True ? 代替任意的一个字符 "李家军" Like "李??" = True # 代替任意的一一个数字 1 "商品5" Like "商品#" = True -----------------------------------------------------------------------------------------------【逻辑控制】 ============================================If…Then语句 If Time < 0.5 Then MsgBox "早上好!" ElseIf Time > 0.75 Then MsgBox "晚上好!" Else MsgBox "下午好!" End If ============================================Select Case语句 Select Case Cells(2, "H") Case Is < 150 xj = "四星级" Case Else xj = "五星级" End Select ============================================For…Next语句 跳出循环 Exit For Dim i As Integer For i = 2 To 19 Step 1 Debug.Print i Next i ============================================For Each…Next语句 跳出循环 Exit For Dim sht As Worksheet, c As Range, i As Integer:i = 1 For Each sht In Worksheets Debug.Print sht.Name i = i + 1:Next sht i = 1 For Each c In Range("A1:A10") c.Value = i i = i + 1:Next c ============================================Do While语句 跳出循环 Exit Do Dim i As Integer:i = 1 Do While Cells(i, "A") <> "" Debug.Print i i = i + 1:Loop ============================================Do Until语句 跳出循环 Exit Do Dim i As Integer:i = 1 Do Until Cells(i, "A") = "" Debug.Print i i = i + 1:Loop =====================跳出循环 可简写 If i = 3 Then Exit Do If i = 3 Then Debug.Print "跳出循环" Exit Do End If ----------------------------------------------------------------------------------------------【函数声明及调用】 =============================='无参函数 Sub SayHello() MsgBox "好!" End Sub ------------------------ Sub RunSub() '调用 SayHello '过程名[参数1,参数2…] Call SayHello 'Call 过程名[(参数1,参数2…)] Application.Run "SayHello" '利用Application对象的Run方法,Application.Run 表示过程名的字符串(或字符串变量)[,参数1,参数2…] End Sub =============================='带参函数 Sub PrintInfo(info) MsgBox info End Sub ------------------------ Sub RunPara() '调用 PrintInfo ("Hello World") Call PrintInfo ("Hello World") Application.Run "PrintInfo", "Hello World" End Sub =============================='带参带返回值函数 Function getResult(ByVal x As Byte, ByVal y As Byte) As Byte getResult = x + y End Function ------------------------ Sub Test() '调用 Dim res As Byte res = getResult(5,10) MsgBox (res) End Sub ----------------------------------------------------------------------------------------------【时间处理】 m 2 月份(数字不带零) mm 2 月份(数字带零) mmm Feb 月份(缩写) mmmm February 月份(全文) d 7 天(数字不带零) dd 7 天(数字带零) ddd Tue 周几(缩写) dddd Tuesday 周几(全文) yy 12 年(2位数) yyyy 2012 年(4位数) h 8 小时(数字不带零) hh 8 小时(数字带零) n 3 分钟(数字不带零) nn 3 分钟(数字带零) s 8 秒(数字不带零) ss 8 秒(数字带零) AM/PM AM 显示上下午AM/PM ------------------------------------------- date_test = Now() '获取现在的日期 Range("A1") = Format(date_test, "yy/mm/dd") '返回 20/06/15 Range("A2") = Format(date_test, "yyyy/mm/dd") '返回 2020/06/15 Range("A3") = Format(date_test, "mm/dd hh:mm") '返回 6/15 19:39 Range("A4") = Format(date_test, "ddd dd") '返回 Mon 15 Range("A5") = Format(date_test, "mmmm-yy") '返回 20-Jun Range("A6") = Format(date_test, "hh:nn:ss") '返回 19:41:53 Range("A7") = Format(date_test, "h\Hmm") 'Returns: 9H41 --------------------------日期转文本 Dim dt As String dt = Format(Range("A1"), "yyyy/mm/dd") MsgBox dt --------------------------文本转日期 MsgBox IsDate(Range("B1")) '如果表达式是日期或可合法地转化为有效日期,则 IsDate 函数返回 True;否则函数返回 False。在 Microsoft Windows 操作系统中,有效的日期范围公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日;合法的日期范围随操作系统不同而不同。 mydate = CDate(Range("B1")) MsgBox Format(mydate, "yyyy+mm+dd") ----------------------------------------------------------------------------------------------【map对象】 Dim dict Set dict = CreateObject("Scripting.Dictionary") ' 创建Dictionary并初始化 dict.Add "A", 300 dict.Add "B", 400 dict.Add "C", 500 n = dict.Count ' 统计项目数 dict.Remove ("A") ' 删除项目 dict.Removeall ' 删除所有项目 dict.exists ("B") ' 判断字典中是否包含关键字 Value = dict.Item("B") ' 取关键字对应的值,注意在使用前需要判断是否存在key,否则dict中会多出一条记录 dict.Item("B") = 1000 ' 修改关键字对应的值,如不存在则创建新的项目 dict.Item("D") = 800 ' 对字典进行循环 k = dict.keys v = dict.Items For i = 0 To dict.Count - 1 key = k(i) Value = v(i) MsgBox key & Value Next ----------------------------------------------------------------------------------------------【颜色设置】Interior.ColorIndex 无色0黑色1白色2红色3绿色4 Cells(1, 1).Font.ColorIndex = 3 '字的颜色号为3 红色 Cells(1, 1).Interior.ColorIndex = 3 ' 背景的颜色为3 红色 Cells(2, 1).Font.Color = RGB(0, 255, 0) '字的颜色绿色 Cells(2, 1).Interior.Color = RGB(0, 0, 255) '背景的颜色蓝色 ---------------------------------------------------------------------------------------------- 常用对象 Application 代表整个Excel应用程序 Debug 在运行时将输出发送到立即窗口 Name 代表单元格区域的定义名称 Dialog 代表内置的Excel对话框 Range 代表某一单元格、某一行、某一列、某一选定区域 Range("A:A")等同Range("1:1") Window 代表一个窗口 Windows 代表Excel中所有Window对象的集合 Chart 工作薄中的图标 Charts 指定的或者活动的工作薄中所有的图表的集合 Sheets 指定或活动工作薄中所有工作表的集合,Sheets集合可以包括Chart对象或WordSheet对象 WorkBook 代表Excel工作薄 WorkSheet 代表一张工作表 Shape对象 代表图层中的对象,例如自选图形、任意多边形、OLE对象或图片 AutoFIle 代表指定工作表的自动筛选 Filters 由多个Fileter对象组成的集合,这些对象代表自动筛选区域内的所有的筛选 Filter 代表单个列的筛选