如何在Excel中通过宏代码显示的单元格中编辑信息?

时间:2011-03-18 13:07:37

标签: excel excel-vba excel-2010 vba

我有一个宏,所以当你在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

任何帮助都会很棒! :)

2 个答案:

答案 0 :(得分:0)

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

可能的基本流程:

  • 将sheet1行复制到sheet2(当前宏)
  • 将sheet1 row#复制到sheet2(即向下一行)
  • 在sheet2上进行更改
  • 将sheet2行复制到sheet1行(使用保存在sheet2上的行#) - &gt;这假设不会对sheet1进行任何更改。

答案 1 :(得分:0)

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

由于Worksheet_Change是在值更改时触发的,因此当您从Sheet1的Worksheet_SelectionChange子句写入值时,您需要禁用Application.EnableEvents property,以便触发。

您将需要几个公共变量。一个要记住应该返回更改的位置,另一个用于在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

工作表.CodeName property用于识别 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进行更改。