Excelvba删除工作表的代码和实例
文章介绍excel中vba删除工作表的方法,并通过两个案例来具体理解vba代码。源码
上一篇文章我们介绍了使用excel的源码基础操作来删除工作表。本文给大家分享vba删除工作表的源码代码写法。
vba删除工作表案例一:删除一张表以外的源码所有工作表
如下图所示:这一个excel工作薄包含多张工作表,如何使用vba删除 “IT部落窝论坛”以外的源码discuz源码 .net工作表呢?右边截图就是使用VBA代码删除后的效果,整个工作薄就只剩下一张工作表:IT部落窝论坛。源码
下面是源码具体的vba删除工作表操作步骤:
第一,按下ALT+F,源码打开VBE编辑器。源码
第二,源码单击菜单:插入——模块,源码插入一个模块,源码并复制下面的源码代码到代码输入区:
Sub vba删除工作表()
Application.DisplayAlerts = False
Dim sht As Object
For Each sht In ThisWorkbook.Worksheets
If sht.Name > "
IT部落窝论坛" Then
sht.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
第三,单击上面截图所示的源码工具栏上面那个绿色的“运行”命令,excel就会自动删除“
IT部落窝论坛”以外的所有工作表。
从两篇删除工作表方法的文章对比,我们可以清楚的看到,如果工作表很多的情况,使用VBA删除工作表,效率会更加高效。而且代码可以随时调用运行,减少手工操作。驾驶证小程序源码
vba删除工作表案例二:逐一提示删除工作表
录制代码的方法参考上面介绍,下面这一段代码运行的结果是出现一个提示框,要求输入工作表名称,如果输入的工作表名正确,excel就删除对应的工作表,如果输入的工作表不正确,excel返回消息框提示:您要删除的工作表不存在。
Sub vba删除工作表()
Dim ws As Worksheet
Dim str As String
str = Application.InputBox(prompt:="输入需要删除的工作表:", Title:="删除工作表", Default:="sheet1", Type:=2)
On Error GoTo back
Set ws = Worksheets(str)
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
Exit Sub
back:
MsgBox "您要删除的工作表不存在!"
End Sub
上面这段vba删除工作表的方法,如果需要经常使用,我们可以保存为宏,在需要的时候按快捷键ALT+F8调用,只要输入工作表名称即可删除工作表。
ExcelVBA设置图表动态数据源实例教程
Excel图表的数据源通常为一个连续区域,但有时会遇到图表数据源区域不连续,且需要动态改变的情况。例如下面的某公司人员基本情况汇总表,B列为部门名称,C至S列分别为“性别”、“年龄”、“学历”、“职称”等不同类别数据的sf发布站源码带采集汇总,如果将这些数据同时显示在一个图表中,显然不便观察和比较数据,这时可以用VBA来动态改变数据源,单独对各个类别进行显示。
具体的方法是:先在表格中创建一个下拉列表,然后通过下拉列表选择不同的系列,通过VBA代码改变图表数据区域,让图表中的数据随之改变。下面以在Excel 中绘制柱形图为例说明如下:
1.设置下拉列表。设置下拉列表的方法有很多,这里用数据有效性来设置。选择某个单元格,如T,单击菜单“数据→有效性→设置→序列”,在“来源”下输入“性别,年龄,学历,职称”(不含引号)后确定,这样就在T单元格中通过数据有效性设置了一个下拉列表。
2.插入图表。选择B3:D区域,即“部门”和第一个类别所在区域“性别”,单击菜单“插入→图表→柱形图→簇状柱形图”,单击“完成”插入一个包含“男”、“女”两个系列的PHP留言板程序源码柱形图。
3.输入VBA代码。按Alt+F,打开VBA编辑器,在代码窗口中粘贴下列代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = $T$ Then
Dim RngStr As String
Select Case Target.Value
Case 性别
RngStr = b3:b,c3:d
Case 年龄
RngStr = b3:b,e3:i
Case 学历
RngStr = b3:b,j3:n
Case 职称
RngStr = b3:b,o3:s
End Select
ChartObjects(图表 1).Chart.SetSourceData Source:=Range(RngStr)
End If
End Sub
说明:改变T单元格中的内容时,图表的数据区域随之改变。本例中的图表名称为“图表 1”,需根据实际进行更改。查看图表名称的方法是:
Excel :按住Ctrl键单击图表,在名称框中即可看到所选图表的名称。
Excel /:选择图表,在“图表工具-布局”选项卡的“属性”组中即可看到图表名称。
关闭VBA编辑器,返回Excel工作表界面,选择T单元格中的不同系列即可在图表显示相应类别的数据。
excelVBA代码怎么在单元格中输入数组公式
Q我想使用VBA代码在单元格中输入数组公式,如何实现?
A:Range对象提供了一个FormulaArray属性,可以用来设置或者返回单元格区域中的数组公式,也就是说,在工作表单元格中输入完后需要按Ctrl+Shift+Enter组合键才能最终完成的公式。
如下所示,要求工作表Sheet2中所列出的水果总的销售金额,即分别使用各种水果的绝对估值指标公式源码单价乘以各自的销量后的和。
代码:
Sheet2.Range(“C7”).FormulaArray= “=SUM(B2:B5*C2:C5)”
在单元格C7中输入数组公式并计算结果,如下所示。
上面演示了VBA代码在单个单元格中输入数组公式,如果要在多个单元格中输入数组公式呢?如下面的代码所示:
Sheet3.Range(“B1:B6”).FormulaArray= “=A1:A6=”” Excel”””
判断工作表Sheet3的单元格区域A1:A6中的值是否为“ Excel”,如果是则返回TRUE,否则为FALSE。运行代码后的结果如下所示。
如果需要输入的数组公式在每个单元格中都不同呢?下面以colinlegg.wordpress.com中提供的示例来说明。
如下所示,在列C中输入列E中的值等于其对应的列A单元格中的值或者列F中的值等于其对应的列B单元格中的值时列G中的最大值。
下面的四段代码均可实现。
代码1
Sub test()
Dim r As Long
For r = 2 To 5
Sheet1.Cells(r, 3).FormulaArray = _
“=MAX(IF((($E$2:$E$1 =A”1;2;3;4;5}*7+{ 1,2,3,4,5,6,7}-1),””””,”1;2;3;4;5}*7+{ 1,2,3,4,5,6,7}-1)”
With ActiveSheet.Range(“E2:K7”)
.FormulaArray = theFormulaPart1
.Replace “X_X_X())”,theFormulaPart2
.NumberFormat = “m””月””d””日”””
End With
End Sub
上述程序将在单元格区域E2:K7中生成当月的日历。
正如本文一开始所的,FormulaArray属性还可以返回单元格中的公式。
如果想要从单个单元格中返回公式,那么无论单元格中是否包含数组公式,Formula属性和FormulaArray属性都会返回相同的结果。然而,Formula属性和FormulaArray属性应用于连续的、多单元格区域时返回不同的结果。
如果单元格区域中含有数组公式,即多个单元格中为一个数组公式,那么FormulaArray属性返回该公式。
如果单元格区域不是数组区域但所有单元格都包含相同的公式,那么FormulaArray属性也返回该通用公式。
如果单元格区域不是数组区域且包含的公式不相同,那么FormulaArray属性返回Null。
在上述所有三种情形中,Formula属性返回Variant型数组,数组中的每个元素表示区域中每个单元格的公式。
实现分列的两段excelvba分列代码
excel vba 分列多用于一般常规的分列操作完成不了的情况。
Excel内置的分列,仅用于有规律的数据进行分列。比如下面的截图,这样的数据源,分列就可以考虑使用excel vba 分列完成。
A列数据源,要将汉字和数字分列后的效果如B:D列。
下面是两段excel vba 分列的代码,案例和答案来自论坛版主。
第一段excel vba 分列的代码:
Sub vba分列()
Dim oJs As Object, rng As Range
Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){ return str.replace(/(\d+)/,’ $1 ‘)}"
For Each rng In Range("A2", [A].End(3))
rng(1, 2).Resize(1, 3) = Split(oJs.codeobject.gets(rng.Value), " ")
Next
End Sub
第二段excel vba 分列的代码:
Sub vba分列()
Dim arr, i%, brr(), sma As Object
arr = Range("a2:a" & Cells(Rows.Count, 1).End(3).Row)
ReDim brr(1 To UBound(arr), 1 To 3)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "([^\d]+)(\d+)(.+)"
For i = 1 To UBound(arr)
Set sma = .Execute(arr(i, 1))(0).submatches
brr(i, 1) = sma(0)
brr(i, 2) = sma(1)
brr(i, 3) = sma(2)
Next
End With
Range("b2", Cells(Rows.Count, Columns.Count)).ClearComments
Range("b2").Resize(UBound(brr), UBound(brr, 2)).NumberFormat = "@"
Range("b2").Resize(UBound(brr), UBound(brr, 2)) = brr
Set sma = Nothing
End Sub
代码使用方法,在excel中,按下ALT+F,打开VBE编辑器,单击插入——模块,复制上面任意一段代码,按F5键运行即可完成分列。
Excel获取指定路径的文件名vba代码
在Excel VBA中,如果需要Excel获取指定路径的文件名以方便用户的操作体验,可通过VBAExcel获取指定路径的文件名。Excel可通过VBA宏Excel获取指定路径的文件名。
Excel获取指定路径的文件名的方法:
首先按“Alt+F”组合键,Excel打开代码编辑器,单击“插入”菜单-“模块”,双击插入的模块,在右侧的代码窗口中输入:
Sub Excel_Partner()
Dim myFilename As String, myPath As String
ChDir Application.DefaultFilePath ‘改变默认路径
myPath = "C:\" ‘指定的任意路径
SendKeys myPath & "{ TAB}" ‘将指定的任意路径发送到“打开”对话框
myFilename = Application.GetOpenFilename
Range("A1") = myFilename
End Sub
按F5运行键运行程序,Excel调用“打开”对话框,自动打开指定的路径。双击指定的文件,Excel获取指定路径的文件名。
相关说明: 当输入法处于中文输入法状态时,将不能打开指定的路径。
如何利用ExcelVBA解决棘手的数据提取问题
今天同事问了个我一个数据提取的问题。他的需求是这样的:
他有1个工作簿,里面有个工作表。他希望把每个工作表里的第6行的b6:i6数据复制到一起,
也就是说他要把工作表里的第6行,汇总在一起。比如这样:
他说如果你没办法,那他只能手动来复制个工作表,提取这数据了。
我想了下说,我用VBA编程试试。
差不多分钟折腾,我把代码搞定了。
Public Sub tiqu()’指定行遍历工作表提取
Application.ScreenUpdating = False
Dim LastRow As Integer
Dim sh As Worksheet
Set sh = Worksheets.Add ‘新建工作表
Set sh = ActiveSheet’为当前工作表
sh.Name = "sheet1"
Sheets(3).Range("b5:i5").Copy Destination:=Sheets("sheet1").Range("b1") ‘表头
Sheets(3).Range("a6:i6").Copy Destination:=Sheets("sheet1").Range("a2") ‘复制
For i = 4 To Sheets.Count ‘遍历工作表
LastRow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row ‘判定最后非空行
Sheets(i).Range("a6:i6").Copy Destination:=Sheets("sheet1").Range("a" & LastRow).Offset(1, 0) ‘复制到特定非空行的下一行
Next
MsgBox "处理完毕"
Application.ScreenUpdating = True
End Sub
他按alt+F,把代码贴入模块,点运行就行了。就是要他的结果。
我来解释下我的思路原理:我的解决方案。遍历工作表,提取每个工作表的第6行,复制到sheet1里的A2开始,难点1是偏移,用offset。难点2,判断非空的最后一行,用en那个个工作表,1分钟内运行完。如果复制粘贴次,大家试下就知道要多久了,起码我肯定你的手已经废掉了,哈哈。
哈哈,本贴结束.
ExcelVBAEndWith结构专为对象而生
我们主要是和对象打交道,这包括各种各样的对象以及由这些对象组成的集合对象。我们来看看并学习Excel内部是如何处理对象的。
我们先来录制一个宏。
在Excel中,打开宏录制器,录制下面的操作:在工作表单元格A1中输入“Excel”,设置其字体为红色,单元格背景色为**。录制的代码如下:
Sub 宏3()
‘
‘ 宏3 宏
‘
‘
ActiveCell.FormulaR1C1 = “Excel”
Range(“A1”).Select
With Selection.Font
.Color = -
.TintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color =
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
观察代码,我们发现,宏录制器为设置字体和单元格背景的两段代码都使用了With … End With结构,这就是VBA为我们提供的处理对象的有效方法之一。
在这里,宏录制器自动优化了代码,在With … End With结构中对同一个对象执行多项操作。当需要对某个对象执行多项操作时(例如,为同一对象的多个属性赋值),使用With … End With结构的代码比在每个语句中都显示地引用对象的代码要更快。
在上一篇文章《Excel VBA解读():谈谈对象变量》中,我们展示了一个示例:在单元格区域A1:B2中输入文本“示例”,将字体加粗,字号大小调整为号,并将单元格背景设置为**。
代码1:不使用对象变量
Sub test()
Worksheets(“Sheet1”).Range(“A1:B2”).Value= “示例”
Worksheets(“Sheet1”).Range(“A1:B2”).Font.Bold = True
Worksheets(“Sheet1”).Range(“A1:B2”).Font.Size =
Worksheets(“Sheet1”).Range(“A1:B2”).Interior.Color =vbYellow
End Sub
代码2:使用对象变量
Sub testUpdate()
Dim rng As Range
Set rng =Worksheets(“Sheet1”).Range(“A1:B2”)
rng.Value = “示例”
rng.Font.Bold = True
rng.Font.Size =
rng.Interior.Color = vbYellow
End Sub
上述两段代码是我们已经学过的代码。现在,我们学习了With … End With结构,又可以将代码进行改写而获得相同的效果。
代码3:使用With … End With结构(不使用对象变量)
Sub test1()
WithWorksheets(“Sheet1”).Range(“A1:B2”)
.Value = “示例”
.Font.Bold = True
.Font.Size =
.Interior.Color = vbYellow
End With
End Sub
代码4:使用With … End With结构(使用对象变量)
Sub testUpdate1()
Dim rng As Range
Set rng =Worksheets(“Sheet1”).Range(“A1:B2”)
With rng
.Value = “示例”
.Font.Bold = True
.Font.Size =
.Interior.Color = vbYellow
End With
End Sub
实际上,我们还可以进一步深入,将相同的对象全部归于With … End With结构内,这样就可以得到下面的代码。
代码5:完全使用With … End With结构
Sub testUpdate2()
Dim rng As Range
Set rng =Worksheets(“Sheet1”).Range(“A1:B2”)
With rng
.Value = “示例”
With .Font
.Bold = True
.Size =
End With
.Interior.Color = vbYellow
End With
End Sub
With … End With结构为我们提供了更高效的处理重复引用对象的方式,虽然难以理解一点,也更难阅读,但它确实能带来运行速度上的提高。
2024-11-20 19:28
2024-11-20 18:34
2024-11-20 18:29
2024-11-20 18:13
2024-11-20 18:10