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

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

例如 :用户单击工作表JE中的单元格F10,将用户带到另一个工作表(包含一个macros),一旦用户在该工作表上,我希望用户能够双击A列中的任何单元格和被单击的单元格值,将单元格F10填充回单JE中。 因此,在导航到一个macros/不同的表单后,如果用户双击单元格A7,并且值“123ABC”在A7中,我想用“123ABC”填充表单元格JE中的单元格F10。 类似地,如果用户单击表单JE上的单元格F25,并且仍然select双击另一个表单中的A7,我希望值“123ABC”填充表单JE中的F25。 我也希望列F中的单元格在单元格中存在值时变成无填充背景。

我现在遇到的问题是,我的代码是这样设置的,无论用户在JE表中使用哪一行,macrosA列中的值都只填充F列中的第一个单元格(F7)而我想要在macros中双击该值来填充活动的F列单元格,而不是F列中的第一个单元格。 此外,双击时,macrosA列中的值不会将列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 

这是位于所有macros表单中的代码,当用户单击Sheet JE中的F列中的单元格时,这些macros表单中的macros代码将被带到该macros表单中。

 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 

在用户切换到不同的工作表之前,您需要将somwhere原始的Range激活存储。 那么你将能够写下那里的价值。

怎么做:

1)在工作表JE上添加公共variables(紧跟Option Option Explicit)

 Public sourceRange As Range 

2)在Worksheet_SelectionChange表JE上的Worksheet_SelectionChange事件中,如果代码将variables设置为当前Range ,请首先添加 – 也请注意第一行的设置variables为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)现在很容易 – 只需在其他表中双击事件使用variables:

 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 

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

你有没有尝试过使用目标参数? 它会告诉你被双击的行和列,你可以使用它来更具体地构build范围。

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