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

Posted

技术标签:

【中文标题】Excel VBA如何填充不同工作表中的值【英文标题】:Excel VBA how to populate values from different sheets 【发布时间】:2017-06-07 19:05:50 【问题描述】:

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

示例:用户点击工作表 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 列中的红色单元格的背景颜色更改为无填充的白色背景。

此代码是与sheet 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

【问题讨论】:

Worksheets("JE").Range("F:F").Value = ActiveCell.Value - 你真的想在整个 F 列中填充该值吗? ActivateCell 这里是什么? @TimWilliams 我不想把它填满整个专栏。只是用户正在使用的行。我试着看看会发生什么,但并没有得到我想要的结果。 @TimWilliams 在表单中单击单元格值以填充原始表单时,我仍然遇到一些问题。当我尝试单击多个值来填充原始表单的 C 列时,该值只会覆盖第一个值,留在单元格 C7 中。你知道我怎么能得到它,所以如果用户点击 C 列中的 3 个值,它将知道转到 C 列中的下一个可用行?我会在我的问题中发布我的代码。感谢您的帮助! C 列,还是 F 列?如果您希望能够通过单击多个值来填充,那么每当用户触发双击时,使用Set sourceRange = sourceRange.Offset(1, 0) 之类的东西将目标单元格向下移动一行 @TimWilliams C 专栏。我在双击事件下输入了该代码,它似乎不起作用。我希望能够在 C 列 (C7:C446) 中添加许多值。因此,如果我已经在单元格 C7 中有一个值,并且我还想在 C 列中添加更多值,我可以。截至目前,我只能向 C7 添加值。我不确定执行该语法的语法或将其代码片段放在何处。任何额外的帮助都会很棒。我意识到这可能是一个小问题,但我根本不熟悉 VBA。 【参考方案1】:

在用户切换到不同的工作表之前,您需要将原始Range 活动存储在某个位置。然后你就可以在那里写值了。

怎么做:

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

Public sourceRange As Range

2) 在工作表 JE 上的事件 Worksheet_SelectionChange 之后添加第一个 if 代码以将变量设置为当前 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

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

【讨论】:

当我双击“其他工作表”中 A 列中的值时,在宏中,我得到了 If Not JE.sourceRange Is Nothing Then 语句的 Object-Required。知道为什么吗?我的猜测是因为JE.sourceRange 没有设置任何东西? 宏(“其他表格”)中的代码如何改变JE表格中F列单元格的颜色?我在原始帖子中编辑的代码显示了我是如何尝试这样做的。您能否就我如何解决这个问题提供反馈? JE.sourceRange.Cells.Interior.ColorIndex = 0。如果您有 Object -Required message for line If Not JE.sourceRange Is Nothing Then 表示您的 JE Sheet 有不同的名称 - 在 VBA 编辑器中查看它在 VBA 中的命名方式 - 在输入 JE 和点 Intelli Sense 后应该建议 sourceRange【参考方案2】:

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

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

【讨论】:

宏表中的代码应该是我刚刚添加到原始代码中的代码吗? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 1 Then Worksheets("JE").Range("F" & Target.Row & ":F" & Target.Row).Value = ActiveCell.ValueCancel = True End If End Sub

以上是关于Excel VBA如何填充不同工作表中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何(如果可能)从 VBA Excel 2010 的工作表中定义和填充全局数组变量?

如何在仍可以更改工作表中的值的情况下在vba excel中执行Do Event计时器?

Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行

从 Access VBA 编辑打开的 Excel 工作表

如何使用Excel VBA仅更新特定工作表中的链接,而不是整个工作簿?

怎样将EXCEL工作表中某列数值小于一个数的行删除,或将工作表中某列数值大于一个数的行统计到另一个工作表