首页 文章

Excel VBA如何填充不同工作表中的值

提问于
浏览
1

我有一张工作表,我希望能够将用户双击的单元格值传输到另一个名为JE的工作表/表单 .

Example :用户单击工作表JE中的单元格F10,将用户带到另一个工作表(包含宏),一旦用户在该工作表上,我希望用户能够双击A列中的任何单元格并且单击单元格值,将单元格F10填回页面JE中 . 因此,在导航到宏/不同工作表后,如果用户双击单元格A7并且值"123ABC"在A7中,我希望"123ABC"填充工作表JE中的单元格F10 . 同样,如果用户在工作表JE上单击单元格F25,并仍然选择在另一个工作表中双击A7,我希望值"123ABC"在工作表JE中填充F25 . 一旦值存在于单元格中,我还希望F列中的单元格转为无填充背景 .

我现在遇到的问题是我的代码设置方式使得无论用户在工作表JE上使用哪一行,宏A列中的值仅填充F列中的第一个单元格(F7)然而,我希望在宏中双击该值以填充活动的F列单元格,而不是F列中的第一个单元格 . 此外,双击时,宏A列中的值不会将F列中红色单元格的背景颜色更改为无填充白色背景 .

此代码是与表JE关联的代码(用户填写的主要表单)

Option Explicit
Public sourceRange As Range

Private Sub Worksheet_Change(ByVal Target As Range)
'  If Not Intersect(Target, Range("C7:D446")) Is Nothing Then
      Dim c As Range: Set c = Range("D7:D446")
'     For Each c In Target
 For Each c In c.Cells
          Select Case c.Value
              Case "1000GP", "1000MM", "19FEST", "20IEDU", "20ONLC", "20PART", "20PRDV", "20SPPR", "22DANC", "22LFLC", "22MEDA", "530CCH", "60POUBL", "74GA01", "74GA17", "74GA99", "78REDV"
                  Cells(c.Row, "F").Interior.ColorIndex = 3
              Case Else
                 Cells(c.Row, "F").Interior.ColorIndex = 0
          End Select
      Next c
' End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Set sourceRange = Nothing ' Set it to nothing to avoid too long remembering
  If Target.Column = 6 And Target.Cells.Count = 1 And Target.Interior.ColorIndex = 3 Then
      Set sourceRange = Target ' Remember source cell
      'Cancel = True
      Select Case Target.Offset(0, -2).Value2
        Case "1000GP": gotoref1
        Case "1000MM": gotoref2
        Case "19FEST": gotoref3
        Case "20IEDU": gotoref4
        Case "20ONLC": gotoref5
        Case "20PART": gotoref6
        Case "20PRDV": gotoref7
        Case "20SPPR": gotoref8
        Case "22DANC": gotoref9
        Case "22LFLC": gotoref10
        Case "22MEDA": gotoref11
        Case "530CCH": gotoref12
        Case "60PUBL": gotoref13
        Case "74GA01": gotoref14
        Case "74GA17": gotoref15
        Case "74GA99": gotoref16
        Case "78REDV": gotoref17
      End Select
End If

End Sub

这是在单击Sheet JE中F列中的单元格时用户所带的所有宏表中的代码 .

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Set JE.sourceRange = Target.Value
If Target.Column = 1 Then
   If Not JE.sourceRange Is Nothing Then
        JE.sourceRange.Value = ActiveCell.Value
        Cells(c.Row, "F").Interior.ColorIndex = 0

End If
End If
End Sub

我也无法获取C列的值来填充多行 . 例如,如果我已经在C7中有一个值,并且想要在工作表中单击一个值到C列,如果我单击一个值,它将覆盖C7中的值而不是填充单元格C8 . 这是我对该表的代码:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Column = 1 Then
'Sheet2.Range("F" & Target.Row & ":F" & Target.Row).Value = ActiveCell.Value
Sheet2.sourceRange.Value = ActiveCell.Value
Worksheets("JE").Activate
'Sheet2.Activate

'Cells(c.Row, "F").Interior.ColorIndex = 3
Cancel = True
End If
End Sub

2 回答

  • 1

    在用户切换到不同的工作表之前,您需要存储原始 Range 活动的somwhere . 然后你就可以写出那里的 Value 了 .

    怎么做:

    1)在工作表JE上添加公共变量(紧跟在Option Explicit行之后)

    Public sourceRange As Range
    

    2)在事件 Worksheet_SelectionChange 上工作表JE首先添加如果代码将变量设置为当前 Range - 请注意第一行设置变量为Nothing - 需要避免永远记住最后一个范围:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Set sourceRange = Nothing ' Set it to nothing to avoid too long remembering
      If Target.Column = 6 And Target.Cells.Count = 1 And Target.Interior.ColorIndex = 3 Then
          Set sourceRange = Target ' Remember source cell
          'Cancel = True
    

    3)现在很容易 - 只需在其他工作表上的双击事件中使用变量:

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Column = 1 Then
        If Not JE.sourceRange Is Nothing Then
            JE.sourceRange.Value = ActiveCell.Value
        End If
    

    请注意其余的代码应该保持原样 - 为了清楚起见,我只将片段放在需要更改的地方 .

  • 0

    您是否尝试过使用Target参数?它会告诉您双击的行和列,您可以使用它来更具体地构建范围 .

    Worksheets("JE").Range("F" & Target.Row & ":F" & Target.Row).Value = ActiveCell.Value
    

相关问题