有条件地复制数据并将其转换为新的Excel工作表

有条件地复制数据并将其转换为新的Excel工作表,excel,vba,loops,Excel,Vba,Loops,我已将一组Excel数据放在如下表格中: 姓 名称 2020-09-14 2020-09-15 2020-09-16 2020-09-17 2020-09-18 雌鹿 约翰 出席 出席 宝贝 简 出席 出席 我用VBA为你做了这个。你没有提供任何关于你的数据在哪里的信息,所以根据我的测试,我离开了。您需要将其更改为相关列/行等 否则,你可以更新你的问题与更多的信息,我可以编辑必要的部分。例如,日期的数量是已知的还是有波动,如果有波动,那么最后一行是否正常,或者这些日期之外是否有其他数据未包括在内

我已将一组Excel数据放在如下表格中:

姓 名称 2020-09-14 2020-09-15 2020-09-16 2020-09-17 2020-09-18 雌鹿 约翰 出席 出席 宝贝 简 出席 出席
我用VBA为你做了这个。你没有提供任何关于你的数据在哪里的信息,所以根据我的测试,我离开了。您需要将其更改为相关列/行等

否则,你可以更新你的问题与更多的信息,我可以编辑必要的部分。例如,日期的数量是已知的还是有波动,如果有波动,那么最后一行是否正常,或者这些日期之外是否有其他数据未包括在内,等等

Sub TransposeData()

Dim lrow As Long, lcol As Long, ws As Worksheet, i As Long, cell As Range, r As Long

Set ws = Worksheets("Sheet1") 'Change to your sheet name
lrow = ws.Range("H" & Rows.Count).End(xlUp).Row 'Change H to relevant column
lcol = ws.Cells(1, Columns.Count).End(xlToLeft).Column 'Change 1 to relevant row
r = 2 'starting row to transpose data to

With ws
    For i = 2 To lrow
        For Each cell In .Range("J" & i, .Cells(i, lcol)) 'Change J to starting column of the dates (After Surname/Name)
            If cell.Value <> "" Then 'Checks if cell is not blank. AKA they attended
                .Range("A" & r) = .Range("H" & i) 'Change A and H should be your Surname columns
                .Range("B" & r) = .Range("I" & i) 'B and I should be your First Name Columns
                .Range("C" & r) = .Cells(1, cell.Column) 'C will be your date column, change the 1 to which row has the dates in them
                r = r + 1
            End If
        Next
    Next i
End With

End Sub
Sub-a()
Dim lrow尽可能长,lcol尽可能长,ws尽可能长,i尽可能长,单元格尽可能长,r尽可能长
将ws=工作表(“Sheet1”)更改为工作表名称
lrow=ws.Range(“H”和Rows.Count)。End(xlUp)。Row'将H更改为相关列
lcol=ws.Cells(1,Columns.Count).End(xlToLeft).Column'将1更改为相关行
r=2'将数据转置到的起始行
与ws
对于i=2至lrow
对于.Range(“J”&i,.Cells(i,lcol))中的每个单元格,将J更改为日期的起始列(在姓氏/名称之后)
如果单元格.Value为“”,则检查单元格是否为空。他们也参加了
.Range(“A”&r)=.Range(“H”&i)”更改A和H应为您的姓氏列
.Range(“B”&r)=.Range(“I”&I)”B和I应该是您的名字列
.Range(“C”&r)=.Cells(1,cell.Column)”C将是您的日期列,请将其中包含日期的行更改为1
r=r+1
如果结束
下一个
接下来我
以
端接头

我在VBA中为您制作了这个。你没有提供任何关于你的数据在哪里的信息,所以根据我的测试,我离开了。您需要将其更改为相关列/行等

否则,你可以更新你的问题与更多的信息,我可以编辑必要的部分。例如,日期的数量是已知的还是有波动,如果有波动,那么最后一行是否正常,或者这些日期之外是否有其他数据未包括在内,等等

Sub TransposeData()

Dim lrow As Long, lcol As Long, ws As Worksheet, i As Long, cell As Range, r As Long

Set ws = Worksheets("Sheet1") 'Change to your sheet name
lrow = ws.Range("H" & Rows.Count).End(xlUp).Row 'Change H to relevant column
lcol = ws.Cells(1, Columns.Count).End(xlToLeft).Column 'Change 1 to relevant row
r = 2 'starting row to transpose data to

