VBA |如何在Excel中将值从单元格复制到单元格

时间:2014-05-15 02:12:14

标签: excel vba excel-vba copy-paste

我想将一个单元格值复制到另一个单元格,但我希望将该值保留在变量中,以便根据需要使用它。

以下是我试过的代码 -

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

3 个答案:

答案 0 :(得分:6)

无需使用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 :(得分:0)

如果您只想将Range值传递给数组,则无需循环 尝试这样的事情:

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,只需将它声明在sub之外:

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 :(得分:-2)

首先,我建议您使用Developer功能区上的Record Macro工具。确保打开“使用相对参考”,并记录您想要做的一次迭代的鼠标点击和击键(将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