2017-03-20 60 views
0

我试图让一个宏(按钮单击)将值粘贴到另一个表中,如果该值不是公式。我没有得到任何与下面的错误,但功能不会触发。预先感谢您的帮助!基于索引匹配的粘贴值

Sub Update_Numbers(ByVal Target As Range) 

' Update_Numbers Macro 
' 
' Keyboard Shortcut: Ctrl+j 

On Error GoTo Safe_Exit 
    Application.EnableEvents = False 

Select Case Target.Address(0, 0) 

Case Sheets("Wage Run").Range("B7") 
    If Target.HasFormula = False Then _ 
     Sheets("wage run").Range("B7").Copy 
     Sheets("With Changes").Select 
     Range(Application.WorksheetFunction.Index(Sheets("With Changes").Range("E2:AB138"), Application.WorksheetFunction.Match(Sheets("Wage Run").Range("D1"), Sheets("With Changes").Range("A2:A138"), 0), 1)).Select 
     ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
End Select 

Safe_Exit: 
Application.EnableEvents = True 

End Sub 

编辑:改变与下面的建议,但它仍然不会触发。

Sub Update_Numbers(ByVal Target As Range) 
With Sheets("wage run") 
' Update_Numbers Macro 
' 
' Keyboard Shortcut: Ctrl+j 

On Error GoTo Safe_Exit 
Application.EnableEvents = False 

Select Case Target.Address(0, 0) 


Case "B7" 
If Target.HasFormula = False Then 
    Sheets("wage run").Range("B7").Copy 
    Sheets("With Changes").Select 
    Range(Application.WorksheetFunction.Index(Sheets("With Changes").Range("E2:AB138"), Application.WorksheetFunction.Match(Sheets("Wage Run").Range("D1"), Sheets("With Changes").Range("A2:A138"), 0), 1)).Select 
    ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,  SkipBlanks _ 
    :=False, Transpose:=False 
End If 
End Select 

Safe_Exit: 
Application.EnableEvents = True 

End Sub 
+0

把你的错误检查出来,你会明白为什么,目标是什么。 –

+0

除非您通过另一个调用此函数的子函数向子函数提供范围,否则它将不执行任何操作,因为除非它是允许的其中一个工作表事件,否则Target不会自动设置,只需将其放在括号中即可实现它。它在'Select Case Target.Address(0,0)'处导致错误,因为Target没有任何内容,没有地址。取出'On Error GoTo Safe_Exit Application.EnableEvents = False'。现在你正在跳过一切,因为错误控制将它发送到最后。 –

+0

我很困惑,因为我在另一个工作表中有类似的代码。如果Target.Cells.Count> 1然后退出Sub On Error转到Safe_Exit Application.EnableEvents = False If Application.Intersect(Target,Range(“$ B $ 1:$ C $ 1”))Nothing Nothing Then 范围( “B8”)。式= salaries2 结束如果 选择事例Target.Address(0,0) 案例 “B1” Target.Offset(0,1).ClearContents 案 “B8” 如果IsEmpty(Target)然后_ Target.Formula = salaries2' –

回答

0

除了上面@Scott克拉纳的评论:请注意,“如果 - 那么”结构不需要任何相应的“结束如果”当你对以下“然后”一条线只有一条语句。但是,如果If构造包含多个语句,则代码块必须以“End If”结尾。您在“Then”后立即有一个续行符号(_)。尝试删除这一点,包括END IF语句来代替,就像这样:

Select Case Target.Address(0, 0) 

Case Sheets("Wage Run").Range("B7") 
    If Target.HasFormula = False Then 
     Sheets("wage run").Range("B7").Copy 
     Sheets("With Changes").Select 
     Range(Application.WorksheetFunction.Index(Sheets("With Changes").Range("E2:AB138"), Application.WorksheetFunction.Match(Sheets("Wage Run").Range("D1"), Sheets("With Changes").Range("A2:A138"), 0), 1)).Select 
     ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    End If 
End Select 
+0

我认为这有助于,但公式仍然无法正常工作。 –

+0

“选择”和“With”(编辑后)语句未正确实施。 (既然你提到你想将宏连接到一个按钮,我怀疑你所需要的技术上是一个Sub过程而不是一个函数过程)。您可能想考虑改写问题以增加获得正确答案的机会,请参阅MCVE准则:https://stackoverflow.com/help/mcve – Egalth

0

除了上面我的意见,这里是似乎做你所要求的一个很小的例子,但没有任何其他方面。它在(至少)两张工作表上工作。也许有用作为一个起点。

Sub Macro1() 
' 
' Macro1 Macro 
' 

' Paste a value into another sheet if the value is not a formula. 

    Dim sourcecell As Range 
    Dim targetcell As Range 

    Set sourcecell = Sheets(1).Range("D8") 
    Set targetcell = Sheets(2).Range("D8") 

    If Not sourcecell.HasFormula Then targetcell = sourcecell 

End Sub