2021년 7월 13일 화요일

vba로 새창 띄우기

 일반적으로 vba에서 새창을 띄우는 명령어를 사용하면, 


workbook.add 


계속 vba 창이 떠있는 경우, 새로 열린 창에서 내용 수정이 되지 않는다 (락이 걸린상태처럼)


그래서 vba 창을 계속 켜놓은 상태로 새창을 실행하고 거기서 문서 편집을 해야할 경우, 아예 새창을 여는 코드를 사용해야하는데 그때 아래 코드를 사용하면 새창이 뜬다. 


Dim xlAdd As Object
 Set xlAdd = CreateObject("Excel.Application")
 Filename = ThisWorkbook.Name
Total = Workbooks(Filename).Worksheets.Count
xlAdd.Visible = True
xlAdd.Workbooks.Add


문제는 새창에 현재 vba 내 변수들을 저장할 때인데, 새창을 열고 activesheet를 선택한 후에 붙여넣어도, 현재 vba창이 속한 엑셀에 붙여넣어진다. 

vba 창은 계속 실행중이며, 새창은 vba가 속한 엑셀과는 완전히 다른 창이기 때문에 호환이 되지 않는다. 

그렇다면, vba창을 계속 실행하면서, 새창을 띄워 계산결과를 붙여넣으려면 어떻게 해야할까!! 

해결이 되면 추가하겠다. 

해결함. 해결방식은

1) 엑셀 시트를 만들어서 복사 (새창 ㄴㄴ)하고 저장하고 닫기.

2) 새창을 띄움.

3) 새창에서 저장된 파일 열기. 

Public Sub print_callExcel()
Dim Newfilename As String
Dim xlAdd As Object
Set xlAdd = CreateObject("Excel.Application")
Dim c As Integer

ThisFilename = ThisWorkbook.Name
fileloc = ThisWorkbook.FullName
Newfilename = FileSequence(ThisWorkbook.Path & "\case.xlsx")

Workbooks.Add
Workbooks(ThisFilename).Worksheets.Copy before:=ActiveWorkbook.Sheets(1)
Workbooks(Workbooks.Count).SaveAs Newfilename
ActiveWorkbook.Close

xlAdd.Visible = True
xlAdd.Workbooks.Open Newfilename
End Sub


그리고 1)번 과정에서 임의의 이름으로 저장하기 때문에 자동으로 저장되게 하기 위해 filesequence라는 함수를 사용했다. 코드는 아래에 있음. 그대로 붙여넣으면 같이 사용됨. 

[출처 : 오빠두엑셀 블로그] 


Private Function FileSequence(FilePath As String, Optional Sequence As Long = 1, Optional Delimiter As String = "-") As String
 
Dim Ext As String: Dim Path As String: Dim newPath As String
Dim Pnt As Long
 Pnt = InStrRev(FilePath, ".")
Path = Left(FilePath, Pnt - 1)
Ext = Right(FilePath, Len(FilePath) - Pnt + 1)
 newPath = Path & Delimiter & Sequence & Ext
 Do Until FileExists(newPath) = False
    Sequence = Sequence + 1
    newPath = Path & Delimiter & Sequence & Ext
Loop
 FileSequence = newPath
 End Function

Public Function FileExists(ByVal path_ As String) As Boolean
 '########################################################
'입력한 파일경로에 파일 존재여부를 확인합니다.
'https://www.oppadu.com/vba-fileexists-함수/
'########################################################
     FileExists = (Dir(path_, vbDirectory) <> "")
 End Function


이렇게 하면 매번 파일이 된다는 단점이 있지만, 그래도 복사된 파일을 바로바로 확인하고 수정할 수 있다! 

2021년 7월 12일 월요일

엑셀 켤 때마다 새창으로 열기

엑셀을 이용할 때 한창에서 여러개의 파일을 봐야할때 매우 불편하다. 
특히, 듀얼 모니터 사용할때 하나를 보면서 다른 파일을 수정할때!

가장 간단한 방법은 엑셀을 켤때 shift를 누르고 더블클릭하면 새창으로 뜬다. 

하지만, 레지스트리 수정을 해서 아예 매번 새창으로 뜨게 할수 있음. 

Win + R 키 (시작-실행) 을 눌러 실행 창을 띄운 후 


'regedit' 을 입력하여 레지스트리를 열어준다.


레지스트리 편집기가 뜨는데 외쪽에서 "HKEY_CLASSES_ROOT"에 


xlsx 확장자는 "Excel.Sheet.12"
xls 확장자는 "Excel.Sheet.8"
xlsm확장자는 "Excel.SheetMacroEnabled.12" 폴더의




"ddeexec"폴더를 삭제하고

"command"폴더를 클릭




command 파일을 삭제하고 (기본값)파일을 우클릭하여 "수정" 클릭

기존에 다음과 같이 되어있는 것을 

/dde 부분을 /en "%1" 로 수정한다.














vba로 새창 띄우기

 일반적으로 vba에서 새창을 띄우는 명령어를 사용하면,  workbook.add  계속 vba 창이 떠있는 경우, 새로 열린 창에서 내용 수정이 되지 않는다 (락이 걸린상태처럼) 그래서 vba 창을 계속 켜놓은 상태로 새창을 실행하고 거기서 문서 편...