Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免在另一个Excel文件中运行宏_Excel_Vba_Private Methods - Fatal编程技术网

避免在另一个Excel文件中运行宏

避免在另一个Excel文件中运行宏,excel,vba,private-methods,Excel,Vba,Private Methods,这段代码与一个.xlsm文件相关联,比如说,X。当我打开X文件,然后打开第二个文件Y时,当Y中按delete或backspace时,X中的宏也会进入Y。此外,如果我打开X和Y,然后关闭X,但Y仍然打开-如果我在Y中按delete或backspace,X文件将自动打开。所以,我想避免这种情况,我希望X中的代码只在X中运行。希望不会太混乱 Private Sub Worksheet_Change(ByVal Target As Range) Dim TestCell Dim RE As Objec

这段代码与一个.xlsm文件相关联,比如说,X。当我打开X文件,然后打开第二个文件Y时,当Y中按delete或backspace时,X中的宏也会进入Y。此外,如果我打开X和Y,然后关闭X,但Y仍然打开-如果我在Y中按delete或backspace,X文件将自动打开。所以,我想避免这种情况,我希望X中的代码只在X中运行。希望不会太混乱

Private Sub Worksheet_Change(ByVal Target As Range)

Dim TestCell
Dim RE As Object
Dim REMatches As Object
Dim Cell1_1 As String
Dim Today As String
Dim Cell As String

ThisRow = Target.Row

With Worksheets("Input")
Application.OnKey "{DELETE}", "CleanCell1_1"

Application.OnKey "{BACKSPACE}", "CleanCell1_1"
End With

If Target.Column = 9 Then

Application.ScreenUpdating = False

ActiveSheet.Unprotect
Columns("I:I").Columns.AutoFit
Sheets("Input").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True
    Sheets("Input").EnableSelection = xlUnlockedCells

Sheets("Chart").Unprotect
Sheets("Chart").Columns("B:B").Columns.AutoFit
Sheets("Chart").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Sheets("Chart").EnableSelection = xlNoRestrictions

Application.ScreenUpdating = True

End If

If Target.Column = 10 Then

Set RE = CreateObject("vbscript.regexp")

With RE
    .MultiLine = False
    .Global = False
    .IgnoreCase = True
    .Pattern = "[G,g,Y,y,R,r]"
End With

For Each TestCell In Target.Cells

Set REMatches = RE.Execute(TestCell.Value)

If REMatches.Count > 0 And Len(Target.Value) = 1 Then
    If Len(Cells(1, 1).Value) = 1 Then
        Today = Now()
        Cell1_1 = Sheets("Input").Cells(1, 1).Value
        Range("K" & ThisRow) = Cell1_1 + ": " + Format(Today, "ddmmmyy")
    End If

ElseIf Target.Value <> vbNullString Then
     Row = Target.Row
     Cells(Row, 10).Value = vbNullString
     MsgBox "Please, type only:" & vbNewLine & vbNewLine & "G for Green" & vbNewLine & "Y for Yellow" & vbNewLine & "R for Red"

End If

Next

End If

End Sub

当X工作簿处于活动/非活动状态时,我将激活/停用Application.OnKey 这样地: 在此工作簿中:

Private Sub Workbook_Activate() 
    Application.OnKey "{DELETE}", "CleanCell1_1"
    Application.OnKey "{BACKSPACE}", "CleanCell1_1"
End Sub

Private Sub Workbook_Deactivate() 
    Application.OnKey "{DELETE}", ""
    Application.OnKey "{BACKSPACE}", ""
End Sub

是否通过VBA打开了书Y?还是你在手动打开书?手动。正常双击!我喜欢西福的回答,似乎很合适。我唯一要补充的另一个建议是在Excel的新实例中打开Booky。因此,转到Start->Programs->Excel打开一个单独的实例,并将文件拖放到该实例上。这有点麻烦,但它让我把事情分开。问题是有几个人打开了那个文件。所以我不能告诉每个人去做。我只是想让x工作簿宏在其内部运行。你好,西弗。谢谢!但是,这并没有真正起作用。我要把它粘贴到工作簿X中吗?嗨,西弗。我把你的小费和另一个花招一起用了。我用了一种捷径和它在一起。我还使用了一个模块:如果ActiveWorkbook.Name=Name.xlsm,则调用CleanCell1\u 1