excel - VBA 将行数复制到新工作簿
问题描述
作为编码和 VBA 的初学者,我目前正试图尽可能多地自动化工作步骤,主要是为了进入它。所以现在我得到了一组> 50个Excel工作簿和“简单”任务来收集每个数据点的数量(每个数据点一行)并将这个值传递给一个新的工作簿。到目前为止,我一起构建的是这个(基本构造的功劳完全归功于Henrik Schiffner,我将它用于其他几个操作):
Sub count_rows()
'Define variables:
Dim numberOfFilesChosen, i As Integer
Dim tempFileDialog As FileDialog
Dim mainWorkbook, sourceWorkbook As Workbook
Dim tempWorkSheet As Worksheet
Dim LastRow As Integer
Set mainWorkbook = Application.ActiveWorkbook
'This Step is not mandatory of course but quite comfortable to choose
'the workbooks to work with
Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker)
tempFileDialog.AllowMultiSelect = True
numberOfFilesChosen = tempFileDialog.Show
'Loop through all selected workbooks
For i = 1 To tempFileDialog.SelectedItems.count
Workbooks.Open tempFileDialog.SelectedItems(i)
Set sourceWorkbook = ActiveWorkbook
For Each tempWorkSheet In sourceWorkbook.Worksheets
LastRow = tempWorkSheet.UsedRange.Rows.count - 1
MsgBox LastRow
Next tempWorkSheet
Application.DisplayAlerts = False
sourceWorkbook.Close
Application.DisplayAlerts = True
Next i
mainWorkbook.Save
End Sub
这为我提供了提示消息框中每个文件的正确值。但是,我无法获取 LasRow 值并将其简单地复制到 mainWorkbook。目标是在一列中有一个又一个的值(比如说“A”)。失败在不同的级别上,例如:在 mainWorkbook 中搜索最后一个空行:
destinationRow = mainWorkbook.Worksheets("Sheet1").Cells(Rows.count, 1).End(xlUp) + 1
甚至可以将 lastRow 值赋予 mainWorkbooks 中的任何位置,例如:
mainWorkbook.Worksheets("Sheet1").Rows(destinationRow) = LastRow
或者
LastRow.Copy After:=XXXX
我很确定我误解了 VBA 的一个基本概念,所以如果能得到一个简短的解释,为什么我的操作没有成功,而不是仅仅得到一个工作代码,那就太棒了。但是,将每个 Workbook 的名称添加为其值的标题将是非常棒的!
解决方案
在 mainWorkbook 中搜索最后一个空行将使用 object 的UsedRange
属性Worksheet
;这将返回一个Range
对象,然后您可以访问其Address
属性。然后,您想要使用Split()
将获取您的字符串并将每个子字符串以分隔符(在本例中为 $)分隔的函数放入数组的索引中。出于您的目的,您需要第 4 个索引,这将是 UsedRange 中的最后一行:
'The MsgBox's should help you understand what is happening with this code
MsgBox (mainWorkbook.Sheets("Sheet1").UsedRange.Address)
lastRow = Split(mainWorkbook.Sheets("Sheet1").UsedRange.Address, "$")(4)
MsgBox (lastRow)
我对您的意思感到有些困惑,“将 lastRow 值赋予 mainWorkbooks 中的任何位置”。如果您希望将 mainWorkbook 中单元格的值设置为 lastRow 的值,您可以使用:
mainWorkbook.Sheets("Sheet1").Cells(1, 1).Value = lastRow
而且我不确定您要做什么:LastRow.Copy After:=XXXX
。您的 LastRow 变量是一个 Integer Dim LastRow As Integer
。整数数据类型不能使用该Copy
方法。我主要使用该.Copy After:=
方法复制一个工作表并将其粘贴到另一个工作表中。如果这是你的目标:
'Copy Sheet1 and place it after the last sheet in the workbook
Sheets("Sheet1").Copy After:=Sheets(ActiveWorkbook.Sheets.count)
否则,如果你能解释你的目标,我很乐意提供帮助。
作为编码和 VBA 的初学者,我会建议一些事情。首先是对OOP(面向对象编程)进行研究。一个非常基本的细分是你有对象,然后有方法和属性(例如 CoffeMug 对象有一个 .Temperature 属性和一个 .Spill 方法,而 timsMug 和 tinasMug 都是 CoffeeMug 对象)。我喜欢 OOP,但需要一段时间才能真正深入了解它的工作原理。不过在那之后,它很有趣,而且非常强大。
除此之外,请使用https://docs.microsoft.com/en-us/office/vba/api/overview/了解 VBA。我一直使用 Excel 部分和语言参考部分。
推荐阅读
- matlab - for loop-Matlab 中的错误
- apache-spark - Spark SQL 限制与 Hive SQL 限制之间的区别
- google-cloud-run - 在 Cloud Code 中调试时访问 computeMetadata
- .net - 为什么在 .NET4.6 中很少有分析器规则将其有效严重性设置为抑制
- c++ - 如何正确创建合并排序函数?
- git - Git ssh url 到特定文件夹
- google-cloud-platform - 是否可以在本地模拟 Google Cloud Task?
- windows - Powershell:如何在“;”之后获得数字的平均值 象征?(来自一个txt文件)
- javascript - 如何在节点中创建 Twilio 视频连接?
- admob - 仅仅请求应用透明度权限是否足以确保谷歌移动广告符合 iOS14 标准?