Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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 VBA:将ActiveCell移动到新非活动工作表的行_Vba_Excel - Fatal编程技术网

Excel VBA:将ActiveCell移动到新非活动工作表的行

Excel VBA:将ActiveCell移动到新非活动工作表的行,vba,excel,Vba,Excel,当我从Sheet1移动到Sheet2时,我可以使用什么样的VBA使Sheet2的activecell与我切换时Sheet1上的活动单元格位于同一行 例如:我在Sheet1上激活了单元格B7。当我切换到Sheet2时,activecell会移动到第7行(并且不会改变我上次在Sheet2上的列)。尽管这个问题得到了否决票,但它绝对不是无关紧要的。我只能研究部分答案 将以下代码附加到工作簿(在VBA项目资源管理器中双击此工作簿): 目的很明确:在要停用的工作表上获取选择,然后在要停用的工作表上设置选择

当我从Sheet1移动到Sheet2时,我可以使用什么样的VBA使Sheet2的activecell与我切换时Sheet1上的活动单元格位于同一行


例如:我在Sheet1上激活了单元格B7。当我切换到Sheet2时,activecell会移动到第7行(并且不会改变我上次在Sheet2上的列)。

尽管这个问题得到了否决票,但它绝对不是无关紧要的。我只能研究部分答案

将以下代码附加到工作簿(在VBA项目资源管理器中双击此工作簿):

目的很明确:在要停用的工作表上获取选择,然后在要停用的工作表上设置选择

只有两个问题:

  • Excel只有一个
    选择
    ,即活动工作表上的当前选择

  • 停用事件发生在工作表停用和新工作表启用之后

  • 因此,无法获取用户在已停用的工作表上的最后位置,因此我们无法将其设置在正在激活的工作表上


    有人有什么想法吗?

    在对事件序列进行了认真的调试之后,我说了声“尤里卡!”。以下内容符合您的要求:

    Private activeRow As Integer, activeCol As Integer
    Private sema4 As Integer
    
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        If (sema4 > 0) Then Exit Sub
        sema4 = 1
        Sheets(Sh.Name).Activate
    End Sub
    
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        If (sema4 = 1) Then
            activeRow = Selection.row
            activeCol = Selection.Column
            sema4 = 2
            Exit Sub
        ElseIf (sema4 = 2) Then
            sema4 = 3
            Sheets(Sh.Name).Activate
            Exit Sub
        ElseIf (sema4 = 3) Then
            ActiveSheet.Cells(activeRow, activeCol).Select
            sema4 = 0
        End If
    End Sub
    

    同样,在VB编辑器中附加到工作簿。

    谷歌会在3分钟后告诉你。我已经在谷歌上搜索了很多。我找不到答案。
    我在谷歌上搜索了很多。我找不到答案
    ,那一定意味着无法完成。抱歉:/@findwindow但这一个太棒了;)@mrbungle我应该把它作为一个答案来发布~^我从来没有这样做过,但是你能设置一个点击事件吗?这样每次选择一个新单元格时,列和行都以长的形式存储,然后当工作表更改事件发生时,你可以激活最后一个已知的。单元格(var,var)完美!非常感谢。附言:叫一个“旗子”是很搞笑的。我以前从未见过这种情况。
    sema4
    是信号灯的缩写,是一个标志杆。在这种情况下,它向事件处理程序发送状态信号。
    Private activeRow As Integer, activeCol As Integer
    Private sema4 As Integer
    
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        If (sema4 > 0) Then Exit Sub
        sema4 = 1
        Sheets(Sh.Name).Activate
    End Sub
    
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        If (sema4 = 1) Then
            activeRow = Selection.row
            activeCol = Selection.Column
            sema4 = 2
            Exit Sub
        ElseIf (sema4 = 2) Then
            sema4 = 3
            Sheets(Sh.Name).Activate
            Exit Sub
        ElseIf (sema4 = 3) Then
            ActiveSheet.Cells(activeRow, activeCol).Select
            sema4 = 0
        End If
    End Sub