1

我知道我想做什么,逻辑似乎相当简单。然而,当涉及到实际为它编写代码时,对于我这个级别的人来说,这似乎相当复杂。

我有一个带有 2 张工作表的 Excel 工作簿。

表 1在 A 和 B 列中包含 200 个名字和姓氏,在第 1 行中包含 13 个日期。电子表格的其余部分为空。 工作表 2包含来自工作表 1 的相同 200 人在这些日期的 11 个 1 小时块(09:00 - 20:00)的涂鸦结果。因此工作表 2 在 A 列和 B 列中包含相同的名称,行中的日期1 其中日期在连续单元格中重复 11 次以容纳第 2 行中的 11 个 1 小时块,然后是电子表格的其余部分,填充三个值之一 - “是”、“否”和“可能” ,对于每个名称的每个日期可用的每个 1 小时块。

我想在工作表 1 中的每个单元格中填写工作表 1 中的每个人在工作表 2 中将自己标记为“是”的时间。因此,如果第 1 个人在 09:00 - 10:00、11 小时内将自己标记为“是”: 2020 年 3 月 31 日工作表 2 上的 00-12:00 和 13:00-14:00,我想完全按照以下方式连接这些小时块 09:00-10:00 11:00-12:00 13 :00-14:00,然后将其输入到表 1 上该名称和日期的相应单元格中。

我必须承认,大约 5 小时前我才刚刚开始研究 VBA Excel 编码。所以我实际上没有可以提供的代码。我一直在尝试使用循环、数组、表格、查找等。而且我一直遇到问题,因为我的工作表具有不同的数据类型。

4

2 回答 2

1

感谢@CDP1802 完成了整个工作。我只是编辑了一些小东西!非常感谢!

    Sub mysub()

        Dim wb As Workbook, ws1 As Worksheet, ws2 As Worksheet
        Dim r As Integer, c As Integer, c2 As Integer, s As String, d As Integer

        Set wb = ThisWorkbook
        Set ws1 = wb.Sheets("Sheet1")
        Set ws2 = wb.Sheets("Sheet2")

        ' scan sheet 2
        For r = 3 To 202 ' or whatever the last row is
            For d = 0 To 12 ' 13 dates
                s = ""
                ' work out first columns on sheet2 for that d
                c2 = 3 + d * 11
                For c = c2 To (c2 + 10)
                    If ws2.Cells(r, c) = "Yes" Then
'                   Pick up time from row 2 in Sheet 2
                        s = s & ws2.Cells(2, c) & vbNewLine 
                    End If
                    If ws2.Cells(r, c) = "Under reserve" Then
'                   Pick up time from row 2 in Sheet 2 and place it in parenthesis
                        s = s & "(" & ws2.Cells(2, c) & ")" & vbNewLine
                        End If
                Next
' Insert the resulting string of times in Sheet 1. Sheet 1 has one less rows, hence r-1
                ws1.Cells(r - 1, d + 3) = s
            Next
        Next
        MsgBox "Done"
    End Sub
于 2020-03-13T13:13:50.147 回答
1

原则是使用一些基本数学方法向下扫描 sheet1 以确定要检查“是”的工作表 2 上的单元格范围

Sub mysub()

    Dim wb As Workbook, ws1 As Worksheet, ws2 As Worksheet
    Dim r As Integer, c As Integer, c2 As Integer, s As String, d As Integer

    Set wb = ThisWorkbook
    Set ws1 = wb.Sheets("Sheet1")
    Set ws2 = wb.Sheets("Sheet2")

    ' scan sheet 1
    For r = 3 To 10 ' or whatever the last row is
        For d = 0 To 10 ' 11 dates
            s = ""
            ' work out first columns on sheet2 for that d
            c2 = 3 + d * 11
            For c = c2 To (c2 + 10)
                If ws2.Cells(r, c) = "Yes" Then
                    s = s & ws2.Cells(2, c) & " " ' row 2 for time
                End If
            Next
            ws1.Cells(r, d + 3) = s
        Next
    Next
    MsgBox "Done"
End Sub
于 2020-03-10T20:49:23.507 回答