热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VB如何跳出选择文件对话框?

PrivateDeclareFunctionFindWindowLibuser32AliasFindWindowA(_ByVallpClassNameA
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
        ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
        
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Private Const GWL_STYLE As Long = (-16)
Private Const WS_CAPTION As Long = &HC00000

Private Sub Form_Load()
       Dim hwnd&
    '  Dim xlApp As New excel.application'如果在工程中引用了EXCEL下句声明不要
       Dim xlApp As Object
        If IsFileOpen(App.Path & "\" & Dir("*.dll")) Then _
            MsgBox App.EXEName & " 文件已经打开!", vbInformation, "系统提醒:": GoTo ooo
        
        DoEvents
        
       Set xlApp = CreateObject("Excel.Application") '如果在工程中引用了EXCEL这句可不要
        
        xlApp.Workbooks.Open (App.Path & "\" & Dir("*.dll"))
        
        hwnd = FindWindow(vbNullString, xlApp.Caption)
        SetWindowLong hwnd, GWL_STYLE, IStyle
        DrawMenuBar hwnd
      
        xlApp.Visible = True
      ' xlApp.WindowState = xlMaximized '用createobject函数的话这两句要出错
      ' xlApp.ActiveWindow.WindowState = xlMaximized
         
        Set xlApp = Nothing
ooo:
        Unload Me
       End
End Sub

Function IsFileOpen(filename As String)
       Dim filenum As Integer, errnum As Integer
       On Error Resume Next
       filenum = FreeFile()
        
       Open filename For Input Lock Read As #filenum
       Close filenum
       
       errnum = Err
       On Error GoTo 0
       
       Select Case errnum
           Case 0
               IsFileOpen = False
           Case 70
               IsFileOpen = True
           Case Else
               Error errnum
       End Select
End Function


现在的源码是打开文件所在路径里面的文件,但是无法选择某个文件,
我的要求是打开对话框后选择文件,点击确定就可打开.
还有一个问题是,现在的源码打开excel文件后,蓝色标题被隐藏,应该删除那句代码?
×注(源码中的DLL文件是excel文件伪装的)

9 个解决方案

#1


 添加通用对话框吧

#2


部件里选择“Microsoft Common dialog control 6.0”

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub Form_Load()

        On Error GoTo ms:
        With Me.CommonDialog1
            .Filter = "所有文件|*.*"
            .ShowOpen
        End With
        
        Dim strFileName  As String
        strFileName = Me.CommonDialog1.filename
        If Len(strFileName) > 0 And Dir(strFileName) <> "" Then
            ShellExecute Me.hWnd, "Open", strFileName, vbNullString, vbNullString, 1
        End If
          
ms:
      
End Sub

#3


学习下

#4


可以试试excel VBA里的application.openfilename

dim fn as string
fn=xlApp.openfilename

#5


如果要求大部分系统都能有,就用api吧
很多系统没comdlg32.ocx,但comdlg32.dll肯定有的,我昨天正好研究过,搜了些代码


'========================打开/保存对话框 API 函数及结构===================
Private Type tagOPENFILENAME
   lStructSize As Long        '结构大小
   hwndOwner As Long          '
   hInstance As Long          '
   strFilter As String        '过滤器字符串
   strCustomFilter As String '选中的过滤器(过滤器索引所指的过滤器)字符串
   nMaxCustFilter As Long     '过滤器最大长度
   nFilterIndex As Long       '选中的过滤器索引,意义与 CommonDialog 控件相同
   strFile As String          '选中的全路径文件名
   nMaxFile As Long           '装载全路径文件名的字符串长度
   strFileTitle As String     '去掉了路径的文件名
   nMaxFileTitle As Long      '装载去掉了路径的文件名字符串长度
   strInitialDir As String    '去掉了文件名的路径(没有最后的反斜杠)
   strTitle As String         '对话框标题,意义与 CommonDialog 控件相同
   flags As Long              '标志,意义与 CommonDialog 控件相同
   nFileOffset As Integer     '路径长度(包括最后的反斜杠)
   nFileExtension As Integer '全路径文件名长度(不计算前面 3 个表示盘符的字符,如 D:\)
   strDefExt As String        '默认提取
   lCustData As Long          '
   lpfnHook As Long           '勾子函数地址
   lpTemplateName As String   '
End Type

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ofn As tagOPENFILENAME) As Boolean
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (ofn As tagOPENFILENAME) As Boolean


'返回选择的文件名。输入参数:
'1.对话框类型(0=保存,1=打开);2.对话框标题;3.过滤器字符串
'4.过滤器索引;5.标志;6.路径;7.文件名
Public Function CmdDlg(Optional ByVal DlgType As Boolean = True, _
   Optional ByVal DialogTitle As String, Optional ByVal Filter As String, _
   Optional FilterIndex As Long = 1, Optional flags As Long, _
   Optional ByVal InitialDir As String, Optional ByVal FileName As String, Optional ByRef hWnd As Long = 0) As String
  
On Error GoTo CmdDlg_Error
Dim ofn As tagOPENFILENAME
Dim fResult As Boolean
If InitialDir = "" Then InitialDir = CurDir
If Len(Filter) > 0 Then Filter = Replace(Filter, "|", vbNullChar) 'Filter以Chr(0)为分隔符

With ofn
   .lStructSize = Len(ofn)
   .hwndOwner = hWnd                                   '0为屏幕句柄
   .strFilter = Filter
   .nFilterIndex = FilterIndex
   .strFile = Left(FileName & String$(255, 0), 255)   '用空字符补足全路径文件名255字节
   .nMaxFile = 255                                    '全路径文件名长度
   .strFileTitle = String$(255, 0)                    '用空字符填充(去掉路径的)文件名
   .nMaxFileTitle = 255                               '(去掉路径的)文件名长度
   .strTitle = DialogTitle                            '对话框标题
   .flags = flags
   .strDefExt = ""
   .strInitialDir = InitialDir
   .hInstance = 0
   .strCustomFilter = String(255, 0)                  '用空字符填充选中的过滤器
   .nMaxCustFilter = 255                              '选中的过滤器长度
   .lpfnHook = 0
End With
If DlgType Then fResult = GetOpenFileName(ofn) Else fResult = GetSaveFileName(ofn)
If fResult Then
   CmdDlg = Left(ofn.strFile, InStr(ofn.strFile, vbNullChar) - 1)
   'FilterIndex = ofn.nFilterIndex                    '返回选中的过滤器索引
Else
   CmdDlg = vbNullChar
End If
CmdDlg_Error:
End Function


#6


本帖最后由 bcrun 于 2011-03-31 19:46:36 编辑
With CreateObject("MSComDlg.CommonDialog")
 .showopen
 If .FileName <> "" Then
  '在此加上选中文件的处理操作
 End If
End With

#7


本帖最后由 bcrun 于 2011-03-31 19:47:00 编辑
vba code:
Application.GetOpenFilename
麻烦楼主结帖!!!

#8


通用对话框

#9


牛人,就如此简单!
引用 7 楼 fzx4936 的回复:
vba code:
Application.GetOpenFilename
麻烦楼主结帖!!!

推荐阅读
author-avatar
秋夜里的寂寞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有