在参考单元格中搜索第二张表格,替换具有相同标识符的数据

时间:2012-05-01 13:23:00

标签: excel-vba vba excel

我决定改变机智。 我决定再次拍摄,但是以一种新的方式。我做了一个周末长的谷歌马拉松,发现我相信我的答案,

Option Explicit
Sub DataUpdate()
Dim rFind As Long, NR As Long, LR As Long, LC As Long
LR = Range("C" & Rows.Count).End(xlUp).Row
LC = Cells(2, Columns.Count).End(xlToLeft).Column
NR = LR + 1

On Error Resume Next
rFind = Range("A25:A" & LR).Find(Range("A1")).Row
On Error GoTo 0

    If rFind = 0 Then
        If MsgBox("Customer record not found, add to dataset?", vbYesNo + vbQuestion) = vbYes Then
            Range("A2", Cells(LC, 2)).Copy
            Range("C" & NR).PasteSpecial xlPasteValues
            Range("A1", Cells(1, LC)).ClearContents
            Exit Sub
        End If
    Else
        Range("A2", Cells(2, LC)).Copy
        Range("A" & rFind).PasteSpecial xlPasteValues
        Range("A1", Cells(1, LC)).ClearContents
    End If
End Sub

看着这个我只想要一个更清晰的解释,而不仅仅是按原样使用它,并在不知道我在做什么的情况下使用它。

这是它所在的表格:

http://dl.dropbox.com/u/3327208/Excel/Replace.zip

如果我将此添加到我的代码中,反复使用此代码,我发现我可以执行此操作,我只是想验证这是否正确。

Option Explicit

Sub PENCMR()
    Dim i As Integer

    With Application
        .ScreenUpdating = False
    End With

    'Internal NCMR
    Dim wsPE As Worksheet
    Dim wsNDA As Worksheet

    'Copy Ranges
    Dim c As Variant

    'Paste Ranges
    Dim p As Range

    'Setting Sheet
    Set wsPE = Sheets("Print-Edit NCMR")
    Set wsNDA = Sheets("NCMR Data")
    Set p = wsPE.Range("A54:U54")

    With wsPE
        c = Array(.Range("AG2"), .Range("B11"), .Range("B14"), .Range("B17"), .Range("B20"), .Range("B23") _
                , .Range("Q11"), .Range("Q14"), .Range("Q17"), .Range("Q20"), .Range("R25"), .Range("V23") _
                , .Range("V25"), .Range("V27"), .Range("B32"), .Range("B36"), .Range("B40"), .Range("B44") _
                , .Range("D49"), .Range("L49"), .Range("V49"))
    End With

    For i = LBound(c) To UBound(c)
        p(i + 1).Value = c(i).Value
    Next

    With wsNDA
        Dim rFind As Long, NR As Long, LR As Long, LC As Long
        LR = Range("C" & Rows.Count).End(xlUp).Row
        LC = Cells(2, Columns.Count).End(xlToLeft).Column
        NR = LR + 1
        rFind = wsNDA.Range("A:A" & LR).Find(Range("A54")).Row

        Range("A54", Cells(2, LC)).Copy
        Range("A" & rFind).PasteSpecial xlPasteValues
        Range("A54", Cells(1, LC)).ClearContents

    End With

    With Application
        .ScreenUpdating = True
    End With
End Sub

代码运行,但它没有返回错误,但它没有完全运行。它击中了所有东西,然后它似乎死在那里。有人可以帮我找出为什么它没有做我认为它应该做的事情,即复制行,在A列中搜索数字,然后用第54行中的正确数据写上它......

我知道有些事情是错的,但是我没有能力弄清楚是什么,如果有人可以帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:0)

我不是100%确定你想要实现的目标,但是你的代码中存在一些问题:

而不是

Set p = wsPE.Range("A54:U54")
For i = LBound(c) To UBound(c)
    p(i + 1).Value = c(i).Value
Next

你可能意味着

Set p = wsPE.Range("A54")
For i = LBound(c) To UBound(c)
    p.Offset(0, i) = c(i)
Next

With wsNDA区块中,您需要将.放在RangeCells之前,例如:

.Range("A54", .Cells(2, LC)).Copy

最后:

  • 我现在要删除ScreenUpdating语句,并在调试模式下运行代码(F8),逐步查看代码执行的操作,并在必要时使用“添加监视”检查变量的值
  • 我会避免使用范围来存储临时数据。您可以使用2D数组,例如:

Dim data As Variant
Redim data(1 To 1, 1 To 21) As Variant
for i = xx To yy
    data(1,i+1) = c(i)
Next i

yourTargetCell.Resize(1, UBound(data,2)) = data