VBA:提取列直到为空,在下一张表中重复

Posted

技术标签:

【中文标题】VBA:提取列直到为空,在下一张表中重复【英文标题】:VBA: Extract column until empty, repeat in next sheet 【发布时间】:2012-10-27 08:42:42 【问题描述】:

亲爱的 Stack Overflow 群。

在文件“Prodcuts.xlmx”中,工作表“Contract1”的 A 列有数千个数值。同一个文件包含其他几个类似的工作表,名称为“Contract2”等等。每个工作表中的行数会发生变化,并且可能会随着时间的推移在同一个工作表中发生变化,但它们后面总是跟着空行。工作表的数量是静态的

我需要将这些工作表中的信息收集到第二个文件到单个工作表中,我们将其称为“产品列表”,格式为 A 列包含重复的工作表名称,B 列包含数值。

我更喜欢一个简单地复制此信息的提取循环,以避免对可能的更改进行多次检查。

我不能使用选择列来复制源,因为在空单元格之后,会出现不需要的额外数据集。

总体思路是

获取WS1 A列内容,直到空行,复制到“Productlist”列B

获取WS1 WS名称,复制到“Productlist”A列,重复直到B列没有值(或者B列+1行没有值,避免WS名称多出1行)

添加 2 个空行

重复 WS2,直到 WSn 不存在(或匹配计数)。

【问题讨论】:

我错误地使用行计数器并检查是否已将某些内容添加到“Contract1”中,然后意识到我必须反检查是否已删除某些内容,并且之后我无法维护格式结构使用不同的工作表对循环进行多次迭代,而无需过多的工作。引用另一个文件时,我完全超出了我的能力范围,而且我不知道如何遍历不同的工作表。 【参考方案1】:

我在另一篇文章中回答了类似的问题,稍作修改。为您的情况定制

Sub testing()
Dim resultWs As Worksheet
Dim ws As Worksheet
Dim dataArray As Variant
Dim height As Long
Dim currentHeight As Long
Dim wsName As String
Set resultWs = Worksheets("Productlist")
For Each ws In Worksheets
    If InStr(ws.Name, "Contract") Then
        With ws
            wsName = .Name
            height = .Cells(1, 1).End(xlDown).Row 'look til empty row
            If height > 1048575 Then
                height = 1
            End If

            ReDim dataArray(1 To height, 1 To 1)
            dataArray = .Range(.Cells(1, 1), .Cells(height, 1)).Value

        End With

        With resultWs
            currentHeight = .Cells(.Rows.Count, 1).End(xlUp).Row
            If .Cells(1, 1) = "" Then
                currentHeight = 0
            End If
            If VarType(dataArray) <> vbDouble Then
                .Range(.Cells(currentHeight + 1, 1), .Cells(currentHeight + UBound(dataArray, 1), 1)).Value = wsName
                .Range(.Cells(currentHeight + 1, 2), .Cells(currentHeight + UBound(dataArray, 1), 2)).Value = dataArray
            Else
                .Cells(currentHeight + 1, 1).Value = wsName
                .Cells(currentHeight + 1, 2).Value = dataArray
            End If

        End With
    End If

Next ws

End Sub

【讨论】:

以上是关于VBA:提取列直到为空,在下一张表中重复的主要内容,如果未能解决你的问题,请参考以下文章

mysql 从相同类型的多张表中提取到一张表中

tsql 将列合并到一张表中

SQLserver怎么从不同表中提取字段合并成一张表

求大神造个vba,提取总表指定位置的数据至多个固定格式表格的指定位置

删除一张表中与另一张表中相同的记录

SQL 查询只从一张表中拉取数据