Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择范围时避免焦点更改--Excel_Excel_Vba - Fatal编程技术网

选择范围时避免焦点更改--Excel

选择范围时避免焦点更改--Excel,excel,vba,Excel,Vba,我有一个宏,它根据一些条件从一个给定范围创建一个子范围。 然后在某个位置复制此子范围,在该位置形成图表读取的数据 每次单击微调器时都会调用宏,因为这会更改原始范围,因此需要计算新的子范围 该过程运行良好,但可能非常原始(第一次使用VBA Excel进行编码)。只有一点,当我单击微调器更新数据并启动例程时,工作表的“焦点”从按钮位置移动到宏工作范围的开始 我通过在例程结束时使用Application.Goto将窗口的左上角恢复到图表和按钮所在的位置来克服这个问题 但是,这意味着每次运行宏时,窗口内

我有一个宏,它根据一些条件从一个给定范围创建一个子范围。 然后在某个位置复制此子范围,在该位置形成图表读取的数据

每次单击微调器时都会调用宏,因为这会更改原始范围,因此需要计算新的子范围

该过程运行良好,但可能非常原始(第一次使用VBA Excel进行编码)。只有一点,当我单击微调器更新数据并启动例程时,工作表的“焦点”从按钮位置移动到宏工作范围的开始

我通过在例程结束时使用Application.Goto将窗口的左上角恢复到图表和按钮所在的位置来克服这个问题

但是,这意味着每次运行宏时,窗口内容都会移动到所需的范围,然后返回到所需的位置。除了可能引起一些晕船之外,这并不太优雅;-)

我想知道我是否可以避免,以及如何避免

感谢您的任何输入,代码如下

Sub test_copy2()
Dim InRange As Range
Dim c As Range, o As Range, t As Range
Dim r As Integer
Set InRange = Cells.Range("M434:ATF434")
Set o = Cells.Range("L434")
For Each c In InRange
If c.Offset(-219, 0).Value = 8448 Then
   Set t = Application.Union(o, c)
   Set o = t
End If
Next c
o.Copy
InRange(1, 1).Offset(2, -1).PasteSpecial (xlPasteValues)
Application.Goto Cells.Range("AF456"), Scroll:=True
End Sub
也许:

Sub test_copy2()
Dim InRange As Range
Dim c As Range, o As Range, t As Range
Dim r As Integer
Set InRange = Cells.Range("M434:ATF434")
Set o = Cells.Range("L434")
Application.ScreenUpdating = False
    For Each c In InRange
        If c.Offset(-219, 0).Value = 8448 Then
           Set t = Application.Union(o, c)
           Set o = t
        End If
    Next c
    o.Copy
    InRange(1, 1).Offset(2, -1).PasteSpecial (xlPasteValues)
    Application.Goto Cells.Range("AF456"), Scroll:=True
Application.ScreenUpdating = True
End Sub

正如我所提到的,您可以避免使用
Way1
中所示的
pastespecial
,或者如果需要值,则使用
Way2中所示的代码替换它

o.Copy
InRange(1, 1).Offset(2, -1).PasteSpecial (xlPasteValues)
方式1

o.Copy in范围(1,1)。偏移量(2,-1)

方式2


InRange(1,1).偏移量(2,-1).调整大小(o.Rows.Count,o.Columns.Count).Value=o.Value

是否需要
Pastespecial
?如果没有,则使用此选项,将不会发生移位。
o.Copy InRange(1,1)。Offset(2,-1)
感谢您的回复。我不太明白你的问题。一旦我“评估”了所需的范围,即我知道哪些单元格满足标准,那么我需要“物理”地将这些单元格放在工作表的其他地方,因为它们是我希望显示的数据集。请参见下面的答案:)谢谢Siddhart,我也会尝试方法2,但我想这会改变我的输入范围,对吗?我不想那样。只需从现有范围创建/另一个/子范围。不过,原则上,我想我能理解你的观点。如果我足够聪明和精通,我就不需要在任何地方复制子范围,只要使用它。也许可以使用此子范围作为我的x值,使用另一个子范围作为我的y值来更新图表。