Excel VBA - 基于另一个工作表中的数据值创建新的Excel工作表

时间:2014-10-08 04:13:29

标签: excel vba excel-vba

我有一个EXCEL数据集,我需要使用数据集本身的值转换为更精简的格式。

原始数据集如下所示:

州,城市,体育类别,子类别,2011年1月,2011年2月,2011年3月

NSW,Paramatta,Field,Cricket,3,2,1
NSW,Paramatta,Field,Soccor,2,2,2
VIC,Bundoora,Indoor,Table Tennic,1,3,2
VIC,Bundoora,Indoor,Swimming,1,2,2

每行(前四个字段)必须重复,具体取决于日期字段下的实例数。新字段的值应为发生日期。例如,上面的第一个条目应该变为6个条目,其中3个用于1月,2个用于2月,1个用于3月。

结果应如下所示:

州,城市,体育类别,子类别,日期

NSW,Paramatta,Field,Cricket,Jan-11
NSW,Paramatta,Field,Cricket,Jan-11
NSW,Paramatta,Field,Cricket,Jan-11
NSW,Paramatta,Field,Cricket,Feb-11
NSW,Paramatta,Field,Cricket,Feb-11
NSW,Paramatta,Field,Cricket,Mar-11
NSW,Paramatta,Field,Soccor,Jan-11
NSW,Paramatta,Field,Soccor,Jan-11
NSW,Paramatta,Field,Soccor,Feb-11
NSW,Paramatta,Field,Soccor,Feb-11
NSW,Paramatta,Field,Soccor,Mar-11
VIC,Bundoora,Indoor,Table Tennic,Jan-11
VIC,Bundoora,Indoor,Table Tennic,Feb-11
VIC,Bundoora,Indoor,Table Tennic,Feb-11
VIC,Bundoora,Indoor,Table Tennic,Feb-11
VIC,Bundoora,Indoor,Table Tennic,Mar-11
VIC,Bundoora,Indoor,Table Tennic,Mar-11
VIC,Bundoora,Indoor,Swimming,Jan-11
VIC,Bundoora,Indoor,Swimming,Feb-11
VIC,Bundoora,Indoor,Swimming,Feb-11
VIC,Bundoora,Indoor,Swimming,Mar-11
VIC,Bundoora,Indoor,Swimming,Mar-11

有人能够为此组合一个VBA脚本吗?

感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Sub mcr_Expand_Match_Data()
    Dim lc As Long, lr As Long, rw As Long, d As Long, m As Long
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Sheets("Sheet7")  'source worksheet
    Set ws2 = Sheets("Sheet8")  'target worksheet
    With ws2
        .Cells(1, 1).CurrentRegion.ClearContents
        .Cells(1, 1).Resize(1, 5) = Array("State", "City", "Sports category", "Subcategory", "Date")
    End With
    With ws1
        lr = .Cells(Rows.Count, 1).End(xlUp).Row
        lc = .Cells(1, Columns.Count).End(xlToLeft).Column
        For rw = 2 To lr
            For d = 5 To lc
                For m = 1 To .Cells(rw, d).Value
                    ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 4) = _
                      .Cells(rw, 1).Resize(1, 4).Value
                    ws2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 4) = _
                      .Cells(1, d).Value
                Next m
            Next d
        Next rw
    End With
    Set ws2 = Nothing
    Set ws1 = Nothing
End Sub

您需要更改第三行和第四行中的源和目标工作表名称。它应该能够在源工作表的右端添加额外的匹配数据列。这将产生如下所示的结果。

enter image description here

相关问题