在工作表

时间:2015-08-25 19:43:30

标签: excel vba excel-vba offset

简介:我一直在研究这个宏已经有一段时间了,并且已经成功地让它做我需要它做的事情,但是我并没有以最有效的方式做到这一点我的编码背景很少。因此,由于从一个工作表“FB MATE DATA”到另一个“Sheet 2(2)”复制和粘贴数据来回切换,宏非常慢。

背景:CMM机器将测量数据吐出到电子表格中,我需要在整齐的X和Y列中将其从一张纸复制并粘贴到另一张纸上,以便在散点图中重叠。问题是数据处于非常规模式,需要使用偏移,而不同的工作表具有从不同行开始的数据,因此宏必须考虑到这一点。之所以如此慢,是因为我实现这一目标的方法是不断地来回激活每个工作表,一遍又一遍地保持对活动单元的控制,而不是仅仅引用固定单元的偏移,因为偶尔会有偏移变化连续。我现在的代码:

  • 在A列中向下循环,直到找到空白单元格
  • 向下移动到紧邻其下方的单元格并开始复制数据。 (这非常重要,因为前几行是与我无关的数据,它们与我用空格寻找的数据分开。)
  • 将偏移量范围(G:FZ)中的数据(例如G21,K21,O21,S21,W21,AA21,AE21,AI21,AM21,AQ21,AU21,AY21,BG21)复制到整齐的X | Y中来自D73的表格:E:93。请注意不规则图案(由于我的情节无关的信息)
  • 每两个代表一对X | Y对(例如X:G21粘贴到表2中的D73,Y:K21粘贴到表2中的E73等)

问题:对于每一行数据,我需要复制更改的区间中的某些列(第一列,第四列,第九列,第二列等)并将其粘贴到两行中另一页上的X | Y列。

数据抓取不会始终在G21中启动。有时第一个数据点可能是G24,或G10,或G15,因此宏为什么首先搜索空行而不是从固定位置拉出。下面是前四列循环的样本。

代码:

 Sub LocatorTest()

'Select first row of eligible spare pallet data
 Range("B73").Select
 Application.Goto (ActiveWorkbook.Sheets("FB MATE DATA").Range("A1"))
 Dim c
 For Each c In Range("A1:A100").Cells
    If c = "" Then
        c.Select
        Exit For
    End If
Next
ActiveCell.Offset(1, 6).Range("A1").Select
Selection.Copy
Sheets("Sheet2 (2)").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

Range("C73").Select
Worksheets("FB MATE DATA").Activate
ActiveCell.Offset(rowOffset:=0, columnOffset:=4).Activate
Selection.Copy
Sheets("Sheet2 (2)").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

Range("B74").Select
Worksheets("FB MATE DATA").Activate
ActiveCell.Offset(rowOffset:=0, columnOffset:=8).Activate
Selection.Copy
Sheets("Sheet2 (2)").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

    Range("C74").Select
Worksheets("FB MATE DATA").Activate
ActiveCell.Offset(rowOffset:=0, columnOffset:=12).Activate
Selection.Copy
Sheets("Sheet2 (2)").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

您可以提供的任何帮助可能以不同的方式实现此目标或使其更快地运行将非常感激。

1 个答案:

答案 0 :(得分:1)

哇,哇,这可以使用一些MAJOR改进。

但是为了方便起见,你可能想把它放在开头:

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

并在宏的末尾:

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

这将给它带来巨大的速度提升。下一个;你应该尝试引用细胞而不激活......