Excel 取一个参考单元格,搜索第二页,用相同的标识符替换数据

Excel 取一个参考单元格,搜索第二页,用相同的标识符替换数据,excel,vba,Excel,Vba,我决定改变我的策略。 我决定再试一次,但是用一种新的方式。我做了一个周末的谷歌马拉松,发现我相信我的答案 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

我决定改变我的策略。 我决定再试一次,但是用一种新的方式。我做了一个周末的谷歌马拉松,发现我相信我的答案

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
看看这个,我只是想有一个更清晰的解释,而不是只是照本宣科,在不知道自己在做什么的情况下使用它

这是它所在的表格:

如果我把这个添加到我的代码中,反写这个代码,我知道我能做到,我只想验证一下这是正确的

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行中的正确数据将其改写


我知道有些地方出了问题,但我不知道该怎么办,如果有人能帮助我,我将不胜感激。

我不能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
在使用wsNDA的
块中,您需要将
放在
范围
单元格
之前,例如:

.Range("A54", .Cells(2, LC)).Copy
最后:

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


我不是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
在使用wsNDA的
块中,您需要将
放在
范围
单元格
之前,例如:

.Range("A54", .Cells(2, LC)).Copy
最后:

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


我临时存储数据的唯一原因是因为这是我知道如何做的唯一方法。此外,我希望它被暂时存储,以防有一个bug,我知道该查找什么。一般来说,我对VBA还是比较陌生的,所以我不知道我应该知道的一切。让我看看你调整过的代码是如何工作的。我肯定会回答一些问题:)至于我想做的是,如果你下载文件并打开它,你会看到两张纸,第一张是表单,第二张是存储位置,表单从哪里获取数据。在第一种形式中,右边是一个下拉菜单,这将允许您选择第二页上的信息。然后,它将自行填充其余部分。之后,我想更改其中的某些内容,并在按下submit按钮后生成一个脚本,以使用其中的新数据更改原始行,而不更改数字。现在这有什么意义吗?我在rFind=wsNDA.Range(“A:A”&LR.Find(Range(“A54”))).Row上得到一个错误。对象“U工作表”的运行时错误“1004”方法“Range”失败。请尝试:
.Range(“A1:A”)和LR.Find(.Range(“A54”)。行
(注意2范围前的点和A1而不是A)。相同错误。rFind=wsNDA.Range(“A:A”&LR.Find(.Range(“A54”))).row我临时使用Range存储数据的唯一原因是因为这是我知道的唯一方法。此外,我希望它被暂时存储,以防有一个bug,我知道该查找什么。一般来说,我对VBA还是比较陌生的,所以我不知道我应该知道的一切。让我看看你调整过的代码是如何工作的。我肯定会回答一些问题:)至于我想做的是,如果你下载文件并打开它,你会看到两张纸,第一张是表单,第二张是存储位置,表单从哪里获取数据。在第一种形式中,右边是一个下拉菜单,这将允许您选择第二页上的信息。然后,它将自行填充其余部分。之后,我想更改其中的某些内容,并在按下submit按钮后生成一个脚本,以使用其中的新数据更改原始行,而不更改数字。现在这有什么意义吗?我在rFind=wsNDA.Range(“A:A”&LR.Find(Range(“A54”))).Row上得到一个错误。对象“U工作表”的运行时错误“1004”方法“Range”失败。请尝试:
.Range(“A1:A”)和LR.Find(.Range(“A54”)。行
(注意2范围前的点和A1而不是A)。相同错误。rFind=wsNDA.Range(“A:A”和LR).Find(.Range(“A54”)).Row