我想将一个单元格值复制到另一个单元格,但我希望将该值保留在变量中,以便根据需要使用它。
以下是我试过的代码 -
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
答案 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