繁体   English   中英

VBA将行数复制到新工作簿

[英]VBA copy number of Rows to new Workbook

作为特定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的基本概念,因此简短地解释一下为什么我的操作不能奏效而不仅仅是获得有效的代码真是太棒了。 但是,将每个工作簿的名称添加为其值的标题会很棒!

在mainWorkbook中搜索最后一个空行将使用Worksheet对象的UsedRange属性; 这将返回一个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 Value赋予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的初学者,我会提出一些建议。 首先是对OOP(面向对象编程)进行研究。 一个非常基本的细分是您拥有具有方法和属性的对象(例如,CoffeMug对象具有.Temperature属性和.Spill方法,而timsMug和tinasMug都是CoffeeMug对象)。 我喜欢OOP,但需要一段时间才能真正深入了解它是如何工作的。 在那之后,这确实很有趣并且功能强大。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM