VBA将行数复制到新工作簿

时间:2019-03-14 14:56:02

标签: excel vba

作为特定IM中的编码和VBA的初学者,当前正尝试使IM尽可能多的工作步骤自动化,主要是为了使其自动化。因此,到目前为止,我得到了一组> 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的基本概念,因此简短地解释一下为什么我的操作不能奏效而不是仅仅获得有效的代码真是太棒了。 但是,将每个工作簿的名称添加为其值的标题会很棒!

1 个答案:

答案 0 :(得分:0)

在mainWorkbook中搜索最后一个空行将使用UsedRange对象的Worksheet属性;这将返回一个Range对象,然后您可以访问其Address属性。然后,您想使用Split()函数,该函数将获取您的字符串并将每个由定界符(在这种情况下为$)分隔的子字符串放入数组的索引中。为了您的目的,您需要第四个索引,它将是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变量是整数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和VBA的初学者,我会提出一些建议。首先是对OOP(面向对象编程)进行研究。一个非常基本的分类是,您拥有的对象具有方法和属性(例如,CoffeMug对象具有.Temperature属性和.Spill方法,而timsMug和tinasMug都是CoffeeMug对象)。我喜欢OOP,但是要花很长时间才能真正了解它的工作原理。但是在那之后,这确实很有趣而且功能强大。

除此之外,请使用https://docs.microsoft.com/en-us/office/vba/api/overview/了解VBA。我一直在使用Excel部分和Language Reference部分。