수색…


응용 프로그램 통합 문서

많은 Excel 응용 프로그램에서 VBA 코드는 포함 된 통합 문서에 대한 작업을 수행합니다. 해당 통합 문서를 ".xlsm"확장명으로 저장하면 VBA 매크로는 워크 시트 및 데이터 내에서만 포커스를 둡니다. 그러나 다른 통합 문서의 데이터를 병합하거나 병합하거나 일부 통합 문서에 별도의 통합 문서를 작성해야하는 경우가 종종 있습니다. 많은 VBA 응용 프로그램에서 다른 통합 문서 열기, 닫기, 저장, 만들기 및 삭제가 필요합니다.

VBA 편집기에서 언제든지 Application 개체의 Workbooks 속성을 사용하여 해당 Excel 인스턴스에서 현재 열려있는 모든 통합 문서를보고 액세스 할 수 있습니다. MSDN 문서 에서 참조로 설명합니다.

ActiveWorkbook 및 ThisWorkbook을 사용하는시기

VBA 코드가 참조하는 통합 문서를 항상 지정하는 VBA 모범 사례입니다. 이 지정을 생략하면 VBA는 코드가 현재 활성 통합 문서 ( ActiveWorkbook )로 전달된다고 가정합니다.

'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415

그러나 여러 통합 문서를 동시에 열 때 특히 VBA 코드가 Excel 추가 기능에서 실행되는 경우 ActiveWorkbook 대한 참조가 혼란 스럽거나 잘못 지시 될 수 있습니다. 예를 들어 시간을 확인하고 추가 기능 워크 시트 중 하나 (일반적으로 사용자가 쉽게 볼 수없는)에 저장된 값과 비교하는 UDF가있는 추가 기능은 어떤 통합 문서가 참조되고있다. 이 예에서는 열려있는 (활성) 통합 문서의 A1 =EarlyOrLate() 셀에 수식이 있으며 해당 활성 통합 문서에 대해 작성된 VBA는 없습니다. 우리의 추가 기능에는 다음과 같은 UDF (User Defined Function)가 있습니다.

Public Function EarlyOrLate() As String
    If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then
        EarlyOrLate = "It's Late!"
    Else
        EarlyOrLate = "It's Early!"
    End If
End Function

UDF 용 코드는 작성된 Excel 추가 기능에 저장됩니다. "WatchTime"이라는 추가 기능의 워크 시트에 저장된 데이터를 사용합니다. UDF가 ThisWorkbook 대신 ActiveWorkbook 을 사용했다면 의도 한 통합 문서를 보장 할 수 없었습니다.

이미 열려있는 경우에도 A (신규) 통합 문서 열기

이미 열려있는 통합 문서에 액세스하려면 Workbooks 컬렉션에서 할당을 가져 오는 것이 간단합니다.

dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")

새 통합 문서를 만들려면 Workbooks 컬렉션 개체를 사용하여 새 항목을 Add 합니다.

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

필요한 통합 문서가 이미 열려 있거나 없거나 존재하지 않는 경우가 있거나 없어야 할 때가 있습니다. 예제 함수는 항상 유효한 통합 문서 개체를 반환하는 방법을 보여줍니다.

Option Explicit
Function GetWorkbook(ByVal wbFilename As String) As Workbook
    '--- returns a workbook object for the given filename, including checks
    '    for when the workbook is already open, exists but not open, or
    '    does not yet exist (and must be created)
    '    ***  wbFilename must be a fully specified pathname
    Dim folderFile As String
    Dim returnedWB As Workbook
    
    '--- check if the file exists in the directory location
    folderFile = File(wbFilename)
    If folderFile = "" Then
        '--- the workbook doesn't exist, so create it
        Dim pos1 As Integer
        Dim fileExt As String
        Dim fileFormatNum As Long
        '--- in order to save the workbook correctly, we need to infer which workbook
        '    type the user intended from the file extension
        pos1 = InStrRev(sFullName, ".", , vbTextCompare)
        fileExt = Right(sFullName, Len(sFullName) - pos1)
        Select Case fileExt
            Case "xlsx"
                fileFormatNum = 51
            Case "xlsm"
                fileFormatNum = 52
            Case "xls"
                fileFormatNum = 56
            Case "xlsb"
                fileFormatNum = 50
            Case Else
                Err.Raise vbObjectError + 1000, "GetWorkbook function", _
                         "The file type you've requested (file extension) is not recognized. " & _
                         "Please use a known extension: xlsx, xlsm, xls, or xlsb."
        End Select
        Set returnedWB = Workbooks.Add
        Application.DisplayAlerts = False
        returnedWB.SaveAs filename:=wbFilename, FileFormat:=fileFormatNum
        Application.DisplayAlerts = True
        Set GetWorkbook = returnedWB
    Else
        '--- the workbook exists in the directory, so check to see if
        '    it's already open or not
        On Error Resume Next
        Set returnedWB = Workbooks(sFile)
        If returnedWB Is Nothing Then
            Set returnedWB = Workbooks.Open(sFullName)
        End If
    End If
End Function

사용자에게 묻지 않고 통합 문서 저장

종종 VBA를 사용하여 기존 통합 문서에 새 데이터를 저장하면 파일이 이미 있음을 알리는 팝업 질문이 표시됩니다.

이 팝업 질문을 방지하려면 이러한 유형의 경고를 억제해야합니다.

Application.DisplayAlerts = False        'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True         're-enable user prompt to overwrite file

새 통합 문서에서 기본 워크 시트 수 변경

새 Excel 통합 문서에서 작성된 "초기 기본값"워크 시트 수는 일반적으로 3으로 설정됩니다. VBA 코드는 새 통합 문서에서 워크 시트 수를 명시 적으로 설정할 수 있습니다.

'--- save the current Excel global setting
With Application
    Dim oldSheetsCount As Integer
    oldSheetsCount = .SheetsInNewWorkbook
    Dim myNewWB As Workbook
    .SheetsInNewWorkbook = 1
    Set myNewWB = .Workbooks.Add
    '--- restore the previous setting
    .SheetsInNewWorkbook = oldsheetcount
End With


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow