0

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

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

我希望现有数据在复制到表 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

该测试旨在成为一个命名范围。

我不知道如何解决这个问题,任何帮助表示赞赏。

4

1 回答 1

1

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

第 1 点

您已经使用了 Worksheets(1) 和 Worksheet("Sheet2")。我的建议是:保持一致。

从一个新工作簿开始,我将工作表重命名为:“Sheet1”为 Sheet2”,“Sheet2”为“Sheet3”,“Sheet3”为“Sheet1”。然后我将最后一个选项卡移动到第一个位置。我放置了“A” , "B" 和 "C" 在三个工作表的单元格 A1 中。在即时窗口中,我以三种不同的方式访问工作表 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运行宏并得到:

在此处输入图像描述

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

在上面的宏 Demo1() 中,我使用了Worksheets.Countand Worksheets(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语句并注意Debug.PrintDemo2() 中的语句比 Demo1() 中的语句更简洁。 With语句对于整理代码非常有用。

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

第 3 点

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

我用各种值和格式填充了 Worksheets("Sheet1").Range(C2:C10) :

在此处输入图像描述

我将范围“测试”定义为 Worksheets(“Sheet2”).Range(D3:G3)。我运行了宏 Demo3(),它将以下内容输出到即时窗口:

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

并将 Worksheets("Sheet2") 设置为:

在此处输入图像描述

宏 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
于 2013-09-17T12:18:35.000 回答