With ws
    For i = 2 To lrow
        For Each cell In .Range("J" & i, .Cells(i, lcol)) 'Change J to starting column of the dates (After Surname/Name)
            If cell.Value <> "" Then 'Checks if cell is not blank. AKA they attended
                .Range("A" & r) = .Range("H" & i) 'Change A and H should be your Surname columns
                .Range("B" & r) = .Range("I" & i) 'B and I should be your First Name Columns
                .Range("C" & r) = .Cells(1, cell.Column) 'C will be your date column, change the 1 to which row has the dates in them
                r = r + 1
            End If
        Next
    Next i
End With

End Sub
Sub-a()
Dim lrow尽可能长,lcol尽可能长,ws尽可能长,i尽可能长,单元格尽可能长,r尽可能长
将ws=工作表(“Sheet1”)更改为工作表名称
lrow=ws.Range(“H”和Rows.Count)。End(xlUp)。Row'将H更改为相关列
lcol=ws.Cells(1,Columns.Count).End(xlToLeft).Column'将1更改为相关行
r=2'将数据转置到的起始行
与ws
对于i=2至lrow
对于.Range(“J”&i,.Cells(i,lcol))中的每个单元格,将J更改为日期的起始列(在姓氏/名称之后)
如果单元格.Value为“”,则检查单元格是否为空。他们也参加了
.Range(“A”&r)=.Range(“H”&i)”更改A和H应为您的姓氏列
.Range(“B”&r)=.Range(“I”&I)”B和I应该是您的名字列
.Range(“C”&r)=.Cells(1,cell.Column)”C将是您的日期列,请将其中包含日期的行更改为1
r=r+1
如果结束
下一个
接下来我
以
端接头

正如第一个答案所说,我们不知道您的数据在哪里。我假设您的数据将显示在“表1”上。以下是VBA代码,可用于将原始数据复制到新工作表中。每次运行代码时,它都会删除除工作表1之外的所有工作表,然后创建一个名为“有人参与”的新工作表,最后,它会循环遍历您的数据,将“姓氏”、“姓名”和“日期”复制到新工作表“有人参与”中

Sub-a()
最后一排一样长
暗淡如长
作为整数的Dim i
将ws设置为工作表
暗淡单元格作为范围
lastrow=Sheet1.Cells(Rows.Count,1).End(xlUp).Row
lastcol=Sheet1.Cells(1,Columns.Count).End(xlToLeft).Column
'删除除Sheet1之外的所有工作表
Application.DisplayAlerts=False
对于工作表中的每个ws
如果ws.Name为“Sheet1”,则
ws.Delete
如果结束
下一个
Application.DisplayAlerts=True
'创建新工作表
Sheets.Add(在:=Sheet1之后)。Name=“出席”
附页(“出席”)
.范围(“A1”)=“姓氏”
.范围(“B1”)=“名称”
.范围(“C1”)=“日期”
以
'在数据表中循环以获取名称(如果已输入),并将其复制到新工作表中
i=2
附页1
对于.Range中的每个单元格(“a1”,.Cells(lastrow,lastcol))
如果cell=“出席”,则
.Cells(cell.Row,1)。复制工作表(“出席”)。Cells(i,1)将姓氏复制到新工作表
.Cells(cell.Row,2)。复制工作表(“出席”)。Cells(i,2)将名称复制到新工作表
.Cells(1,cell.Column)。将工作表(“出席”)。Cells(i,3)将日期复制到新工作表
i=i+1
如果结束
下一个
以
端接头

正如第一个答案所说,我们不知道您的数据在哪里。我假设您的数据将显示在“表1”上。以下是VBA代码,可用于将原始数据复制到新工作表中。每次运行代码时,它都会删除除工作表1之外的所有工作表,然后创建一个名为“有人参与”的新工作表,最后,它会循环遍历您的数据,将“姓氏”、“姓名”和“日期”复制到新工作表“有人参与”中

Sub-a()
最后一排一样长
暗淡如长
作为整数的Dim i
将ws设置为工作表
暗淡单元格作为范围
lastrow=Sheet1.Cells(Rows.Count,1).End(xlUp).Row
lastcol=Sheet1.Cells(1,Columns.Count).End(xlToLeft).Column
'删除除Sheet1之外的所有工作表
Application.DisplayAlerts=False
对于工作表中的每个ws
如果ws.Name为“Sheet1”,则
ws.Delete
如果结束
下一个
Application.DisplayAlerts=True
'创建新工作表
Sheets.Add(在:=Sheet1之后)。Name=“出席”
附页(“出席”)
.范围(“A1”)=“姓氏”
.范围(“B1”)=“名称”
.范围(“C1”)=“日期”
以
'在数据表中循环以获取名称(如果已输入),并将其复制到新工作表中
i=2
附页1
对于.Range(“a1”)中的每个单元格,