2017-12-25 17 views
0
을 만들어
Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$D$10" Then 
     Call mymacro 
    End If 
End Sub 

질문은 :엑셀 VBA를 전송 새로 작업 시트

  1. 나는 모듈에이 코드를 저장할 수 있습니까? 코드 모듈에서 새로 만든 워크 시트
  2. 로 코드 전송을 할 수있는 방법을 내가 어떻게이 코드를 시트 미리 감사를 추가 할 때마다 전송할 수없는 경우
+0

[Excel vba가 프로그래밍 방식으로 시트 모듈에 코드를 추가 할 수 있음] (https://stackoverflow.com/questions/34837006/excel-vba-add-code-to-sheet-module-programmatically) – QHarr

+0

tryed that that one 하지만 wooorkbook에없는 추가 워크 북을 작성하고 코드를 조작하려고합니다.이 워크 북에만 적용되지만 잠금은 작동하지 않습니다. 메신저 그냥 vba에 새로 시작하고, 다시 고마워 –

+0

나는 아래 예제를 주셨습니다. – QHarr

답변

0

예를 들어 @davesexcel은 이전에 이런 방식으로 시도한 적이 없었습니다. 이 코드는 메인 모듈에서 호출 할 수있는 표준 모듈에 들어갑니다. VBA 확장성에 참조를 추가하고 신뢰할 수있는 vb 모델에 액세스 할 수 있어야합니다.

Public Sub AddWorksheetEventCode() 
'Tools > references > Microsoft Visual Basic for Applications Extensibility 5.3 
'Trust access to VBA model 

    Dim wb As Workbook 
    Dim wsNew As Worksheet 

    Set wb = ThisWorkbook 

    Dim xPro As VBIDE.VBProject 
    Dim xCom As VBIDE.VBComponent 
    Dim xMod As VBIDE.CodeModule 
    Dim xLine As Long 

    wb.Worksheets.Add After:= wb.Worksheets(ActiveSheet.Index) 
    Set wsNew = ActiveSheet 

    With wsNew 
     Set xPro = wb.VBProject 
     Set xCom = xPro.VBComponents(wsNew.Name) 
     Set xMod = xCom.CodeModule 

     With xMod 

      xLine = .CreateEventProc("Change", "Worksheet") 
      xLine = xLine + 1 
      .InsertLines xLine, "If Target.Address = ""$D$10"" Then " 
      xLine = xLine + 1 
      .InsertLines xLine, "Call mymacro" 

     End With 

    End With 

End Sub 

VBA를 프로젝트 개체 모델에 Trust access 사용 :

  1. 파일을 클릭 한 다음 옵션을.
  2. 탐색 창에서 보안 센터를 선택합니다.
  3. 보안 센터 설정 ...을 클릭하십시오.
  4. 탐색 창에서 매크로 설정을 선택하십시오.
  5. VBA 프로젝트 개체 모델에 대한 트러스트 액세스가 선택되어 있는지 확인하십시오.
  6. 확인을 클릭하십시오.

** 적절한 경우 vba 프로젝트 모델에 대한 액세스 권한을 확인하십시오.

0

같은
  • Private Sub Worksheet_Change(ByVal Target As Range) 
    
    If Target.Address = "$D$10" Then 
    
        Call mymacro 
        Me.Copy after:=Sheets(Sheets.Count) 
        ActiveSheet.Cells.Clear 
    End If 
    End Sub 
    
  • 6

    Workbook_SheetChange 이벤트를 사용할 수 있습니다. 통합 문서 모듈에 코드를 삽입하십시오. 그렇다면 코드를 복사 할 필요가 없습니다. 특정 시트에서 실행 코드를 방지해야하는 경우

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
        If Target.Address = "$D$10" Then 
         Call mymacro 
        End If 
    End Sub 
    

    편집 당신은

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    
    Dim shArr() As Variant 
    
        'Example, mymacro will not run on the sheets "Overview" and "Total" 
        shArr = Array("Overview", "Total") 
    
        If Not IsInArray(Sh.Name, shArr) Then 
         If Target.Address = "$D$10" Then 
          Call mymacro 
         End If 
        End If 
    
    End Sub 
    
    0

    내가 가진에 Workbook_SheetChange 이벤트를 때라도 기능

    Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
        On Error Resume Next ' Invalid Parameters passed, IsInArray will be defaulted to FALSE 
        IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
    End Function 
    

    를 추가하고 변경할 수 있습니다 내가 그것을 몰랐기 때문에 up-voted @ Storax 대답. 그러나 Workbook_SheetChange 이벤트는 모두 시트에 발생하며 매크로를 실행하지 않을 위치를 포함 할 수 있음을 명심해야합니다. 따라서 매크로가 원하지 않는 곳에 이벤트가 트리거 될 때 매크로가 조치를 취하지 못하도록 코드를 추가해야합니다.

    대신 시트를 만드는 방법을 살펴보십시오. insert 새 시트를 새로 추가하면 완전히 비어 있지만 "이동 또는 복사/사본 만들기"(또는 해당 VBA 해당)를 사용하면 코드를 포함하여 원본 사본 인 새 시트가 생성됩니다.추가 장점은 완전히 포맷 된 시트를 얻는 것이고이 프로세스에서 복사 된 모든 데이터를 정리하는 것은 일반적으로 매우 쉽습니다.

    +0

    특정 시트에서 코드가 실행되지 않도록하려면 isInArray 함수를 추가하면됩니다. 나는 내 대답을 편집했다. – Storax