Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何将类似的记录跨工作表分组?_Vba_Excel - Fatal编程技术网

Vba 如何将类似的记录跨工作表分组?

Vba 如何将类似的记录跨工作表分组?,vba,excel,Vba,Excel,我需要创建一个宏,帮助将来自多个工作表(实际上是6个工作表)的类似记录分组,并将结果放在汇总表中,列出所有找到的值 例如,我有两个月的时间。每张纸上都有这样的记录。每一张纸上都有可乐和可乐组合的独特记录。但在其他表格中,我可以找到相同的ColA-ColB组合,但ColC的值不同 表1 第2页 预期结果 如您所见,当我浏览其他表单时,可能会弹出新值,因此我需要添加它们,以指示前几个月的值为零。类似的情况是,当您在第一个表单中找到值时,其他表单中不存在该值 我只有几行代码只完成了工作的一部分,因此非

我需要创建一个宏,帮助将来自多个工作表(实际上是6个工作表)的类似记录分组,并将结果放在汇总表中,列出所有找到的值

例如,我有两个月的时间。每张纸上都有这样的记录。每一张纸上都有可乐和可乐组合的独特记录。但在其他表格中,我可以找到相同的ColA-ColB组合,但ColC的值不同

表1 第2页 预期结果 如您所见,当我浏览其他表单时,可能会弹出新值,因此我需要添加它们,以指示前几个月的值为零。类似的情况是,当您在第一个表单中找到值时,其他表单中不存在该值


我只有几行代码只完成了工作的一部分,因此非常感谢您提供的任何帮助。

试试下面的代码-看起来有点混乱,但实际上有一种方法可以解决这种疯狂的问题。作为最后一步,如果您希望在目的地工作表中按字母顺序对结果进行排序,您可能需要在代码末尾添加一个排序例程

在运行之前,不要忘记在两个注释部分中输入图纸名称信息

Sub concat_values()

    Dim ws As Worksheet
    Dim dic As Object
    Dim wscoll As Collection
    Dim i As Integer
    Dim cell As Range

    Set wscoll = New Collection

    'Enter your source sheets names here
    wscoll.Add Worksheets("Sheet1")
    wscoll.Add Worksheets("Sheet2")
    wscoll.Add Worksheets("Sheet3")
    wscoll.Add Worksheets("Sheet4")
    wscoll.Add Worksheets("Sheet5")
    wscoll.Add Worksheets("Sheet6")

    Set dic = CreateObject("Scripting.Dictionary")
    n = 1

    For Each ws In wscoll

        For Each cell In ws.Range("A1:A" & ws.Range("A" & ws.Rows.count).End(xlUp).row).Cells

            mykey = cell.Value & "/" & cell.Offset(0, 1).Value

            If n >= 2 Then
                For j = 1 To n - 1
                    myval = myval & "0,"
                Next j
            End If

            myval = myval & cell.Offset(0, 2).Value

            If n <= wscoll.count - 1 Then
                For j = n To wscoll.count - 1
                    myval = myval & ",0"
                Next
            End If

            On Error GoTo ERREUR
            dic.Add mykey, myval
            On Error GoTo 0

            mykey = ""
            myval = ""

        Next cell
        n = n + 1

    Next ws

    i = 1

    'Enter your destination sheet name here
    With Worksheets("DEST")
        For Each k In dic.Keys
            .Range("A" & i).Value = Mid(k, 1, InStr(k, "/") - 1)
            .Range("B" & i).Value = Mid(k, InStr(k, "/") + 1, Len(k))
            .Range("C" & i).Value = dic(k)
            i = i + 1
        Next k
    End With

    Exit Sub

ERREUR:

    count = 1

    For j = 1 To n - 1
        count = InStr(count + 1, dic(mykey), ",")
    Next j

    dic(mykey) = WorksheetFunction.Replace(dic(mykey), count + 1, 1, cell.Offset(0, 2).Value)
    Resume Next

End Sub

好吧,你的问题是什么?@Sifu,没必要屈尊俯就。这个问题虽然不是一个真正的问题,但很明显。您需要问用户的正确问题是,到目前为止您所做的代码在哪里?诚然,就合并数据而言,您所期望的结果毫无意义。为什么在没有DDD1110 0的情况下,DDD的值是0,20?此外,请张贴您的代码。如果我们从零开始,我们将在这里拍摄空白。非常感谢,这项工作做得很好。我唯一需要考虑的是目标单元格的格式。切换到文本非常有效
ColA ColB ColC

AAA 111 2

CCC 222 50

DDD 111 20
ColA ColB ColC

AAA 111 2,2

BBB 111 3,0

CCC 222 50,50

DDD 111 0,20
Sub concat_values()

    Dim ws As Worksheet
    Dim dic As Object
    Dim wscoll As Collection
    Dim i As Integer
    Dim cell As Range

    Set wscoll = New Collection

    'Enter your source sheets names here
    wscoll.Add Worksheets("Sheet1")
    wscoll.Add Worksheets("Sheet2")
    wscoll.Add Worksheets("Sheet3")
    wscoll.Add Worksheets("Sheet4")
    wscoll.Add Worksheets("Sheet5")
    wscoll.Add Worksheets("Sheet6")

    Set dic = CreateObject("Scripting.Dictionary")
    n = 1

    For Each ws In wscoll

        For Each cell In ws.Range("A1:A" & ws.Range("A" & ws.Rows.count).End(xlUp).row).Cells

            mykey = cell.Value & "/" & cell.Offset(0, 1).Value

            If n >= 2 Then
                For j = 1 To n - 1
                    myval = myval & "0,"
                Next j
            End If

            myval = myval & cell.Offset(0, 2).Value

            If n <= wscoll.count - 1 Then
                For j = n To wscoll.count - 1
                    myval = myval & ",0"
                Next
            End If

            On Error GoTo ERREUR
            dic.Add mykey, myval
            On Error GoTo 0

            mykey = ""
            myval = ""

        Next cell
        n = n + 1

    Next ws

    i = 1

    'Enter your destination sheet name here
    With Worksheets("DEST")
        For Each k In dic.Keys
            .Range("A" & i).Value = Mid(k, 1, InStr(k, "/") - 1)
            .Range("B" & i).Value = Mid(k, InStr(k, "/") + 1, Len(k))
            .Range("C" & i).Value = dic(k)
            i = i + 1
        Next k
    End With

    Exit Sub

ERREUR:

    count = 1

    For j = 1 To n - 1
        count = InStr(count + 1, dic(mykey), ",")
    Next j

    dic(mykey) = WorksheetFunction.Replace(dic(mykey), count + 1, 1, cell.Offset(0, 2).Value)
    Resume Next

End Sub