需要循环播放&修改Excel工作表中的单元格......我从哪里开始?

时间:2017-03-28 20:36:24

标签: excel vba excel-vba

我正在使用

我需要修改一个文件(从salesforce导出),其中行具有唯一ID,名称和一个列,该列具有此表中另一行的唯一ID,并将其标识为该项的“子”。 / p>

  1. ID( columnA
  2. 名称( columnB
  3. ParentID( columnC
  4. 未受影响的数据图片:

    enter image description here

    我需要完成的工作

    我的目标是遍历整个电子表格(55,000行)并将ParentID更改为父级名称列中的值。

    我的伪代码解决方案

    foreach row starting from the top {
        varA = [current row number for this loop];
        varX = [value in varA:columnC];
        if (varX == [regex value]) {
            foreach row starting from the top {
                varB = [current row number for this loop];
                if ([value in varB:columnA] == varX) {              
                    foreach row starting from the top {
                        varC = [current row number for this loop];
                        if (varC:columnC = varB:columnA) {
                            [varC:columnC] = [varB:columnB];
                        }
                    }
                    break second foreach loop;
                }
            }
        }
    }
    

    手动修复后的数据图片:

    enter image description here

    到目前为止我做过的研究

    我正在使用excel,我发现资源讨论如何创建一个新的宏,有些甚至有例子,但我不相信它会成为正确的地方。我也有一位朋友建议使用Pandas修改文件会更好,但这也不是我熟悉的。

    我的问题:

    我从哪里开始? ...编写脚本来修改所有这些内容的正确工具是什么?

    另外,如果可能的话,在使用适合此工作的工具时,您是否可以建议我使用资源作为参考?

2 个答案:

答案 0 :(得分:2)

改变这一点,

enter image description here

..使用此代码,

Option Explicit

Sub wqweqrteq()
    Dim d As Long, dict As Object, vals As Variant

    Set dict = CreateObject("Scripting.Dictionary")

    With Worksheets("salesforce")
        With .Range(.Cells(2, "A"), .Cells(.Rows.Count, "C").End(xlUp))
            vals = .Value2
        End With

        For d = LBound(vals, 1) To UBound(vals, 1)
            dict.Item(vals(d, 1)) = vals(d, 2)
        Next d

        For d = LBound(vals, 1) To UBound(vals, 1)
            If dict.exists(vals(d, 3)) Then
                vals(d, 3) = dict.Item(vals(d, 3))
            End If
        Next d

        With .Range(.Cells(2, "A"), .Cells(.Rows.Count, "C").End(xlUp))
            .Value = vals
        End With
    End With

End Sub

..进入这个。

enter image description here

答案 1 :(得分:0)

以下 For循环可以解决您的问题:

Sub UpdateID()

Dim lastrow As Long
Dim x As Long, y As Long, z As Long
Dim ParentName As String

lastrow = Cells(Rows.Count, "A").End(xlUp).Row

For x = 2 To lastrow
    If Left(Cells(x, 3), 2) = 0 Then
        For y = 2 To lastrow
            If Cells(x, 3).Value = Cells(y, 1).Value Then
            ParentName = Cells(y, 2).Value
            Exit For
            End If
        Next y
    End If

    For z = 2 To lastrow
        If Cells(z, 3).Value <> "" And Cells(x, 3).Value = Cells(z, 3).Value Then
        Cells(z, 3).Value = ParentName
        End If
    Next z
Next x

End Sub