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 行