如何利用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分钟内运行完。如果复制粘贴次,大家试下就知道要多久了,起码我肯定你的同花顺分类资金源码手已经废掉了,哈哈。
哈哈,本贴结束.
ExcelVBA设置图表动态数据源实例教程
Excel图表的数据源通常为一个连续区域,但有时会遇到图表数据源区域不连续,且需要动态改变的情况。例如下面的某公司人员基本情况汇总表,B列为部门名称,C至S列分别为“性别”、“年龄”、“学历”、“职称”等不同类别数据的汇总,如果将这些数据同时显示在一个图表中,显然不便观察和比较数据,这时可以用VBA来动态改变数据源,单独对各个类别进行显示。
具体的方法是:先在表格中创建一个下拉列表,然后通过下拉列表选择不同的系列,通过VBA代码改变图表数据区域,让图表中的数据随之改变。下面以在Excel 中绘制柱形图为例说明如下:
1.设置下拉列表。设置下拉列表的方法有很多,这里用数据有效性来设置。选择某个单元格,如T,单击菜单“数据→有效性→设置→序列”,在“来源”下输入“性别,年龄,学历,职称”(不含引号)后确定,这样就在T单元格中通过数据有效性设置了一个下拉列表。
2.插入图表。乐观号网站源码选择B3:D区域,即“部门”和第一个类别所在区域“性别”,单击菜单“插入→图表→柱形图→簇状柱形图”,单击“完成”插入一个包含“男”、“女”两个系列的柱形图。
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中输入数组公式并计算结果,芋道源码 github如下所示。
上面演示了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键运行即可完成分列。
Excelvba删除工作表的代码和实例
文章介绍excel中vba删除工作表的方法,并通过两个案例来具体理解vba代码。
上一篇文章我们介绍了使用excel的基础操作来删除工作表。本文给大家分享vba删除工作表的代码写法。
vba删除工作表案例一:删除一张表以外的所有工作表
如下图所示:这一个excel工作薄包含多张工作表,如何使用vba删除 “IT部落窝论坛”以外的工作表呢?右边截图就是使用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功能就服了
excel为提供了很多好用的功能和函数,但还是有很多工作无法用现有功能和函数批量完成,比如多个excel表格的合并与拆分,而借助VBA语言编写的宏代码,这些看似无法批量处理或无法完成的事情,瞬间变得只是小菜一碟,也许你不懂VBA,也建议先收藏起来这些代码备用。
(第1个示例中,演示了VBA代码的使用方法,后面示例均和第1个类似,不再具体演示)
1、一次取消所有工作表的隐藏
Excel可以一次隐藏多个工作表,但取消工作表隐藏却需要一个个的设置,用VBA编写一段代码,一秒完成!
注意
要想使用VBA功能,需要把代码粘贴到添加的模块中,详见动画演示
要想保存VBA代码,需要把文件另存为xlsm格式文件,详见动画演示
动画演示:
代码:
Sub 取消隐藏()
For x = 1 To Sheets.Count
If Sheets(x).Name > "总表" Then
Sheets(x).Visible = -1
End If
Next x
End Sub
Sub 隐藏()
For x = 1 To Sheets.Count
If Sheets(x).Name > "总表" Then
Sheets(x).Visible = 0
End If
Next x
End Sub
2、根据模板批量生成日报表
根据模板批量生成报表,没什么好方法,只能一个一个的复制然后修改名称。但这对VBA来说,只需点一下按钮即可瞬间完成。
代码:
Sub 生成报表()
Dim x As Integer
Dim sh As Worksheet
For x = 1 To
Set sh = Sheets.Add
With sh
.Name = x & "日"
Sheets("日报模板").Range("1:").Copy sh.Range("A1")
End With
Next x
End Sub
3、拆分工作表为单独的excel文件
把当前excel文件中除第1个工作外的所有工作表,均保存为单独的excel文件到3月文件夹中。
拆分演示(在拆分过程中会画面会停几秒,请耐心等待)
代码:
Sub 拆分表格()
Dim x As Integer
Dim wb As Workbook
Application.ScreenUpdating = False
For x = 2 To
Sheets(x).Copy
Set wb = ActiveWorkbook
With wb
.SaveAs ThisWorkbook.Path & "/3月/" & Sheets(x).Name & ".xlsx"
.Close True
End With
Next x
Application.ScreenUpdating = True
End Sub
4、合并多个Excel文件工作表到一个文件中
3月文件夹下有N张报表,要求把该文件夹中所有excel文件的第1个工作表合并到当前的excel文件中,以单独的工作表存放。
代码:
Sub 合并表格()
Dim mypath As String
Dim f As String
Dim ribao As Workbook
Application.ScreenUpdating = False
mypath = ThisWorkbook.Path & "/3月/"
f = Dir(ThisWorkbook.Path & "/3月/*.xlsx")
Do
Workbooks.Open (mypath & f)
With ActiveWorkbook
.Sheets(1).Move after:=ThisWorkbook.Sheets(Sheets.Count)
End With
f = Dir
Loop Until Len(f) = 0
Application.ScreenUpdating = True
End Sub
如何用vba把excel数据写入到wordvbaexcel数据写入word文档
使用VBA可以将Excel数据写入到Word中。以下是一个基本的示例代码,可以根据你的需要进行修改和扩展:
vba
复制
Sub WriteExcelDataToWord()
Dim excelApp As Excel.Application
Dim excelBook As Excel.Workbook
Dim excelSheet As Excel.Worksheet
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim range As Range
Dim i As Integer
'Start Excel and open the workbook
Set excelApp = New Excel.Application
Set excelBook = excelApp.Workbooks.Open("C:\\Path\\To\\Your\\ExcelFile.xlsx")
Set excelSheet = excelBook.Worksheets("Sheet1") 'Change "Sheet1" to the name of your sheet
'Start Word and create a new document
Set wordApp = New Word.Application
Set wordDoc = wordApp.Documents.Add
'Copy the Excel data to the Word document
Set range = excelSheet.Range("A1") 'Change "A1" to the range you want to copy
range.Copy wordDoc.Range(0, 0) 'Paste the data at the top left corner of the Word document
'Format the Word document as needed
wordDoc.Paragraphs(1).Alignment = wdAlignParagraphCenter 'Align the text to the center
'Add more formatting as needed
'Save the Word document and close Word and Excel
wordDoc.SaveAs "C:\\Path\\To\\Your\\WordFile.docx" 'Change the file path and name as needed
wordDoc.Close SaveChanges:=False
wordApp.Quit
excelBook.Close SaveChanges:=False
excelApp.Quit
End Sub
这个示例代码假设你已经有一个名为“ExcelFile.xlsx”的Excel文件,其中包含名为“Sheet1”的工作表。它将Excel数据从单元格“A1”复制到Word文档的左上角,并将文本居中对齐。你可以根据需要修改这些设置,并添加更多的格式化选项。
方法一:在excel里编写一个程序段,打开本数据表,循环开始:步骤1,打开或新建一个word文档,把你说的指定位置找到,步骤2,把此位置内容改写为excel内想应的数据,步骤3,保存word文档退出;然后重复下一个数据,按上述步骤循环至结束。
也可以方法二:在word里编写程序,打开excel这个数据表,循环开始:步骤1,读取相应的数据到“指定位置”,步骤2,并另存为一个独立文件;然后重复读取下一个数据,继续重复上述步骤。
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结构为我们提供了更高效的处理重复引用对象的方式,虽然难以理解一点,也更难阅读,但它确实能带来运行速度上的提高。
excelVBALISTBOX初始化代码
Private Sub UserForm_Initialize()
Dim lsb As Worksheet
Set lsb = Sheets("临时表")
X = lsb.[a].End(3).Row
With ListBox1
.ColumnCount = 7 ‘设置7列
.ColumnWidths = ",,,,,," ‘设置每列宽度
.ColumnHeads = True ‘是否有标题表头
.RowSource = lsb.Range("a2:g" & X).Address(External:=True) ‘设置内容
End With
End Sub
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获取指定路径的文件名。
相关说明: 当输入法处于中文输入法状态时,将不能打开指定的路径。
2024-12-24 00:03
2024-12-23 23:33
2024-12-23 22:26
2024-12-23 22:22
2024-12-23 21:57