1

我有一个宏,因此当您突出显示 sheet1 上的一行时,宏会从该行获取所有信息并在 sheet2 上自行显示。如果您在 sheet1 上突出显示不同的行,则 sheet2 上的信息将更改为显示该行的信息。

我的问题是,如果我更改 sheet2 上显示的信息,它不会更改 sheet1 上的信息。有没有办法可以添加这个功能?

我目前有以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim myList
If Target.Address <> Target.EntireRow.Address Then Exit Sub
If Target.Rows.Count > 1 Then Exit Sub
myList = [{"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15"}] '<- adjust to your need
With Target.EntireRow
    For i = 1 To UBound(myList)
        Sheets("sheet2").Range(myList(i)).Value = .Cells(i).Value
    Next
End With
End Sub

任何帮助都是极好的!:)

4

2 回答 2

0

将 sheet1 行复制到 sheet2 后,您还可以记录值来自的原始行 #。然后,您可以添加一个额外的宏,将 sheet2 值与 sheet1 中的值进行比较 - 然后可以迁移任何更改。

一个可能的基本流程:

  • 将 sheet1 行复制到 sheet2(当前宏)
  • 将 sheet1 行 # 复制到 sheet2 (即向下一行)
  • 在 sheet2 上进行更改
  • 将 sheet2 行复制到 sheet1 行(使用保存在 sheet2 上的行号)-> 这假设不会对 sheet1 进行任何更改。
于 2011-03-18T13:13:15.473 回答
0

您当前正在使用Worksheet_SelectionChange事件宏来识别何时选择了完整的单行。您需要一个Worksheet_Change事件宏,以便 Sheet2 识别 B1:B15 范围内的值何时已更改并将更改传递回 Sheet1。

因为 Worksheet_Change 是在值更改时触发的,所以您需要禁用Application.EnableEvents 属性,以便在从 Sheet1 的 Worksheet_SelectionChange 子中写入值时不会触发它。

您将需要几个公共变量。一个用来记住更改应该返回到的位置,另一个用来定位 Sheet2 上的目标单元格。这些只能在模块代码表中公开。

Book1 - Module1(代码)

Option Explicit

Public Const sRNG As String = "B1:B15"
Public rRNG As Range

我对您原来的 Worksheet_SelectionChange 做了一些小修改,并添加了禁用事件处理。

Book1 - Sheet1(代码)

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count = Columns.Count And Target.Rows.Count = 1 And _
      CBool(Application.CountA(Target)) Then   '<~~ one complete non-blank row 
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        With Sheet2.Range(sRNG)
            Set rRNG = Target.Cells(1, 1).Resize(.Columns.Count, .Rows.Count)
            .Cells = Application.Transpose(rRNG.Value)
        End With
    End If

bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

Worksheet .CodeName 属性用于标识Sheet2,因为如果按惯例重命名工作表,这不会改变。

有点不清楚您打算如何识别行以在更改值后将其返回。我使用了在 Module1 中声明的公共范围类型变量来记录值从 Sheet1 传输到 Sheet2 的最后位置。Sheet2 上的更改会将它们返回到最后记录的位置。

Book1 - Sheet2(代码)

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(sRNG)) Is Nothing Then
        Debug.Print rRNG.Address(0, 0, external:=True)
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        rRNG = Application.Transpose(Range(sRNG).Value)
    End If

bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

请注意,“记住”的位置仅在内存中。关闭和重新打开工作簿有效地将其“归零”。除非您从 Sheet1 中新加载了值,否则不要对 Sheet2 进行更改。

于 2016-02-15T02:04:59.937 回答