【问题标题】:Selecting all data from a default table size VBA Excel从默认表大小 VBA Excel 中选择所有数据
【发布时间】:2013-10-10 15:56:56
【问题描述】:

我有一个带有默认表格大小和布局的电子表格,该表格由另一个电子表格中的信息填充。该表将始终具有相同的列数,但行中的条目数可能会有所不同。我想从表格中选择所有数据,并将其粘贴到另一个工作表中,而不复制任何空行。

我最初的尝试涉及以下代码:

Set rightcell = Range("B9").End(x1Right)
Set bottomcell = Range(rightcell).End(x1Down)

定义右下角应该是什么,所以我可以像这样引用整个表格:

Range("B9", bottomcell).Select

或复制或其他。当我运行它时,它给了我一个“用户定义的或对象定义的错误”,我不知道为什么。我将代码作为较大子项的一部分输入,并且我已将变量定义为范围和变体,以尝试使其正常工作。我花了相当多的时间在互联网上搜索解决方案,但到目前为止,我发现的信息与我的问题没有明确的关系,并且没有类似的解决方案有效。

有谁知道这方面的适当编码是什么,或者我是否犯了一些小错误而导致其他一切都失败?我记得在大学的一个项目中遇到过同样的问题,但对于我的生活,我不记得解决方案。真是令人沮丧。

另外,如果我太含糊,或者您需要对任务进行更多说明,请不要犹豫。提前感谢您的帮助!

编辑:我遗漏的一个重要说明是,我要从中提取数据的表位于页面中间,其中包含我不想与之交互的多个其他表。

【问题讨论】:

    标签: vba excel range selection


    【解决方案1】:

    如果表格始终位于工作表上的同一位置,您可以执行以下操作来复制整个表格:

    'Modify this to any cell in your table (like the top left hand cell):
    Range("B9").CurrentRegion.Copy Sheets("TheSheetYouWantToPasteTo").Range("A1")
    

    即使表格在工作表上的位置发生变化,只要您知道表格中的一个单元格,您仍然可以使用上述代码复制表格。

    如果您想保持与尝试相同的方法,请尝试以下方法:

    Dim rightcell As Long
    Dim bottomcell As Long
    
    'Finds the furthest column to the right:
    rightcell = Cells(5, Columns.Count).End(xlToLeft).Column
    
    'Finds the bottom most row in the table (will stop at the first non-blank cell it finds.)
    bottomcell = Range("B:B").Find("*", Range("B9"), searchdirection:=xlPrevious).Row
    
    'Reference the variables like this:
    Range(Cells(9, 2), Cells(bottomcell, rightcell)).copy _
    Sheets("TheSheetYouWantToPasteTo").Range("A1")
    

    【讨论】:

    • 谢谢,结果几乎完美。我不知道为什么,但我必须将底部单元格搜索行更改为不同的列才能真正找到最后一行。该函数是从电子表格顶部搜索,还是从指定范围(本例中为 B9)搜索?
    • 很好,很高兴它适合您的目的!这里的.Find 函数从下到上搜索工作表;最高的是B9。因此,如果您要复制的表下方有一个表,.Find 函数将改为在该表处停止。 (* 符号正在查找单元格中的任何字符。)
    • 虽然.Find 更健壮(IMO),但您可以改用它:bottomcell = Range("B9").End(xlDown).Row
    • 表格下方有数据我要从中提取数据。但是,当我尝试使用“End(x1Down)”时,我收到运行时错误“1004”:应用程序定义或对象定义错误。我需要调整我的变量定义吗?编辑:我调整了您的原始代码,如下所示:'bottomcell = Range("A:A").Find("*", Range("A37"), searchdirection:=xlPrevious).Row' 其中 A37 是最后一个单元格默认表格区域。这正是我正在寻找的东西。似乎将该单元格注册为正在搜索的范围的底部?我误解了代码,还是正确的?
    • 您使用的是xlDown 还是x1DownxlDown 应该可以正常工作(经过测试)。如果A37 下面没有任何表格,那么使用.Find 将起作用。您还可以使用.CurrentRegion.Address,它将为您提供左上角和右下角的单元格地址或您的表格。
    【解决方案2】:

    这是我用的

    Public Function last_row() As Long
        Dim i As Integer
        Dim l_row As Long
        'my sheet has 35 columns change this number to fit your
        For i = 1 To 35
            If Sheet1.Cells(Rows.Count, i).End(xlUp).Row > l_row Then
                l_row = Sheet1.Cells(Rows.Count, i).End(xlUp).Row
            End If
        Next i
        last_row = l_row
    End Function
    

    然后使用

    Dim l_row As Long
    l_row = last_row
    'Again since you know the last column change 35 here to your value 
    'or use the String i.e. "AI"
    Range("B9", Cells(l_row,35)).Select
    

    这将查看每一列以确定包含数据的最后一行

    【讨论】:

    • 感谢您的帮助。我忘了添加一个关键细节:我遗漏的一个重要说明是,我要从中提取数据的表位于页面中间,其中包含我不想与之交互的多个其他表。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多