VBAmacros – 有时它的工作,有时它不

这是我的第一个macros,我需要一些帮助。 我不断地改变我的variables在工作表1中,并在工作表2中运行另一个macros来获得我的结果。 所以这是一个灵敏度testing,我正在写下面的macros来运行已经存在的marco。 它生成的一些行似乎是正确的,但其中有些不是。 我不知道出了什么问题。 任何提示都表示赞赏。

Sub SensitivityTest() For i = 8 To 11 Range("G" & i + 1).Select Selection.Copy Range("D10").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("D15").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Call AnotherMacro Range("Q76").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("H" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AD76").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("I" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("Q20").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("J" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AD20").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("K" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("Q27").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("L" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AD27").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("M" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("Q28").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("N" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AD28").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("O" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("V76").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("Q" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AI76").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("R" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("V20").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("S" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AI20").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("T" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("V27").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("U" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AI27").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("V" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("V28").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("W" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("AI28").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("X" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Next i End Sub 

要跟踪@ bruceWayne的评论:

当前的复制/粘贴操作:

 Sheets("Sheet2").Select Range("AD76").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("I" & i + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 

没有select/激活:

 Sheets("Sheet2").Range("AD76").Copy Sheets("Sheet1").Range("I" & i + 1).PasteSpecial Paste:=xlPasteValues 

因为吃午饭的时候我很无聊,所以我决定重写代码,看看在删除所有Selection.之后会减less多lessSelection. 位(加上其他一些整理)。 我想出了这个:

 Sub SensitivityTest() With Sheets("Sheet1") For i = 8 To 11 .Range("D10").Value = .Range("G" & i + 1).Value .Range("D15").Value = .Range("G" & i + 1).Value 'This next line shouldn't be required if "AnotherMacro" was suitably changed 'to fully qualify all ranges, etc, being referred to Sheets("Sheet2").Select Call AnotherMacro 'Because the original code was pasting values, I have changed the 'code to just set the destination cell's Value equal to the 'source cell's Value. This avoids using the clipboard, which 'often leads to problems if the user is doing something else 'while a macro is running. .Range("H" & i + 1).Value = Sheets("Sheet2").Range("Q76").Value .Range("I" & i + 1).Value = Sheets("Sheet2").Range("AD76").Value .Range("J" & i + 1).Value = Sheets("Sheet2").Range("Q20").Value .Range("K" & i + 1).Value = Sheets("Sheet2").Range("AD20").Value .Range("L" & i + 1).Value = Sheets("Sheet2").Range("Q27").Value .Range("M" & i + 1).Value = Sheets("Sheet2").Range("AD27").Value .Range("N" & i + 1).Value = Sheets("Sheet2").Range("Q28").Value .Range("O" & i + 1).Value = Sheets("Sheet2").Range("AD28").Value .Range("Q" & i + 1).Value = Sheets("Sheet2").Range("V76").Value .Range("R" & i + 1).Value = Sheets("Sheet2").Range("AI76").Value .Range("S" & i + 1).Value = Sheets("Sheet2").Range("V20").Value .Range("T" & i + 1).Value = Sheets("Sheet2").Range("AI20").Value .Range("U" & i + 1).Value = Sheets("Sheet2").Range("V27").Value .Range("V" & i + 1).Value = Sheets("Sheet2").Range("AI27").Value .Range("W" & i + 1).Value = Sheets("Sheet2").Range("V28").Value .Range("X" & i + 1).Value = Sheets("Sheet2").Range("AI28").Value Next i 'Include a final select of Sheet1, just to get around the effect of 'doing the Select of Sheet2 during the macro. This wouldn't be 'needed if AnotherMacro was similarly tidied up to not require 'Sheet2 to be Selected before running. .Select End With End Sub 

我发现这容易阅读,因此在必要时维护和debugging将变得更容易。

PS所有的i + 1语句可以改变只是i如果循环改变从For i = 8 To 11For i = 9 To 12

PPS我的猜测是,为什么你的代码有时工作,有时候并不是你的代码依赖于Sheet1 ,当你调用这个macros的时候,它就是活动工作表。 如果Sheet2是活跃的,它几乎肯定不会做你想做的事情。

谢谢大家的帮助! 当我在星期五运行以下代码时,它在最后几行卡住了,并且相同的结果不断重复。 但是当我让它下class后跑,而不是在电脑上做其他事情,它的工作!

Sub SensitivityTest()

 With Sheets("Sheet1") For i = 9 To 40 .Range("D10").value = .Range("G" & i).value .Range("D15").value = .Range("G" & i).value Call AnotherMacro .Range("H" & i).value = Sheets("Sheet2").Range("Q76").value .Range("I" & i).value = Sheets("Sheet2").Range("AD76").value .Range("J" & i).value = Sheets("Sheet2").Range("Q20").value .Range("K" & i).value = Sheets("Sheet2").Range("AD20").value .Range("L" & i).value = Sheets("Sheet2").Range("Q23").value .Range("M" & i).value = Sheets("Sheet2").Range("AD23").value .Range("N" & i).value = Sheets("Sheet2").Range("Q28").value .Range("O" & i).value = Sheets("Sheet2").Range("AD28").value .Range("Q" & i).value = Sheets("Sheet2").Range("V76").value .Range("R" & i).value = Sheets("Sheet2").Range("AI76").value .Range("S" & i).value = Sheets("Sheet2").Range("V20").value .Range("T" & i).value = Sheets("Sheet2").Range("AI20").value .Range("U" & i).value = Sheets("Sheet2").Range("V23").value .Range("V" & i).value = Sheets("Sheet2").Range("AI23").value .Range("W" & i).value = Sheets("Sheet2").Range("V28").value .Range("X" & i).value = Sheets("Sheet2").Range("AI28").value Next i End With 

结束小组