我正在尝试将数据从一张纸复制到另一张纸。
在第二张表格中,行中的条目需要向下移动
我希望现有数据在复制到工作表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
测试意味着命名范围。
我不知道如何解决这个问题,感谢任何帮助。
答案 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 运行一个宏并得到:
也就是说,用户可以从任何打开的工作簿运行宏。如果您认为您的用户将从不同的工作簿运行您的宏,那么您需要绝对清楚哪个工作簿处于活动状态。
在上面的宏Demo1()中,我使用了Worksheets.Count
和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
语句,并注意Demo2()中的Debug.Print
语句比Demo1()中的语句更整洁。 With
语句对于整理代码非常有用。
我的观点是:保持一致。如果您需要担心多个工作簿,那么您需要为每个语句担心它们而不仅仅是一个。
第3点
避免选择工作表或范围,因为它很慢并且因为它可能会造成混淆。我使用了Range.Copy
,其效果与Copy
和ActiveSheet.Paste
相同,但速度更快,更整洁。
我填充了工作表(“Sheet1”)。范围(C2:C10)具有各种值和格式:
我将范围“Test”定义为工作表(“Sheet2”)。范围(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