VBA | 如何在Excel中将单元格的值复制到另一个单元格

4
我想将一个单元格的值复制到另一个单元格,但我希望保留该值在变量中,以便根据需要使用。
以下是我尝试的代码 -
Private Sub CommandButton1_Click()
NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
For x = 1 To NumRows
    a= Cells(x, 1).Value.Copy
    Cells(x, 2).Value= a.PasteSpecial
Next
End Sub

代码没有按照你想要的方式工作,它做了什么? - phoog
2
CodeJockey的回答是正确的,如果你只需要复制单元格中的值。为了符合你的附加要求,即将该值存储在变量中,只需将a = Cells(x, 1).Value.Copy替换为a = Cells(x, 2).Value,就像CodeJockey的回答一样。 - crcvd
那么如何在后续代码中使用变量a呢?我的代码中的Cells(x, 2).Value=a.PasteSpecial没有按预期工作。 - Nitin Jadhav
啊,你的问题是作用域。一旦你离开了这个子程序,这个变量就被销毁了。你需要在子程序外声明a为公共变量,以便其他地方可以看到它。只需在Private Sub CommandButton1_Click上面键入Public a As Variant即可。请注意,在循环中你只会保存a的最后一个值。请查看我的答案来创建数组。 - CodeJockey
a 是一个二维数组。数组没有名为 PasteSpecial 的方法。请参考 @CodeJockey 的回答,了解正确的处理方法。 - Jean-François Corbett
3个回答

8

不需要使用Range.Copy方法。尝试这样做:

Dim a As Variant
a = Cells(x, 1).Value
Cells(x, 2).Value = a

如果您想保留所有的值,您需要使用一个数组:

Dim x As Long
Dim NumRows As Long

NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
ReDim a(1 to NumRows)

For x = 1 To NumRows
    a(x) = Cells(x,1).Value
    Cells(X,2).Value = a(x)
Next x

我还建议显式变量声明。可以在选项中找到,或者在任何子程序或函数上方键入Option Explicit。这将强制您声明变量。我知道对于新手来说可能会感到负担,但只需要一个打字错误就可以声明一个新变量并改变您的想法。


1
你的第二段代码片段无法编译...等一下...我已经为你修复了。 - Jean-François Corbett
可以不用循环,而是直接执行以下代码:a = Range("A1").Resize(NumRows,1).Value 然后 Range("A1").Offset(0,1).Resize(NumRows,1).Value = a - Jean-François Corbett

0

如果您只想将范围值传递给数组,无需循环。
尝试像这样:

Dim a

With Sheets("YourSheetName")
    a = Application.Transpose(.Range("A1", .Range("A" & _
        .Rows.Count).End(xlUp).Address))
End With

'~~> check your array
For i = Lbound(a)  To Ubound(a)
    Debug.Print a(i)
    '~~> rest of your code here to do what you like.
Next

现在,如果您想在代码执行后使用变量a,只需在子程序外部声明它,如下所示:
Dim a As Variant '~~> you can also use Public a As Variant

Sub Something()
'~~> put similar code above here and the rest of your code
End Sub

现在,您需要对变量a进行测试,以确定它是否为空,否则您将仅覆盖它并且失去目的。
像这样的简单检查应该可以工作:
If IsEmpty(a) Then '~~> or IsArray if you're sure you'll always have a as array
    '~~>  populate a
    '~~> proceed with what you want to do with a
Else
    '~~> proceed with what you want to do with a
End If

希望能有所帮助。


-2

首先,我建议您使用开发人员选项卡上的“记录宏”功能。确保打开“使用相对引用”,并记录您想要执行的操作(将A1复制到B1)的鼠标点击和按键操作。然后在VB中打开宏并进行修改。

当我使用这种方法时,我得到了以下结果,它似乎对我有效。我希望它对您也有用。

Sub Macro1()

Dim NumRows As Integer
NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
Range("A1").Activate

    For i = 1 To NumRows

        ActiveCell.Select
        Selection.Copy
        ActiveCell.Offset(0, 1).Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        ActiveCell.Offset(1, -1).Activate

    Next

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接