跨多个工作表的VBA宏

kmi*_*o91 10 excel vba excel-2007 excel-vba

我试图运行一个宏来执行多个工作表上的功能.假设我在工作表4上分配了宏按钮.我已经列出了我希望它逐步执行的功能:

1)选择工作表4中的某些单元格并复制到工作表4中的相邻单元格
.2)删除工作表
3中的单元格范围.3)工作表2中的CUT单元格范围然后将此范围的单元格粘贴到工作表3中
.4)取范围从单独的工作簿中复制单元格并复制到工作表2.(我知道这是一个完全不同的问题,因为工作簿会自动发布,我将不得不找到一种方法来链接这两个.)
5)更新位于工作表4中的数据透视表和工作表3.

我很乐意帮助解决这个问题的前3个功能.我已粘贴下面的当前代码.

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Brand")
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek")
Set sh3 = ActiveWorkbook.Sheets("PriorWeek")
Set sh4 = ActiveWorkbook.Sheets("Pivot")

sh4.Range("B29:B30").Select
Selection.Copy

sh4.Range("C29").Select
ActiveSheet.Paste

sh3.Range("A4:AC1000").Select
Selection.Delete

sh2.Range("A4:AC1000").Select
Selection.Copy

sh3.Range("A4").Select
ActiveSheet.Paste

End Sub
Run Code Online (Sandbox Code Playgroud)

它可以工作......但只有当我在正确的工作表中才能执行特定的功能时它才有效.

nut*_*sch 15

通过删除select,selectionactivesheet,您将能够使这个表单独立

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Brand")
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek")
Set sh3 = ActiveWorkbook.Sheets("PriorWeek")
Set sh4 = ActiveWorkbook.Sheets("Pivot")

sh4.Range("B29:B30").Copy sh4.Range("C29")

sh3.Range("A4:AC1000").Delete

sh2.Range("A4:AC1000").Copy sh3.Range("A4")

End Sub
Run Code Online (Sandbox Code Playgroud)


Sco*_*man 5

你有一个良好的开端.只是更精致,你就会拥有它.

基本上,.Select至少在这种情况下,不需要你的范围(工作表,工作簿等).您可以直接使用它们并使用Copy提供它们将被复制的目标.

见下面的代码:

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet
Dim wkb As Workbook

Set wkb = Workbooks("wkbName") '-> best to call workbooks by name, as opposed to "ActiveWorkbook", also best to set it to object

With wkb '-> now we can work with this object directly and succinctly

    Set sh1 = .Sheets("Brand")
    Set sh2 = .Sheets("CurrentWeek")
    Set sh3 = .Sheets("PriorWeek")
    Set sh4 = .Sheets("Pivot")

    sh4.Range("B29:B30").Copy sh4.Range("C29")

    'sh3.Range("A4:AC1000").Delete -> you don't need this if you are overwritting it

    sh2.Range("A4:AC1000").Copy sh3.Range("A4")

End With

End Sub
Run Code Online (Sandbox Code Playgroud)

  • @ScottHoltzman:在每个程序结束时将所有对象设置为"Nothing"将使用大多数无用的样板垃圾填充你的代码.你只需要为那些`Class_Terminate`事件处理程序以错误的方式与全局变量和对象进行交互的对象执行此操作 - 这些对象本身就是你不应该使用的坏事(有一个noteworth异常是VBA奇怪的本机`Err`对象,没有方法).对于"工作簿"和"工作表"对象,这是无关紧要的,因此不要浪费你的一切. (6认同)