수색…
응용 프로그램 통합 문서
많은 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