将数据移动并复制到命名范围

时间:2013-09-14 13:42:09

标签: excel excel-vba copy named vba

我正在尝试将数据从一张纸复制到另一张纸。

在第二张表格中,行中的条目需要向下移动

我希望现有数据在复制到工作表2时向下移动。

我尝试使用偏移功能,但感到困惑,不确定我是否正确写入。

Sub MoveData()
  If ThisWorkbook.Worksheets(1).Shapes("Check Box 1").OLEFormat.Object.Value = 1 Then
     Range("c2:c10").Select
     Selection.Cut
     Sheets("Sheet2").Select
     Range("test").Select
     ActiveSheet.Paste
     Range("test").Select
  End If
End Sub

测试意味着命名范围。

我不知道如何解决这个问题,感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我同意pnuts,你所尝试的并不明显。以下是各种示例。我希望可以根据您的要求进行调整。我已经使用了许多替代方法来识别工作表和范围而不解释语法。一旦知道存在语法,就可以在VB帮助或Internet上查找。但是,您需要进一步解释,我很乐意添加它。

第1点

您已使用工作表(1)和工作表(“Sheet2”)。我的建议是:保持一致。

从新工作簿开始,我重命名了工作表:“Sheet1”到Sheet2“,”Sheet2“到”Sheet3“和”Sheet3“到”Sheet1“。然后我将最后一个标签移动到第一个位置。我放置了三张单元格A1中的“A”,“B”和“C”。在立即Windows中,我以三种不同的方式访问表1 并获得三种不同的工作表:

? Worksheets(1).Cells(1,1).Value
C
? Worksheets("Sheet1").Cells(1,1).Value
A
? Sheet1.cells(1,1).value
B

好的,你不可能在实践中遇到这样的事情。但是,如果将“Sheet1”重命名为“xyz”,它仍将是Worksheets(1)和Sheet1。但是,如果您再添加另一个工作表并移动到最后一个选项卡,它将是“Sheet1”或Sheet4或Worksheets(4)。

我不记得曾经将工作表引用为Worksheets(1)或Sheet1。

如果我需要遍历工作表,我会写一些类似的东西:

Option Explicit
Sub Demo1()

  Dim InxWsht As Long

  For InxWsht = 1 To Worksheets.Count
    Debug.Print "Cell A1 of worksheet """ & Worksheets(InxWsht).Name & _
                """ is " & Worksheets(InxWsht).Range("A1").Value
  Next

End Sub

将以下内容输出到立即窗口:

Cell A1 of worksheet "Sheet3" is C
Cell A1 of worksheet "Sheet1" is A
Cell A1 of worksheet "Sheet2" is B

通常我会使用Worksheets(“Master”),因为“Master”是用户已知的名称。

第2点

您编写ThisWorkbook.Worksheets(1)但不再使用ThisWorkbook。如果您的宏正在使用多个工作簿,ThisWorkbook将标识包含宏的工作簿。

我复制了我的工作簿并打开了两个版本。我使用 Alt + F8 运行一个宏并得到:

enter image description here

也就是说,用户可以从任何打开的工作簿运行宏。如果您认为您的用户将从不同的工作簿运行您的宏,那么您需要绝对清楚哪个工作簿处于活动状态。

在上面的宏Demo1()中,我使用了Worksheets.CountWorksheets(InxWsht)。这些是指活动工作簿。如果您需要关注多个工作簿,请写下以下内容:

Sub Demo2()

  Dim InxWsht As Long

  Debug.Print "Active workbook: " & ActiveWorkbook.Name
  Debug.Print "ThisWorkbook: " & ThisWorkbook.Name

  With ThisWorkbook
    For InxWsht = 1 To .Worksheets.Count
      With .Worksheets(InxWsht)
        Debug.Print "Cell A1 of worksheet """ & .Name & _
                    """ is " & .Range("A1").Value
      End With
    Next
  End With

End Sub

将以下内容输出到立即窗口:

Active workbook: Book1.xls
ThisWorkbook: Book2.xls
Cell A1 of worksheet "Sheet3" is C
Cell A1 of worksheet "Sheet1" is A
Cell A1 of worksheet "Sheet2" is B  

.Worksheets.Count.Worksheets(InxWsht)前面的句点表示它们位于With语句中标识的对象中。请注意,您可以嵌套With语句,并注意Demo2()中的Debug.Print语句比Demo1()中的语句更整洁。 With语句对于整理代码非常有用。

我的观点是:保持一致。如果您需要担心多个工作簿,那么您需要为每个语句担心它们而不仅仅是一个。

第3点

避免选择工作表或范围,因为它很慢并且因为它可能会造成混淆。我使用了Range.Copy,其效果与CopyActiveSheet.Paste相同,但速度更快,更整洁。

我填充了工作表(“Sheet1”)。范围(C2:C10)具有各种值和格式:

enter image description here

我将范围“Test”定义为工作表(“Sheet2”)。范围(D3:G3)。我运行宏Demo3(),它将以下内容输出到立即窗口:

Sheet2
$D$3:$G$3
Range "Test" is: Worksheets("Sheet2").Range(.Cells(3,4),.Cells(3,7))

并将Worksheets(“Sheet2”)设置为:

enter image description here

宏Demo3()中有很多,但我相信如果你慢慢地完成它,你会看到每个语句的效果,这可能不是你所期望的。希望这会有所帮助。

Sub Demo3()

  Dim ColDestLeft As Long
  Dim ColDestRight As Long
  Dim RowDestTop As Long
  Dim RowDestBot As Long

  ' Note: ranges are not just cells; they also identify the worksheet
  Debug.Print Range("Test").Worksheet.Name
  Debug.Print Range("Test").Address

  RowDestTop = Range("Test").Row
  RowDestBot = Range("Test").Row + Range("Test").Rows.Count - 1
  ColDestLeft = Range("Test").Column
  ColDestRight = Range("Test").Column + Range("Test").Columns.Count - 1

  Debug.Print "Range ""Test"" is: Worksheets(""" & _
              Range("Test").Worksheet.Name & """).Range(.Cells(" & _
              RowDestTop & "," & ColDestLeft; "),.Cells(" & RowDestBot & _
              "," & ColDestRight; "))"

  Worksheets("Sheet1").Range("C2:C10").Copy Destination:=Range("Test")
  Worksheets("Sheet1").Range("C2:C10").Copy _
                                    Destination:=Range("Test").Offset(9, 4)
  Worksheets("Sheet1").Range("C2:C10").Copy Destination:= _
                   Worksheets("Sheet2").Cells(RowDestTop + 10, ColDestLeft)

End Sub