精华内容
下载资源
问答
  • 在用VBA操作文件和文件夹的过程中,除了新建文件夹,我们还经常需要与文件夹有个人机交互的过程,比如选择文件所在的文件夹,然后再执行一系列VBA动作。这个选择的过程也是打开文件夹的一种,这种在VBA里用内置的...

    89b89da597e01ee0e042d1696fd6e7d6.png

    在 VBA造文件夹的思考 一文中介绍了如何用vba代码新建文件夹。

    在用VBA操作文件和文件夹的过程中,除了新建文件夹,我们还经常需要与文件夹有个人机交互的过程,比如选择文件所在的文件夹,然后再执行一系列VBA动作。

    这个选择的过程也是打开文件夹的一种,这种在VBA里用内置的对话框对象FileDialog就可以实现。

    今天要讲的打开文件夹不是这种,而是指在完成了一系列VBA动作后,如何直接打开结果文件夹,看下执行的情况。

    以前我们往往都是执行完程序后,再用鼠标去打开结果文件夹看下结果,今天介绍的方法可以直接连这个鼠标步骤都免了。

    1.用Shell函数打开指定的文件夹

    代码如下:

    Sub exceloffice()    '*****************    '上面一连串代码    '最后打开文件夹看下效果    Dim sPath As String    sPath = "c:\test"    Shell "explorer.exe " & sPath, vbMaximizedFocusEnd Sub

    Shell函数是vba内置的函数,使用起来非常方便。它可以直接运行各种exe程序,同时附带参数运行。

    使用Shell函数还可以直接运行Python打包后的exe程序,从而借助Python的强大功能助推VBA

    在本例中,Shell函数通过调用文件资源管理器explorer.exe直接打开指定的文件夹,其中 vbMaximizedFocus表示打开的时候最大化显示。

    2.用Shell对象打开指定的文件夹

    代码如下:

    Sub exceloffice()    '*****************    '上面一连串代码    '最后打开文件夹看下效果    Dim sPath As String    sPath = "c:\test"    Dim oShell As Object    Set oShell = VBA.CreateObject("shell.application")    With oShell        .Open (sPath)    End WithEnd Sub

    其实这个原理和Shell是一样的,但是Shell对象提供了自动化接口,功能更全,不仅可以打开文件夹,还可以做很多操作电脑的事情。

    比如切换到桌面、打开运行对话框、关闭电脑等等,如下所示

    Sub exceloffice()

        Set oShell = CreateObject("shell.application")

        With oShell

            '切换到桌面

            .ToggleDesktop

            '打开运行对话框

            .FileRun

            '关闭电脑,记得保存文件

            .ShutdownWindows

        End With

    End Sub

    最后附上Shell对象的所有方法列表:

    方法说明
    AddToRecent添加一个对象到“最近的文档”的列表。
    BrowseForFolder创建一个对话框让用户选择一个文件夹,然后返回所选文件夹的Folder对象。
    CanStartStopService确定是否当前用户可以启动和停止指定的服务。
    CascadeWindows层叠桌面上所有窗口,相当于右击任务栏选择“层叠窗口”。
    ControlPanelItem运行指定的控制面板(*.cpl)应用程序。如果应用程序已经打开,它就会激活运行的实例。
    EjectPC挂起计算机。如果电脑支持这个命令。
    Explore在Windows资源管理器窗口中打开一个指定的文件夹。
    ExplorerPolicy获取指定的 Internet Explorer 策略的数据值。
    FileRun显示运行对话框。
    FindComputer显示“搜索结果:计算机”对话框。
    FindFiles显示“搜索:所有文件”对话框。
    FindPrinter显示“查找打印机”对话框允许用户找到打印机。
    GetSetting检索Shell全局设置。
    GetSystemInformation检索系统信息。
    Help显示Windows帮助和支持中心。
    IsRestricted从注册表检索一个组的限定设置。
    IsServiceRunning返回一个值,表示指定服务是否正在运行。
    MinimizeAll最小化桌面上所有窗口。
    NameSpace创建和返回指定的文件夹的Folder对象。
    Open打开指定的文件夹。
    RefreshMenu刷新开始菜单中的内容。只用于Windows XP之前的系统。
    ServiceStart启动一个指定的服务。
    ServiceStop停止一个指定的服务。
    SetTime显示“日期和时间属性”对话框。
    ShellExecute对指定文件执行指定的操作。
    ShowBrowserBar显示一个浏览器工具栏。
    ShutdownWindows显示“关闭计算机”对话框。
    Suspend不执行。
    TileHorizontally横向平铺桌面上所有窗口。
    TileVertically纵向平铺桌面上所有窗口。
    ToggleDesktop显示或隐藏桌面。
    TrayProperties显示“任务栏和「开始」菜单属性”对话框。
    UndoMinimizeALL撤消最小化所有窗口,恢复所有桌面窗口到它们在上次MinimizeAll命令之前相同的状态。
    Windows创建和返回一个ShellWindows对象。这个对象表示属于壳的所有打开的窗口的集合。
    WindowsSecurity显示“Windows安全”对话框。
    WindowSwitcherWindows Vista及以后系统的新增方法,在可以预览的3D堆栈中显示打开的窗口。

    f8d2edf2b967aee1f901e690df54e13e.png

    展开全文
  • 本文就Shell函数的用途做一些讲解,说明如何用Shell函数实现诸如打开文件、打开文件夹,复制文件、替换文件等功能。正 文:VBA中的Shell函数是一个功能强大简单易用的函数,但很多朋友只用它来简单的打开一个有绝对...

    时 间:2014-07-11 08:16:32

    作 者:摘 要:VBA中为我们提供了很多功能强大使用简单的函数,但一些函数的功能我们甚少使用,甚至根本不了解它们的相关用途。本文就Shell函数的用途做一些讲解,说明如何用Shell函数实现诸如打开文件、打开文件夹,复制文件、替换文件等功能。

    正 文:

    VBA中的Shell函数是一个功能强大简单易用的函数,但很多朋友只用它来简单的打开一个有绝对路径的可执行文件,其实它还有很多其它功能,很多可以从“开始菜单——运行”中执行的命令行都可以用Shell函数来完成。Shell函数有两个参数:pathname和Windowstyle,Windowstyle参数在帮助文档里面已经有了详细说明,这样就不再重复,主要讲一下pathname参数。

    在帮助文档里面关于pathname参数的说明如下:

    pathname必要参数。Variant(String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。

    我们可以看到,帮助里的说明过于简略,甚至有些语焉不详,让人很难理解。一般也就用它来运行可执行文件,类似于Shell “C:\test.exe”这样简单的使用一下。下面就讲一下pathname参数的详细使用方法。

    1、运行可执行程序(扩展名为.exe)

    对于普通可执行程序:将pathname参数直接设为该程序文件的路径名即可,如:Shell "D:\新建文件夹\test.exe"。

    对于某些特殊系统文件夹(如Windows、system、system32等)中的可执行程序,或在注册表子项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths下注册过的程序,可以不用指定路径,甚至扩展名也可以不用指定,如打开计算器我们就可以直接这样调用:

    Shell "calc",vbNormalFocus

    否则必须要指定打开程序的路径名,如:

    Shell "F:\MyNotepad.exe D:\test.txt",vbNormalFocus。

    2、打开非可执行文件,如文本文件(.txt)、Word文档(.doc)等

    我们必须先指定一个用来打开这个文件的程序,程序名放在前面,文件路径名放在后面。例如我们要用记事本打开一个文本文件D:\test.txt,Shell函数的调用方式就应该是:

    Shell "notepad D:\test.txt",vbNormalFocus。

    当文件名或路径名中存在空格时,必须要使用英文半角双引号(")来对其进行界定,但这个双引号同时又是VBA中的字符串界定符,所以按照VBA的语法规定,我们要在字符串中使用双引号,就必须用两个双引号来表明这是一个用在字符串中的双引号。如:

    Shell Shell "notepad ""D:\test 1.exe""", vbNormalFocus

    如果我们要用一个变量来代表这个路径名,就应该是:

    Dim strPathName As String

    strPathName="D:\test 1.exe"

    Shell Shell "notepad """ & strPathName & """", vbNormalFocus

    另外由于Shell函数支持命令行,所以我们还可以使用命令行参数来实现一些相关功能,下面是一些在Access VBA中进行运用的举例:

    打开计算器:

    Shell "calc", vbNormalFocus

    打开写字板:

    Shell "write", vbNormalFocus

    打开记事本:

    Shell "notepad", vbNormalFocus

    打开文件夹:

    Shell "explorer C:\我的文件夹", vbNormalFocus

    用Word打开doc文档:

    Shell "winword C:\myword.doc",vbNormalFocus

    打开mdb数据库文件:

    Shell "msaccess C:\mydb.mdb",vbNormalFocus

    打开mdb数据库文件(文件名含有空格):

    Shell "msaccess ""C:\my db.mdb""",vbNormalFocus

    打开mdb数据库文件(以运行时方式):

    Shell "msaccess ""C:\my db.mdb"" /runtime",vbNormalFocus

    将文件夹D:\back中的test.mdb文件替换为D:\test.mdb文件(强制替换,即使被替换的文件已经被打开):

    Shell "replace D:\test.mdb D:\back"

    将数据库文件D:\test.mdb复制到备份文件夹D:\back中(文件已存在时命令无效):

    Shell "replace D:\test.mdb D:\back /a"

    将文件夹D:\back及其所有子文件夹中的test.mdb文件替换为D:\test.mdb文件:

    Shell "replace D:\test.mdb D:\back /s"

    将文件夹D:\back中的文件test.mdb替换为D:\test.mdb(用来替换的源文件比被替换的文件新的时候才有效):

    Shell "replace D:\test.mdb D:\back /u"

    Access软件网官方交流QQ群(群号:39785885)

    Access源码网店

    展开全文
  • (两种方法) 外部打開文件ActiveWorkbook.FollowHyperlink Address:=strOutPath, NewWindow:=False, AddHistory:=True‘ 外部打開文件Call Shell("NOTEPAD.EXE " & strOutPath, vbNormalFocus)内部打开文本文件代码...

    外部打开文本文件代码:(两种方法)

    ' 外部打開文件
    ActiveWorkbook.FollowHyperlink Address:=strOutPath, NewWindow:=False, AddHistory:=True

    ‘ 外部打開文件
    Call Shell("NOTEPAD.EXE " & strOutPath, vbNormalFocus)

    内部打开文本文件代码:

    Set fss = CreateObject("Scripting.FileSystemObject")
    Set ff = fss.OpenTextFile(strOutPath, 8, -2)
    住:strOutPath为文本文件路径

    在后台打开Excel文件代码:
    dim wk as workbook
    set wk=getObject(strFilePath)
    注:strFilePath为Excel文件路径

     
    展开全文
  • 想要文件关闭的时候进行备份?想要把DOS命令加入到日常中的...这样就可以在文件打开的时候自动把H:\ushare\MRP映射成X盘,有利于文件分发。 同理,也可以加入其它的如XCOPY命令来备份。 当然,你要是把DOS命令做...
    想要文件关闭的时候进行备份?想要把DOS命令加入到日常中的应用中来?没问题,用SHELL就行了。
    如你的前台一启动的时候就自动建立虚拟盘,可以在LOAD事件里加入:
    shell "subst X: H:\ushare\MRP"
    这样就可以在文件打开的时候自动把H:\ushare\MRP映射成X盘,有利于文件分发。
    同理,也可以加入其它的如XCOPY命令来备份。
    当然,你要是把DOS命令做成一个BAT文件执行,用SHEEL "PATH“,1 来执行.SHEEL语句后面的那个1的意思如下:
    常数 值 描述
    vbHide        0 窗口是隐藏的,并且焦点被传递给隐藏窗口。
    vbNormalFocus   1 窗口拥有焦点,并且恢复到原来的大小与位置。
    vbMinimizedFocus  2 窗口缩小为图符并拥有焦点。
    vbMaximizedFocus   3 窗口最大化并拥有焦点。
    vbNormalNoFocus   4 窗口被恢复到最近一次的大小与位置。当前活动窗口仍为活动窗口。
    vbMinimizedNoFocus 6 窗口缩小为图符。当前活动窗口仍为活动窗口。
    VBA SHELL语句用法心得--转录
    一、关于Rundll32.exe
    过去,你曾经为了自己编的文件管理器能Format 磁盘、浏览器能自动拨号连接而求助于那位高傲的 API。现在,Rundll32.exe向你提供了更为平易近人的 方法来实现这些功能。
    例如,要调用关机程序则为:shell “rundll32.exe user.exe,exitwindOws”。
    调用模块 命 令 结 果
      rundll32.exe shell32.dll,Control_RunDLL 打开控制面板
    SHELL32.DLL    
      rundll32.exe shell32,SHHelpShortcuts_Rundll PrintersFolder 打开打印机文件夹
      rundll32.exe shell32,SHHelpShortcuts_Rundll FontsFolder 打开字体文件夹
      rundll32.exe shell32,SHHelpShortcuts_Rundll AddPrinter 添加新打印机向导
      rundll32.exe shell32,SHformatDrive 格式化软盘
    SYSDM.CPL    
      rundll32.exe shell32,Control_RunDLL sysdm.cpl 系统属性,常规
      rundll32.exe shell32,Control_RunDLL sysdm.cpl,,l 系统属性,设备管理器
      rundll32.exe shell32,Control_RunDLL sysdm.cpl,,3 系统属性,性能
      rundll32.exe shell32,Control_RunDLL sysdm.cpl @1 添加新硬件向导
    APPWIZ.CPL    
      rundll32.exe shell32,Control_RunDLL appwiz.cpl,,1 添加/删除程序
      rundll32.exe shell32,Control_RunDLL appwiz.cpl,,2 安装Windows部件
      rundll32.exe shell32,Control_RunDLL appwiz.cpl,,3 制作启动盘
    DISKCOPY.DLL    
      rundll32.exe diskcopy.dll,DiskcopyRundll 复制磁盘
    RNAUI.DLL    
      rundll32.exe rnaui.dll,RnaDial x (x为连接名称) 打开拨号边接对话框,若已连接,则显示连接状态对话框
      rundll32.exe rnaui.dll,RnaWizard 新建拨号连接向导
    DESK.CPL    
      rundll32.exe shell32,Control_RunDLL desk.cpl,,0 选择桌面背景
      rundll32.exe shell32,Control_RunDLL desk.cpl,,1 选择屏幕保护
      rundll32.exe shell32,Control_RunDLL desk.cpl,,2 选择外观
      rundll32.exe shell32,Control_RunDLL desk.cpl,,3 设置显示属性
    MAIN.CPL    
      rundll32.exe shell32,Control_RunDLL main.cpl @0 设置鼠标属性
      rundll32.exe shell32,Control_RunDLL main.cpl @1 设置键盘属性,速度
      rundll32.exe shell32,Control_RunDLL main.cpl @1,,1 设置键盘属性,语言
      rundll32.exe shell32,Control_RunDLL main.cpl @2 打开打印机文件夹
      rundll32.exe shell32,Control_RunDLL main.cpl @3 打开字体属性
      rundll32.exe shell32,Control_RunDLL main.cpl @4 设置输入法
    MODEM.CPL    
      rundll32.exe shell32,Control_RunDLL modem.cpl,,add 添加调制解调器向导
    MMSYS.CPL    
      rundll32.exe shell32,Control_RunDLL mmsys.cpl @1 设置声音属性(也可以加入,,0到,,4的参数以选择不同的标签)
    UESR.EXE    
      rundll32.exe user.exe,exitwindows 关闭计算机
    二、如何确定Shell语句调用的程序已经关闭
    这个标题确实太长,但它确实概括了本节的内容。 当你需要等待由Shell启动的应用程序运行完毕时, 便会发现Shell语句只管调用,之后就撒手不管了,于 是我们不得不动用一下API函数了。当然我们可以用 API来完成全部的工作,但是如果那样的话,我们将要 面临CreateProcess这个非常复杂的函数,光写下它 和相关结构类型的宣告就超出一页纸了。别误会,我 说这些的目的只是为了让大家体会到下面我们将要做 的是多么简单的事。
    只需按以下步骤step by step,便OK了。
    1.新建一个项目,在窗体上放一个command1,再 添加一个Module。
    2. 在Module中写入如下代码:
    Option Explicit
    以下声明了OpenProcess,GetExitCodeProcess 和Closeandle 三个API函数
    Public Declare Function OpenProcess Lib"ker nel32"(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long)As Long
    Public Declare Function GetExitcodeProcess Lib “kernel32”(ByVal hProcess As Long, 1pExitcode As Long) As Long
    Public Declare Function Closellandle Lib "Ker nel32”(ByVal hobject As Long) As Long
    Publi Const PROCESS_QUERY_INFORMATION= &H400
    Public Const STATUS_PENDING = &H103&
    3.打开窗体的代码窗口,写入如下代码:
    Option Explicit
    Private Sub RunShell(cmdline As String) 这个自定义过程完成了所有工作
    Dim hProcess As Long
    Dim ProcessId As Long
    Dim exitCode As Long
    ProcessId = Shell(cmdline,1)'此处利用了 Shell当函数使用时返回的任务标识
    hProcess=OpenProcess(PROCESS_QUERY_INFOR MATION,False,ProcessId)
    Do
    Ca11 GetExitCodeProcess(hProcess,exitcode)
    DoEvents
    Loop While exitCode = STATUS_PENDING
    Call CloseHandle(hProcess)
    MsgBox cmdline & "已经关闭。"
    End Sub
    Private Sub Command1_Click()
    RunShell ”notepad.exe”
    End Sub
    4•按F5运行,单击Command1运行计事本,关闭 计事本将弹出对话框“notepad.exe 已经关闭。”
    注意:由于本程序是用一个Do..Loop循环来侦测 进程的结束,所以那句DoEvents是绝不能少的,不然 你就只能用Ctrl+Break来退出了。
    三、激活一个正在运行的程序
    让我们来考虑这样一种情况:我们在程序中定义 了某一操作是用Shell语句调用Windows的计算器,当 用户重复这一操作时,计算器已经在运行了。如果简 单地再使用Shell语句将打开计算器的另一个进程。 这显然是不合理的。这时我们需要做的是激活已运行 的计算器,下面这段简单的代码帮我们达到了目的、 相信大家一看就懂。
    Private Declare Function FindWindow Lib “user32”Alias “FindWindowA”(ByVal 1pClassName As String,ByVal 1pWindowName As String) As Long
    Private Declare Function BringWindowToTop lib “user32” (ByVal hwnd As Long)As Long
    '以上声明了FindWindow和BringWindowToTop两 个API函数
    Private Sub Command1-Click()
    Dim hCalcWnd As Long
    hCalcwnd = Findwindow(“SciCalc”,”计算器”)
    这里SciCalc是计算器的窗口类名,详见下一节
    lf hCalcWnd=0 Then
    Shell("CALC.EXE",vbNormalFocus)
    Else:BringWindowToTop(hCalcWnd)
    End lf
    End sub
    四、如何获得窗口的类名
    只是看过上节的读者大部会对窗口的类名提出疑 问,本节就是针对这个问题的。通过本节的内容,你 还能了解到如何跟踪鼠标,并找出它正经过哪个窗口。 好,让我们一步一步地来,这回代码可能稍多一些。
    1.建立一个新项目,在窗体的General Decla rations部分写入以下代码,这些语句定义了要用到 的API函数、常量以及结构。
    Option Explicit
    Dim gbCancel As Boolean
    Private Type POINTAPI
    X As Long
    Y As Long
    End Type
    Private Declare Function GetCursorPos Lib “user32" (1pPoint As POINTAPI) As Long
    Private Declare Function WindowFromPoint Lib "user32”(ByVal xPoint As Long,ByVal yPoint As long) As Long
    Private DeClare Function GetClassName Lib “user32”Alias "GetClassNameA”(ByVal hwnd As Long,ByVal 1pClassName As String,ByVal aMaxCount As Long)As Long
    2.在窗体上放一个Command1,把标题改成“开 始”,再放一个Label1,以下是事件的代码,也请大家 在相应位置写上。
    Private Sub Command1_CliCk()
    If Command1.Caption ="开始" Then
    Command1.Caption = "停止"
    Call Track
    ElSe
    Command1.Caption="开始"
    gbCancel = True
    End IF
    End Sub
    Private Sub Form_Load()
    gbCancel = False '初始化循环取消变量
    End Sub
    Private Sub Form_QueryUnload(Cancel As In teger,UnloadMode As Integer)
    gbCancel = True '确保循环中断
    End Sub
    3.最后是关键部分,自定义的过程Track。
    Sub Track()
    Dim PT_Mouse As POINTAPI
    Dim 1CurHwnd As Long
    Dim 1PrvHwnd As Long
    Dim IX As Long,1Y As Long
    Dim tClassName As String
    Dim 1Result As Long
    1PrvHwnd = 0
    Do
    Call GetCursorPos(PT_Mouse) '获得鼠标位置
    1X =PT_Mouse.x
    1Y=PT_Mouse.Y
    1CurHwnd = WindowFromPolnt(1X,1Y) '获得鼠 标箭头下窗口的句柄
    If gbCancel = True Then Exit Do
    If 1CurHwnd <> 1PrvHWnd Then '若两值不等则 说明经过不同的窗口,保存新值
    1PrvHwnd=1CurHwnd
    tClassName = String$(256," ") '注意引号间 是空格
    1Result = GetClassName(1CurHwnd,tClassName,255) '这两句取出类名
    tClassName = Left$(tClassName, InStr (tClassName,vbNullChar) -1)
    Labell,Caption = "鼠标通过:” & tClassName
    '也可写1CurHwnd以获得窗口句柄
    End lf
    DoEvents '决不可少!切记,切记!
    Loop
    End sub
    运行此程序,按下"开始”按钮后,鼠标所经过的 窗口的类名将在Labell中显示出来。


    原帖:
    http://ryan888.5d6d.com/thread-25879-1-1.html

    四、利用API函数来处理文件

    通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应付
    几乎所有的文件操作。但是为了普及一下API,展示一下API的魅力,最后向大家介绍
    一下如何利用API函数来处理文件。另一方面也是本人对API情有独钟,为她做一下广
    告,呵呵。

    大家对API的强大也是有所耳闻了,在文件操作方面,API自然毫不逊色。
    说明:为了文章简洁,我们先给出API函数的名称及功能,其完整的声明及常数就不
    再一一细诉,只在示例中给出其完整用法。

    (一)处理驱动器及目录

    下面是windows中提供的对于目录进行操作的API函数及其功能:

    CreateDirectory,CreateDirectoryEx 创建一个新目录
    GetCurrentDirectory 在一个缓冲区中装载当前目录
    GetDiskFreeSpace,GetDiskFreeSpaceEx 获取与一个磁盘的组织有关的信息,以及
    了解剩余空间的容量
    GetDriveType 判断一个磁盘驱动器的类型
    GetFullPathName 获取指定文件的完整路径名
    GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母
    GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动
    器路径
    GetSystemDirectory 这个函数能取得Windows系统目录(System目录)的完整路径
    名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和
    一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中
    ,往往需要管理员权限才可对这个目录进行写操作
    GetTempPath 获取为临时文件指定的路径
    GetVolumeInformation 获取与一个磁盘卷有关的信息
    GetWindowsDirectory 这个函数能获取Windows目录的完整路径名。在这个目录里,
    保存了大多数windows应用程序文件及初始化文件
    RemoveDirectory 删除指定目录
    SetCurrentDirectory 设置当前目录
    SetVolumeLabel 设置一个磁盘的卷标(Label)

    下面通过几个例子来详细的了解一下其中主要的几个函数及其用法:

    1、GetLogicalDrives

    作用:判断系统中存在哪些逻辑驱动器字母

    声明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives
    " () As Long

    说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。
    其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推


    示例:
    Public Sub Get_LogicalDrives()
    Dim LDs As Long, Cnt As Long, sDrives As String
    LDs = GetLogicalDrives
    sDrives = "Available drives:"
    For Cnt = 0 To 25
    If (LDs And 2 ^ Cnt) <> 0 Then
    sDrives = sDrives + " " + Chr$(65 + Cnt)
    End If
    Next Cnt
    MsgBox sDrives
    End Sub

    上面的示例中,我们通过二进制运算,将返回值转换成字符。如果你的机上有C,D,E
    ,F,G,H这几个驱动器,那么LDs的值就是252,转成二进制为11111100,从右往左,依
    次代表A,B,C,D,...,为0的说明没有此驱动器字母。大家可以自己试一试。

    2、GetDriveType

    作用:判断一个磁盘驱动器的类型

    声明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA"
    (ByVal nDrive As String) As Long

    说明:此函数的返回值类型为Long,如驱动器不能识别,则返回零。如指定的目录不
    存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE
    (表示磁盘可以从驱动器上移走,通常是软驱), DRIVE_FIXED(磁盘不能从驱动器
    上移走,通常为本地硬盘), DRIVE_REMOTE(驱动器是远程网络驱动器), DRIVE_CDROM
    (驱动器是CD-ROM驱动器) 或 DRIVE_RAMDISK(驱动器是RAM驱动器)
    参数为String类型,包含了驱动器根目录路径的一个字串
    此函数的功能与FSO的Drive对象的DriveType属性是一样的。

    示例:
    '定义常数变量

    Private Const DRIVE_CDROM = 5 '表示光盘驱动器
    Private Const DRIVE_FIXED = 3 '表示硬盘驱动器
    Private Const DRIVE_RAMDISK = 6 '表示RAM驱动器
    Private Const DRIVE_REMOTE = 4 '表示网络驱动器
    Private Const DRIVE_REMOVABLE = 2 '表示软盘驱动器


    Private Sub Get_DriveType()
    Dim temp As Long
    temp = GetDriveType("d:\") '取的d:盘驱动器类型
    Select Case temp
    Case DRIVE_CDROM
    MsgBox "DRIVE_CDROM: 光盘驱动器"
    Case DRIVE_FIXED
    MsgBox "DRIVE_FIXED: 硬盘驱动器"
    Case DRIVE_RAMDISK
    MsgBox "DRIVE_RAMDISK: RAM驱动器"
    Case DRIVE_REMOTE
    MsgBox "DRIVE_REMOTE: 网络驱动器"
    Case DRIVE_REMOVABLE
    MsgBox "DRIVE_REMOVABLE: 软盘驱动器"
    End Select
    End Sub

    3、GetDiskFreeSpaceEx

    作用:获取与一个磁盘的组织以及剩余空间容量有关的信息

    声明:Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA
    " (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER
    , lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER
    ) As Long

    说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
    .

    在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则
    不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB

    参数说明:
    lpRootPathName String,不包括卷名的磁盘根路径名
    lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可
    用的字节数量
    lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数

    lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的
    字节数

    LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下:

    Type LARGE_INTEGER ' 8 Bytes
     lowpart As Long
     highpart As Long
    End Type

    其中lowpart为 Long,指定低32位,highpart 为 Long,指定高32位。

    示例:虽然此函数能识别的最大分区容量只有2GB,但通过调整,对大于2G的仍然能
    得出正确容量。以下的调整公式是本人通过逆向推算出来的,至于其中的原理也不是
    很清楚,大家可一测试一下。

    Private Sub Get_DiskFreeSpaceEx()
    Dim temp As Long, Dms$
    Dim tempa, tempb, tempc
    Dim RootPathName As String
    Dim FreeBytesAvailabletoCaller As LARGE_INTEGER
    Dim TotalNumberOfBytes As LARGE_INTEGER
    Dim TotalNumberOfFreeBytes As LARGE_INTEGER

    RootPathName = "d:"
    '取得磁盘空间
    temp = GetDiskFreeSpaceEx(RootPathName, FreeBytesAvailabletoCaller, TotalNumberOfBytes
    , TotalNumberOfFreeBytes)

    Dms = Dms + "磁盘容量:" + vbCrLf
    tempa = TotalNumberOfBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfBytes.lowpart
    > 0, TotalNumberOfBytes.lowpart, TotalNumberOfBytes.lowpart + 2 ^ 32) '计
    算容量
    Dms = Dms + CStr(tempa) + "字节" + vbCrLf
    tempa = Format(tempa / 1024 / 1024 / 1024, "0.00")
    Dms = Dms + tempa + "G" + vbCrLf

    '取得磁盘可用空间

    Dms = Dms + "磁盘可用空间:" + vbCrLf
    tempb = TotalNumberOfFreeBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfFreeBytes
    .lowpart > 0, TotalNumberOfFreeBytes.lowpart, TotalNumberOfFreeBytes.lowpart
    + 2 ^ 32) '计算
    Dms = Dms + CStr(tempb) + "字节" + vbCrLf
    tempb = Format(tempb / 1024 / 1024 / 1024, "0.00")
    Dms = Dms + tempb + "G" + vbCrLf

    '取得磁盘已用空间

    Dms = Dms + "磁盘已用空间:" + vbCrLf
    tempc = tempa - tempb

    Dms = Dms + CStr(tempc) + "G" + vbCrLf

    MsgBox Dms
    End Sub

    4、CreateDirectory, CreateDirectoryEx

    作用:创建一个新目录

    声明:
    Declare Function CreateDirectory& Lib "kernel32" Alias "CreateDirectoryA"
    (ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES
    )

    Declare Function CreateDirectoryEx& Lib "kernel32" Alias "CreateDirectoryExA
    " (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes
    As SECURITY_ATTRIBUTES)

    说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError


    参数说明:
    lpTemplateDirectory String,指定一个模板目录的名字,从中复制默认属性(比如
    目录中文件的默认压缩方式)。如设为vbNullString,则表示不使用模板
    lpNewDirectory String,新目录的名字
    lpSecurityAttributes SECURITY_ATTRIBUTES,这个结构定义了目录的安全特性——
    如果操作系统支持的话

    示例:
    Private Sub Create_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    '创建目录
    Ret& = CreateDirectory("C:\Directory", Security)
    '若返回0,则失败。
    If Ret& = 0 Then MsgBox "Error : 创建失败!", vbCritical + vbOKOnly
    End Sub

    5、RemoveDirectory

    作用:移除一个目录

    声明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA
    " (ByVal lpPathName As String) As Long

    说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
    .
    在调用这个函数前,目录必须为空

    参数说明:
    lpPathName 为String类型,要删除的那个目录的名字

    示例:
    Private Sub Remove_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    CreateDirectoryEx "C:\Windows", "C:\Temp", Security
    '移除目录
    RemoveDirectory "C:\Temp"
    End Sub

    6、SetCurrentDirectory

    作用:设置当前目录,与VBA语句ChDir类似。

    声明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA
    " (ByVal lpPathName As String) As Long

    说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError


    参数说明:
    LpPathName String,新当前目录的路径

    示例:
    SetCurrentDirectory "d:\" '设置D:为当前目录

    7、GetSystemDirectory


    作用:这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录
    中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也
    可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理
    员权限才可对这个目录进行写操作

    声明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA
    " (ByVal lpBuffer As String, ByVal nSize As Long) As Long

    说明:此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。如lpBuffer
    不够大,不能容下文件名,则返回要求的缓冲区长度

    参数说明:
    lpBuffer String,用于装载系统目录路径名的一个字串缓冲区。它应事先初始化成
    nSize+1个字符的长度。通常至少要为这个缓冲区分配MAX_PATH个字符的长度
    nSize Long,lpBuffer字串的最大长度

    示例:
    Private Sub Get_SystemDirectory()
    Dim sSave As String, Ret As Long
    '创建缓冲区
    sSave = Space(255)
    '获取系统目录
    Ret = GetSystemDirectory(sSave, 255)
    '移除多余的0
    sSave = Left$(sSave, Ret)
    '显示路径
    MsgBox "系统目录: " + sSave
    End Sub


    [此贴子已经被作者于2007-4-2 19:10:01编辑过]
    1、2、3、4、5、6、8、9、10
    2007-4-2 18:55:04举报帖子
    ★ 参加论坛竞赛,赚积分,赢奖励! ★agstick


    等级:版主
    威望:6
    文章:413
    EH币:1071
    积分:60 精华:2
    注册日期:2006年11月20日


    行业:IT业
    职业:IT技术人员第 2 楼 ※短信 ※好友 ※档案 ※贴子 ※邮件

    -------------------------------------------------------------------------
    -------

    (二)处理文件

    下面是windows中提供的对于文件进行操作的API函数及其功能:

    CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和
    同步对象等。
    CompareFileTime 根据FILETIME结构的信息,对比两个文件的时间
    CopyFile 复制文件。注意:只能复制文件,而不能复制目录
    CreateFile 这是一个全功能的函数,可打开和创建文件、管道、邮槽、通信服务
    、设备以及控制台
    DeleteFile 删除指定文件
    FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
    FindFirstFile 根据文件名查找文件
    FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件

    FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区
    GetBinaryType 判断文件是否可以执行
    GetFileAttributes 判断指定文件的属性
    GetFileInformationByHandle 该函数能够获取上面所有函数所能够获取的信息,如
    大小、属性等,同时还包括一些其他地方无法获取的信息,比如:文件卷标、索引和
    链接信息。
    GetFileSize 判断文件长度
    GetFileTime 取得指定文件的时间信息,有三个文件时间:创建时间、最后访问时
    间、最后写时间。
    GetFileType 在给出文件句柄的前提下,判断文件类型
    GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息
    GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息
    需要一个多大的缓冲区
    GetFullPathName 获取文件路径,该函数获取文件的完整路径名。注意:只有当该
    文件在当前目录下,
    结果才正确。如果要得到真正的路径。应该用GetModuleFileName函数。
    GetShortPathName 获取指定文件的短路径名
    GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用
    GetTempPath 获取Windows临时目录路径
    lclose 关闭指定的文件,请参考CloseHandle函数,了解进一步的情况
    lcreat 创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,
    以便读写
    llseek 设置文件中进行读写的当前位置。该函数与vba的seek语句类似。
    LockFile 在windows中,文件可用共享模式打开——在这种情况下,多个进程可同
    时访问该文件。
    利用这个函数,要对文件进行读写的一个应用程序可将文件的某一部分锁定起来
    ,使其
    不能由其他应用程序访问。这样便避免了同时读写时发生的冲突
    LockFileEx 与LockFile相似,只是它提供了更多的功能
    lopen 以二进制模式打开指定的文件
    lread 将文件中的数据读入内存缓冲区
    lwrite 将数据从内存缓冲区写入一个文件
    MoveFile, MoveFileEx 移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx

    OpenFile 这个函数能执行大量不同的文件操作。和这个函数相比,请优先考虑CreateFile
    函数
    (它能打开命名管道和控制Unicode文件名,同时不受128个字符的路径名称的限
    制)
    ReadFile 从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函
    数能够操作
    通信设备、管道、套接字以及邮槽
    ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的
    回调
    SearchPath 查找指定文件
    SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾
    SetFileAttributes 设置文件属性
    SetFilePointer 在一个文件中设置当前的读写位置
    SetFileTime 设置文件的创建、访问及上次修改时间
    UnlockFile 解除对一个文件的锁定
    UnlockFileEx 解除对一个文件的锁定
    WriteFile 将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函
    数应用于对
    通信设备、管道、套接字以及邮槽的处理
    WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整
    的回调


    文件的压缩和解压缩

    LZOpenFile 打开压缩文件以读取
    LZSeek 查找压缩文件中的一个位置
    LZRead 读一个压缩文件
    LZClose 关闭一个压缩文件
    LZCopy 复制压缩文件并在处理过程中展开
    GetExpandedName 从压缩文件中返回文件名称。


    下面通过几个例子来详细的了解一下其中主要的几个函数及其用法:

    1、CreateFile

    作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以
    及控制台

    声明:
    Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName
    As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes
    As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes
    As Long, ByVal hTemplateFile As Long) As Long

    说明:
    此函数的返回值类型为Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE
    表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS
    或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS

    打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING。

    这个函数代替了lOpen 和 lCreate函数,应该是我们的首选

    参数说明:

    ·lpFileName String,要打开的文件的名字
    ·dwDesiredAccess Long,如果为 GENERIC_READ 表示允许对设备进行读访问;如
    果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示
    只允许获取与一个设备有关的信息
    ·dwShareMode Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE
    表示允许对文件进行共享访问
    ·lpSecurityAttributes SECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结
    构的指针,定义了文件的安全特性(如果操作系统支持的话)

    ·dwCreationDisposition
    Long,下述常数之一:
    CREATE_NEW 创建文件;如文件存在则会出错
    CREATE_ALWAYS 创建文件,会改写前一个文件
    OPEN_EXISTING 文件必须已经存在。由设备提出要求
    OPEN_ALWAYS 如文件不存在则创建它
    TRUNCATE_EXISTING 讲现有文件缩短为零长度

    ·dwFlagsAndAttributes
    Long,一个或多个下述常数
    FILE_ATTRIBUTE_ARCHIVE 标记归档属性
    FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默
    认压缩方式
    FILE_ATTRIBUTE_NORMAL 默认属性
    FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
    FILE_ATTRIBUTE_READONLY 文件为只读
    FILE_ATTRIBUTE_SYSTEM 文件为系统文件
    FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
    FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
    FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区

    FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
    FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
    FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合
    临时文件
    也可在Windows NT下组合使用下述常数标记:
    SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION
    , SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY


    ·hTemplateFile Long,如果不为零,则指定一个文件句柄。新文件将从这个文件
    中复制扩展属性

    示例如下:

    lngHandle = CreateFile("c:\text.txt", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE
    , ByVal 0&, OPEN_ALWAYS, 0, 0)

    '上面代码以写方法打开文件,如文件不存在则创建它。

    2、lcreat

    作用:创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便
    读写

    声明:Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName
    As String, ByVal iAttribute As Long) As Long

    说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。如果出错,
    则返回HFILE_ERROR

    该函数会打开已由其他应用程序打开的文件,所以使用它时要小心。win32的CreateFile
    函数已取代了这个函数。这个函数与vb的open语句作用相同

    参数说明:

    lpPathName String,欲创建的文件的名字
    iAttribute Long,下述值之一:

    0——文件能够读写
    1——创建只读文件
    2——创建隐藏文件
    3——创建系统文件

    示例:
    下面的语句打开c:\test.txt文件

    lcreat “c:\test.txt”,0

    3、lopen

    作用:以二进制模式打开指定的文件

    声明:Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName
    As String, ByVal iReadWrite As Long) As Long

    说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。HFILE_ERROR
    表示出错。会设置GetLastError

    参数说明:

    lpPathName String,欲打开文件的名字
    iReadWrite Long,访问模式和共享模式常数的一个组合,如下所示:
    1、访问模式
    READ 打开文件,读取其中的内容
    READ_WRITE 打开文件,对其进行读写
    WRITE 打开文件,在其中写入内容
    2、共享模式(参考OpenFile函数的标志常数表)
    OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ, OF_SHARE_DENY_WRITE
    , OF_SHARE_EXCLUSIVE

    示例:
    lopen “c:\test.txt”,READ

    4、GetFileTime

    作用:取得指定文件的时间信息

    声明:Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal
    hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME,
    lpLastWriteTime As FILETIME) As Long

    说明:Long,非零表示成功,零表示失败。会设置GetLastError

    如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime
    都可以设置为零(用ByVal As Long)。这个函数返回的文件时间采用UTC格式

    参数说明:
    hFile Long,文件的句柄
    lpCreationTime FILETIME,用于装载文件的创建时间
    lpLastAccessTime FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支
    持这一特性)
    lpLastWriteTime FILETIME,用于装载文件上一次修改的时间

    示例:

    Dim file As Long
    Dim CreationTime As FileTime
    Dim lastaccesstime As FileTime
    Dim lastaccesstime As FileTime
    '定义结构
    Private Type FileTime
     dwLowDateTime As Long
     dwHighDateTime As Long
    End Type

     str1 = "c:\text.txt"
     file = lopen(str1, READ_WRITE) ‘打开文件
     temp = GetFileTime(file, CreationTime, lastaccesstime, lastwritetime)’
    得到文件相关信息

    以上代码获取的时间信息是Long型的,还需要时间转换函数进行转换,完整的示例见
    附件。

    5、CopyFile

    作用:复制文件。与vb的filecopy命令相似

    声明:Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName
    As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As
    Long

    说明:Long,非零表示成功,零表示失败。会设置GetLastError

    参数说明:

    lpExistingFileName String,源文件名
    lpNewFileName String,目标文件名
    bFailIfExists Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函
    数调用会失败。否则目标文件被改写


    示例:
    CopyFile "c:\test1.txt", "c:\test2.txt", 1

    以上代码将c:\test1.txt 拷贝到c:\test2.txt,完整的示例见附件。

    6、MoveFile, MoveFileEx

    作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx

    声明:
    Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName
    As String, ByVal lpNewFileName As String)

    Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName
    As String, ByVal lpNewFileName As String, ByVal dwFlags As Long)

    说明:Long,非零表示成功,零表示失败。会设置GetLastError

    这两个函数通常不能将文件从一个卷移动到另一个卷。但如设置了MOVEFILE_COPY_ALLOWED
    标记,MoveFileEx可以做到这一点.

    参数说明:

    lpExistingFileName String,欲移动的文件名
    lpNewFileName String,新文件名
    dwFlags Long,一个或多个下述常数
    MOVEFILE_REPLACE_EXISTING 如目标文件存在,则将其替换
    MOVEFILE_COPY_ALLOWED 如移动到一个不同的卷,则复制文件并删除原来的文件
    MOVEFILE_DELAY_UNTIL_REBOOT 移动操作在系统下次重新启动时正式进行。这样便可
    在Windows NT中改换系统文件


    示例:
    Private Const MOVEFILE_COPY_ALLOWED = &H2
    Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4
    Private Const MOVEFILE_REPLACE_EXISTING = &H1

     MoveFile "c:\test.txt", "d:\test1.txt" ‘移动文件
     MoveFileEx "d:\test1.txt", "c:\test.txt", MOVEFILE_COPY_ALLOWED ‘再一次
    移动

    以上代码实现了文件的移动,两次移动后,文件不变

    7、DeleteFile

    作用:删除指定文件

    声明:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal
    lpFileName As String) As Long

    说明:Long,非零表示成功,零表示失败。会设置GetLastError

    与vba的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由
    一个应用程序打开,该函数也会将其删除.

    参数说明:
    lpFileName String,欲删除文件的名字

    示例:

    DeleteFile "c:\test.txt" '删除c:\test.txt文件

    完整的示例见附件。

    8、ReadFile

    作用:从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函数能
    够操作通信设备、管道、套接字以及邮槽

    声明:Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (
    ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long,
    lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

    说明:Long,非零表示成功,零表示失败。会设置GetLastError。如启动的是一次异
    步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。
    如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早
    已抵达了文件的结尾

    参数:
    hFile ---- Long,文件的句柄
    lpBuffer --- Any,用于保存读入数据的一个缓冲区
    nNumberOfBytesToRead - Long,要读入的字符数
    lpNumberOfBytesRead - Long,从文件中实际读入的字符数
    lpOverlapped --- OVERLAPPED,如文件打开时指定了FILE_FLAG_OVERLAPPED,那么
    必须用这个参数引用一个特殊的结构。那个结构定义了一次异步读取操作。否则,应
    将这个参数设为NULL(将函数声明成ByVal As Long,并传递零值)

    示例:完整的示例见附件。

    9、WriteFile

    作用:将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函数应用
    于对通信设备、管道、套接字以及邮槽的处理

    声明:Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal
    hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten
    As Long, lpOverlapped As OVERLAPPED) As Long

    说明:Long,TRUE(非零)表示成功,否则返回零。会设置GetLastError

    参数:
    hFile --- Long,一个文件的句柄
    lpBuffer --- Any,要写入的一个数据缓冲区
    nNumberOfBytesToWrite - Long,要写入数据的字节数量。如写入零字节,表示什
    么都不写入,但会更新文件的“上一次修改时间”。针对位于远程系统的命名管道,
    限制在65535个字节以内

    lpNumberOfBytesWritten - Long,实际写入文件的字节数量

    lpOverlapped --- OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文
    件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,
    该参数应置为空(将声明变为ByVal As Long,并传递零值)

    示例:完整的示例见附件。


    10、SHFileOperation

    作用:此函数的功能很强大,能对文件或文件夹进行复制、移动、重命名、删除的全
    部操作。

    声明:Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA
    " (lpFileOp As SHFILEOPSTRUCT) As Long

    说明:Long,TRUE(非零)表示成功,否则返回零。

    参数:
    lpFileOp --SHFILEOPSTRUCT类型,指定文件的操作。
    Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long '对文件的操作指令
    pFrom As String '源文件或路径
    pTo As String '目的文件或路径
    fFlags As Integer '操作标志
    fAnyOperationsAborted As Long
    hNameMappings As Long
    lpszProgressTitle As String
    End Type

    示例:见附件。



    (三)总结

    通过以上的介绍,我们可以看到API在文件操作方面功能十分强大,能够完成一些前
    面方法所不能完成的任务。FileSystemObject对象模型的内部可能就是用API写的,
    即便不是我们也可以用API写出一个FSO类来。API是一个巨大的宝库,当你为实现某
    个功能而愁眉不展的时候,查查API可能就能找到满意的答案。
    展开全文
  • SHELL命令在VBA中的妙用 - Excel

    千次阅读 2014-06-24 14:17:35
    想要文件关闭的时候进行备份?想要把DOS命令加入到日常中的应用中...这样就可以在文件打开的时候自动把H:\ushare\MRP映射成X盘,有利于文件分发。 同理,也可以加入其它的如XCOPY命令来备份。 当然,你要是把DO...
  • 例如,你前台一启动的时候就自动建立虚拟盘,可以在LOAD事件里加入:Shell "subst X: D:\ushare\FILE"这样就可以在文件打开的时候自动把D:\ushare\FILE映射成X盘,有利于文件分发。同理,也可以加入其它的如XCOPY...
  • 近日在工作中常常遇到需要将多个工作薄中的工作表合并到一张工作表里,手动打开每个工作薄复制里面的内容然后粘贴进同一张表里非常麻烦,最近在学习vba,所以自己练习写了一段代码以简化工作。(为了防止自己忘记...
  • VBA两种打开文件窗口的方式第一种第二种结语 第一种 获取文件夹路径,返回完整路径 Dim Fso, Fld '定义文件路径 Set Fso = CreateObject("Scripting.FileSystemObject") Set Fld = Fso.getfolder(CreateObject(...
  • vba shell 函数格式:Shell(PathName[,WindowStyle])PathName :要执行的程序名,包括目录或文件夹WindowStyle :程序运行时窗口的样式例:Shell "control.exe" '打开Windows控制面板更多功能看下图,说了基因强大,...
  • sub 批量提取压缩包内所有文件大小() dim oapp as shell32.shell set oapp = new shell32.shell dim strfile as string dim i as integer set rng = application.inputbox(“请选择单元格区域”, type:=8) if rng....
  • vba shell 函数格式:Shell(PathName[,WindowStyle])PathName :要执行的程序名,包括目录或文件夹WindowStyle :程序运行时窗口的样式例:Shell "control.exe" '打开Windows控制面板更多功能看下图,说了基因强大,...
  • CorelDRAW VBA - 打开选择文件夹对话框

    千次阅读 2018-01-10 22:04:51
    目的 有时候我们可能需要让用户选择某个文件夹,比如说让用户指定某个目录,用于批量导入该目录下的文件。这篇教程将教会你使用 CorelDRAW 在代码中调用系统的文件夹... Dim shell, folder, fs, fd, files ' 创建...
  • 我们在写代码的时候,有时候会必须打开另外一个文件,今日的内容就是解决这个问题,在VBA代码中如何可以打开其他的程序呢?我讲解两种方法。 一Shell函数。该函数让你可以从VBA过程里直接打开任意程序。 Shell函数...
  • 分享成果,随喜真能量。大家好,今日内容仍是和大家分享VBA编程中常用的简单“积木”... 192:在VBA中使用OpenTextFile方法打开文件,并将数据导入到工作表中VBA过程代码191:在VBA中使用Shell函数自动关闭电脑Sub...
  • 创建模块打开EXCEL2003,右击第一张工作表标签选择“查看代码”,之后右击工程VBA PROJECT->插入->模块,或 “工具”->”宏”->”VISUAL BASIC编辑器”添加VBA代码选择新插入的模块后,插入以下代码后...
  • 现在很多软件在打开文件所在目录的同时都会贴心的把该文件选中,比如FlashGet,BitComet。//打开目录并选定文件 ---------------VBA:Private Sub Command0_Click()Dim ds As Stringds = "explorer.exe /select,D:/...
  • 2. 大部分可以用自带函数处理,不过复制文件夹需要用到FileSystemObject对象,打开文件夹用到shell 1 Public Sub test1() 2 '1. 判断文件夹是否存在,dir第二个参数为vbDirectory,不然只判断文件...
  • Shell执行一个可执行文件.返回一个 Variant (Double),如果成功的话,代表这个程序的任务 ID,若不成功,则会返回 0。 语法 Shell(“可执行程序的路径 文件名或命令行”,窗口的显示方式) Sub 用绘图程序打开图片() ...
  • 01007获取打开Excel文件时的默认路径 01008获取模板保存的默认路径 01009获取库文件夹的路径 01010获取路径分隔符 01011获取Excel主窗口标题栏的名称 01012获取Excel窗口的状态(大小) 01013获取Excel主窗口的高度...
  • 文件名:CASS格式地形文件点抽稀(Excel).rar Excel下的VBA程序,在WPS下也可以使用,打开此表格后点击表中按钮,选择CASS格式测量地形点文件,指定抽稀间距即可按距离进行点抽稀过滤。表格见下载中心。 Private ...
  • 利用vbs自动发报表

    2018-12-03 16:41:01
    '运行存储照相图片的excel文件,里面的打开事件里有复制照相图片vba' ws.run &amp;quot;cmd /c start newFile.xls&amp;quot;,1,0 '2s后关闭文件' WScript.Sleep 2000 ws.SendKeys &amp;quot;%{F4}&...
  • autocad命令全集

    2008-10-24 21:46:23
    176 OPEN   打开图形文件 177 OPTIONS OP、PR 设置AutoCAD系统配置 178 ORTHO  F8 切换正交状态 179 OSNAP OS 或–OS 设置目标捕捉方式及捕捉框大小 180 PAGESETUP   页面设置 181 PAN P或–P 视图平移 182 ...
  • 可用NSREX打开 Velvet Studio例子文件 ASF:Microsoft高级流媒体格式文件 ASM:汇编语言源文件,Pro/E装配文件 ASP:动态网页文件;ProComm Plus安装与连接脚本文件;Astound介绍文件 AST:Astound多媒体文件;...
  • shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...
  • shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...
  • shellwait.zip 在程序中运行另一个exe程序直到它运行结束(1KB) 666,unloadforms.zip 卸装所有的forms(1KB) 667,startfile.zip 在程序中运行另一个exe程序(6KB) 668,killapp.zip 终止另一个程序...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

shell打开文件vba