首页 > 解决方案 > 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 的名称添加为其值的标题将是非常棒的!

标签: excelvba

解决方案


在 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 部分和语言参考部分。


推荐阅读