VBA 파일을 사용자 양식으로 끌어다 놓아 파일 이름 및 경로 가져오기
새로운 트릭을 배우고 싶지만, VBA에서 가능하다고 100% 확신할 수는 없지만, 여기 전문가에게 확인해봐야겠다고 생각했습니다.
제가 하고 싶은 것은 오래된 get open filename 또는 browser window(네트워크 드라이브에서 시작 디렉토리 세트를 가져오는 것이 정말 어려웠습니다)를 피하고 사용자가 데스크톱이나 브라우저 창에서 파일을 드래그 앤 드롭하여 VBA가 파일 이름과 경로를 로드할 수 있는 VBA 사용자 양식을 만들고 싶습니다.다시 말씀드리지만, 이것이 가능한지는 확실하지 않지만, 가능한지 또는 제가 조언을 해주기 전에 누군가가 그것을 해봤는지는 잘 모르겠습니다.사용자 양식을 설정하는 방법은 알고 있지만, 그 외에는 실제 코드가 없습니다.제가 제공할 수 있는 것이 있으면 알려주세요.
당신의 시간과 배려에 감사드립니다!
저는 이것을 달성할 방법을 찾았습니다.제가 알기로는 트리뷰 컨트롤을 사용해야만 가능합니다.도구 상자를 찾아서 추가하려면 도구 상자를 마우스 오른쪽 단추로 클릭해야 할 수 있습니다.그것은 "추가적인 통제" 또는 그와 유사한 것으로 그곳에 있을 것입니다.조종 외에 두 가지가 필요합니다.
에서UserForm_Initialize
sub 드래그 앤 드롭을 활성화하려면 다음 줄의 코드가 필요합니다.TreeView1.OLEDropMode = ccOLEDropManual
:
UserForm_Initialize()
TreeView1.OLEDropMode = ccOLEDropManual
End Sub
그러면 당신은 그것이 필요할 것입니다.Private Sub TreeView1_OLEDragDrop
공간 절약을 위해 모든 매개 변수를 생략했습니다.그것들은 찾기에 충분히 쉬울 것입니다.그 서브에서는 단순히 문자열을 선언합니다, 아마도.strPath
또는 파일 이름과 경로를 유지하고 설정하는 것과 유사한 것.strPath = Data.Files(1)
그러면 사용자가 TreeView 컨트롤로 끌어다 놓은 파일의 이름과 경로를 얻을 수 있습니다.여기서는 사용자가 한 번에 하나의 파일만 끌어다 놓는다고 가정하지만, 제가 알기로는 여러 개의 파일을 끌어다 놓으면 됩니다.
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
StrPath = Data.Files(1)
End Sub
편집: 다음에 대한 참조도 추가해야 합니다.Microsoft Windows Common Controls 6.0
샘플 코드도 추가했습니다.
이것이 오래된 실이라는 것을 압니다.미래의 독자들, 만약 당신이 멋진 UI를 찾고 있다면, 당신은 를 사용하여 샘플 데이터베이스를 위해 내 Github을 확인할 수 있습니다.NET 래퍼 dll.이를 통해 단순히 함수를 호출하고 파일 드래그 앤 드롭 기능으로 파일 대화 상자를 열 수 있습니다.결과가 JSONArray 문자열로 반환됩니다.
코드는 다음과 같이 단순할 수 있습니다.
Dim FilePaths As String
FilePaths = gDll.DLL.ShowDialogForFile("No multiple files allowed", False)
'Will return a JSONArray string.
'Multiple files can be opend by setting AllowMulti:=true
여기 보이는 것이 있습니다;
Application Event Workbook Open을 사용하여 작동하게 되었습니다.열려 있는 Excel 시트에 파일이 끌리면 Excel에서 해당 파일을 별도의 워크북으로 열려 위의 이벤트를 트리거합니다.조금 힘들긴 하지만 저는 이 링크 https://bettersolutions.com/vba/events/excel-application-level-events.htm 을 참고로 사용했습니다.
유일한 문제는 파일이 Excel 파일이 아닌 경우 팝업이 표시되고 팝업 주소를 지정할 때까지 이벤트가 실행되지 않기 때문에 VBScript를 실행하여 제거할 수 없다는 것입니다.내 코드의 일부는 다음과 같습니다.
Public WithEvents App As Application
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
Dim path, pathExt As String
path = Wb.Name
pathExt = Mid(path, InStrRev(path, "."))
If pathExt = ".pdf" Then
Application.DisplayAlerts = False
Workbooks(Wb.Name).Windows(1).Visible = False
Dim n As String
n = Wb.FullName
Wb.Close
Call DragnDrop.newSheet(n)
Application.DisplayAlerts = True
End If
End Sub
편집: 아래 코드를 모듈에 게시하여 응용 프로그램 이벤트를 초기화해야 한다는 것을 잊었습니다.
Option Explicit
'Variable to hold instance of class clsApp
Dim mcApp As clsApp
Public Sub Init()
'Reset mcApp in case it is already loaded
Set mcApp = Nothing
'Create a new instance of clsApp
Set mcApp = New clsApp 'Whatever you named your class module
'Pass the Excel object to it so it knows what application
'it needs to respond to
Set mcApp.App = Application 'mcApp.Whatever you named this Public
'WithEvents App As Application
End Sub
그런 다음 이 코드를 이 워크북 워크북_Open()에 붙여넣습니다.
'Initialize the Application Events
Application.OnTime Now, "'" & ThisWorkbook.FullName & "'!Init"
언급URL : https://stackoverflow.com/questions/20569959/vba-drag-and-drop-file-to-user-form-to-get-filename-and-path
'programing' 카테고리의 다른 글
ORA-0131 : 권한 부족 DEBUG CONNECT SESSION (0) | 2023.08.11 |
---|---|
스타일 시트 경로의 슬래시(/) 대 타일 슬래시(~/) (0) | 2023.08.11 |
Angular 4 프로젝트에서 실행 중인 원고 버전을 확인하는 방법 (0) | 2023.08.11 |
baselineAligned를 false로 설정하면 선형 레이아웃의 성능이 어떻게 향상됩니까? (0) | 2023.08.11 |
SELECT DISTINCT ON 쿼리를 Postgresql에서 MySQL로 변환하는 중 (0) | 2023.08.11 |