精华内容
下载资源
问答
  • VBA调用Shell

    2021-08-28 15:32:59
    VBA中执行Shell介绍,打开应用,执行python、bat、mysql;

    VBA的Shell函数

    函数参数介绍

    Shell(PathName[,WindowStyle])

    • PathName :要执行的程序名,包括目录或文件夹
    • WindowStyle :程序运行时窗口的样式

    Shell函数返回在第一个参数中指定的应用程序的任务标识。可以使用这个数字在稍后激活该任务;
    Shell函数启动的应用正在运行时,VBA进程不会终止(类似于加入了进程等待)。
    Shell函数异步运行应用程序,执行Shell函数后,还有其他过程,会与Shell函数内容同时执行;
    Shell函数第二个参数WindowStyle的值:

    常量说明
    vbHide0窗口将隐藏,并且焦点将传递给隐藏窗口。
    vbNormalFocus1窗口具有焦点且还原为其原始大小和位置。
    vbMinimizedFocus2窗口将显示为具有焦点的图标。
    vbMaximizedFocus3使用焦点最大化窗口。
    vbNormalNoFocus4窗口将还原为其最新的大小和位置。 当前活动窗口仍保持活动状态。
    vbMinimizedNoFocus6窗口将显示为图标。 当前活动窗口仍保持活动状态。

    示例:

    Function shell_func(Program As String)
    ' Program:应用名称
    Dim TaskId As Double
    On Error Resume Next
    TaskId = Shell(Program, 1)      ' 任务标识,参数1代表窗口具有焦点且还原为其原始大小和位置
    If Err <> 0 Then     ' 不等于0,表示报错
        MsgBox "无法打开应用:" & Program, vbCritical, "Error"
    End If
    End Function
    

    过程等待

    Shell在运行完之后会关闭小黑窗,处理快点几乎看不见,可以通过在命令行前加入cmd /k,小黑窗不会关闭;
    Shell "cmd /k ipconfig/all"
    VBA等待shell执行完再执行后面进程,可以定义这么一个函数

    Function ShellAndWait(cmd As String) As String 
        Dim oShell As Object, oExec As Object
        Set oShell = CreateObject("WScript.Shell")
        Set oExec = oShell.exec(cmd)        ' 执行cmd命令
        result = oExec.StdOut.ReadAll    ' 读取命令行返回的内容,读完后再进行vba后面的逻辑处理;
        Set oShell = Nothing
        Set oExec = Nothing
    End Function
    

    案例-执行Windows的bat文件

    Shell "c:/bat_file.bat"


    案例-mysql查询

    Sub sql_to_txt()
    Dim this_path,cmd As String
    
    this_path = ThisWorkbook.Path    ' 当前工作簿的路径
    ChDrive "F"   '切换磁盘渠道到F盘
    ChDir this_path     ' 切换路径,这样my_ndim_table文件就写入到工作簿所在目录下了
    '-u账号 -p密码 库名mydb -e执行 "要执行的sql",> 查询结果重定向到txt文件
    cmd = "cmd /k mysql -uroot -p123456 mydb -e ""select * from d_mg_game_ndim limit 20"" > my_ndim_table.txt"
    shell cmd, 1    
    End Sub
    

    案例-执行python脚本

    ' 打开jupyter notebook
    Shell "jupyter notebook"
    
    ' 执行python脚本
    shell "python d:/python.py"
    

    案例-指定应用程序打开文件

    这里使用的是notepad++打开命名为my_ndim_table.txt的文本文件

    ChDrive "c"
    ChDir "C:\Program Files (x86)\Notepad++"
    cmd_str = ".\notepad++.exe F:\桌面\my_ndim_table.txt"
    Debug.Print cmd_str
    
    Shell cmd_str, 1
    

    AppActivate语句

    如果一个程序已经在运行,使用shell函数会启动另一个实例,大多情况下,只需要激活正在运行的实例,而并非启动另一个实例。可以通过AppActivate语句激活实例;

    Sub StartCalculate()
    Dim Program As String
    Dim TaskId As Double
    
    Program = "calc.exe"   ' 计算器
    On Error Resume Next   '遇到错误,继续执行下面语句
    AppActivate "计算器"    ' 这里是应用程序面板的标题titile
    If Err <> 0 Then   ' 如果没有捕捉到‘计算器’程序,则err不等于0
        Err = 0
        TaskId = shell(Program, 1)    ' 打开计算器
        If Err <> 0 Then MsgBox "无法打开计算器"
    End If
    End Sub
    

    激活计算器


    EXCEL表格函数打开应用程序

    如果是在工作表里,我们可以使用该函数:
    =HYPERLINK("C:\Windows\System32\calc.exe","打开计算器")
    工作表超链接打开计算器


    ShellExecute函数

    函数介绍

    使用API函数ShellExecute能打开任何文件(包括桌面和URL快捷方式)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动哪一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute返回打开文件的应用的实例句柄。
    ShellExecute函数可以简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,则ShellExecute能打印文件或打开文件夹。

    该函数只能启用已知文件名的应用程序(文件类型在Windows注册)


    函数API声明

    在模块中的声明部分输入如下声明语句
    声明

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

    声明关键词:

    • Declare关键字:在模块级别中声明对动态链接库(DLL)中外部过程的引用。
    • Function关键字:紧随Function的函数名是从VBA中调用该函数时要使用的名称。该名称可以与API函数本身的名称相同,也可以使用Declare语句中的Alias关键字,表示要在VBA中使用不同的名称(“别名”)调用该函数。
    • Lib关键字:指明包含所声明过程或函数的动态链接库。它说明的是函数或过程从何而来的问题。例如在上例中,SetFocus Lib"user32"说明函数SetFocus来自“user32.dll”文件。
    • Alias关键字:用于指定API函数的别名,如果调用的API函数要使用字符串(参数中包含String类型),则Alias关键字是必需的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的。为了保证不出现声明错误的情况,必须使用Alias关键字指出API函数的别名。

    案例:打开网页、图片、文本、EXCEL

    Sub open_url()
    ' 打开百度链接
    res = ShellExecute(0&, vbNullString, "http://www.baidu.com", vbNullString, vbNullString, 1)
    
    ' 打开图片
    res = ShellExecute(0&, vbNullString, "F:\桌面\111.png", vbNullString, vbNullString, 1)
    
    ' 打开txt文件
    res = ShellExecute(0&, vbNullString, "my_ndim_table.txt", vbNullString, vbNullString, 1)
    
    ' 打开excel表格
    res = ShellExecute(0&, vbNullString, "F:\excel_file.xlsx", vbNullString, vbNullString, 1)
    End Sub
    
    展开全文
  • vba shell 调用和vba 文件操作

    千次阅读 2009-10-26 11:25:00
    在调用SHELL之前,必须要通过以下步骤:(以在E:盘根目录下操作为例)1、强制改变当前的驱动器: ChDrive "E"2、强制改变默认的工作目录:chdir "E:/"完成以上动作之后,再来调用E:/的批处理文件shell "e:/234....

    在调用SHELL之前,必须要通过以下步骤:(以在E:盘根目录下操作为例)
    1、强制改变当前的驱动器: ChDrive "E"
    2、强制改变默认的工作目录:chdir "E:/"
    完成以上动作之后,再来调用E:/的批处理文件:shell "e:/234.bat"
    这样执行的效果就和DOS下执行的效果一致。

    原因在哪?这是因为SHELL的工作切入点是在Application的默认工作目录中,也就是说,除非在批处理中强行界定目标路径,否则,SHELL执行批处理时永远都是Application的默认工作目录下进行。
    而Application的默认工作目录一般都是“我的文档”。你可以这样试验一下,在E:/创建一个批处理234.bat,内容是 dir >123.inf ,就是将dir列表写进到123.inf文件中,然后在立即窗口中shell "E:/234.bat" ,之后再用windows的搜索功能,搜索一下刚刚生成的123.inf文件,你就会发现这个文件是在“我的文档”中,而不是在E:/下,而在DOS下直接执行234.bat,则结果文件就自然在E:/下。
    如果是在立即窗口中,依次执行
    ChDrive "E"
    chdir "E:/"
    shell "e:/234.bat"
    你再看一下,生成的文件就在E:/下了。

     

    Option Explicit

    'version 0.1 2009/08/05 add Attached_SaveAs

    Sub Attached_SaveAs()

    '执行前,在工具,引用中加入"Microsoft   Scripting   Runtime"
        Dim fso As New FileSystemObject
        Dim fldr As Folder
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FolderExists("d:/GDS_HUB_Report_Used_by_Rita") Then             '判断是否存在这个文件夹
            fso.DeleteFolder ("d:/GDS_HUB_Report_Used_by_Rita")
        Else
            MsgBox "program will create a new Folder which is named 'GDS_HUB_Report_Used_by_Rita' on the D disk!"
        End If
        MkDir "D:/GDS_HUB_Report_Used_by_Rita"
        'Shell "D:/", 0
        'Shell "cd 1", 1

     '调用shell命令前加入改变当前默认路径
        ChDrive "D"
        ChDir "D:/1/"
        Shell "calc.exe", 1
        Shell "C:/Program Files/7-zip/7z.exe e d:/1/1.rar", 1
        Dim myOlSel As Outlook.Selection
        Dim j, x, cu As Integer
        Dim strFolder As String
        Dim defaultPath As String
        Dim YN As Integer, zipYN As Integer
        Dim i As Long
        Dim oApp As Object
        Set oApp = CreateObject("Shell.Application")
        Set myOlSel = Application.ActiveExplorer.Selection
        defaultPath = "D:/GDS_HUB_Report_Used_by_Rita/"
        If FileExist("C:/VBAtemp.ini") Then
            Open "c:/VBAtemp.ini" For Input As #1
            Line Input #1, defaultPath
            Close #1
            If PathExist(defaultPath) Then
                YN = MsgBox(defaultPath, vbYesNo, "Save file to this path ?")
                If YN = vbNo Then
                    strFolder = getFOLDER()
                Else
                    strFolder = defaultPath
                End If
            Else
                strFolder = getFOLDER()
            End If
        Else
            strFolder = getFOLDER()
        End If
        zipYN = MsgBox("auto unzip ?", vbYesNo, "auto unzip ?")
       
        For x = 1 To myOlSel.Count
            With myOlSel.Item(x)
                cu = 0
                cu = .Attachments.Count
       
                If cu > 0 Then
                    For j = 1 To cu
                        On Error Resume Next
                       
                        If FileExist(strFolder & "/" & .Attachments(j).DisplayName) Then
                            .Attachments(j).SaveAsFile (strFolder & "/" & .Attachments(j).DisplayName & "_double" & i)
                            If FileDateTime(strFolder & "/" & .Attachments(j).DisplayName) > FileDateTime(strFolder & "/" & .Attachments(j).DisplayName & "_double") Then
                                Kill strFolder & "/" & .Attachments(j).DisplayName & "_double"
                            Else
                                Kill strFolder & "/" & .Attachments(j).DisplayName
                                Name strFolder & "/" & .Attachments(j).DisplayName & "_double" As strFolder & "/" & .Attachments(j).DisplayName
                            End If
                        Else
                            .Attachments(j).SaveAsFile (strFolder & "/" & .Attachments(j).DisplayName)
                            i = i + 1
                        End If
    '                    If FileExist(strFolder & "/" & .Attachments(j).DisplayName) Then
    '                        i = i + 1
    '                    End If
                        If zipYN = vbYes Then
                        If UCase(Right(strFolder & "/" & .Attachments(j).DisplayName, 3)) = "ZIP" Or UCase(Right(strFolder & "/" & .Attachments(j).DisplayName, 3)) = "RAR" Then
                            oApp.NameSpace(strFolder & "/").CopyHere oApp.NameSpace(strFolder & "/" & .Attachments(j).DisplayName).Items
                        End If
                        End If
                    Next
                End If
       
            End With
        Next
        MsgBox "Success save " & i & " files", vbOKOnly, "complete"
    End Sub

    Function getFOLDER() As String
        Dim objShell As Object  'Shell
        Dim objFolder As Object 'Shell32.Folder
        Dim objFolderItem As Object

        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.NameSpace(0)
        Set objFolderItem = objFolder.Self

        Set objFolder = objShell.BrowseForFolder(0, "Select a folder:", 0, 0)

        If objFolder Is Nothing Then
            getFOLDER = "Cancel"
        Else
            If objFolder.ParentFolder Is Nothing Then
                getFOLDER = "C:/Documents and Settings/" & Environ("username") & "/" & objFolder
            Else
                getFOLDER = objFolder.Items.Item.Path
            End If
        End If

        Set objFolder = Nothing
        Set objShell = Nothing
       
        If getFOLDER <> "Cancel" Then
            Open "c:/VBAtemp.ini" For Output As #1
                Print #1, getFOLDER
            Close #1
        End If
    End Function

    Function FileExist(rFile As String) As Boolean
        Dim fs As Object
        Set fs = CreateObject("Scripting.FileSystemObject")
        FileExist = fs.FileExists(rFile)
    End Function

    Private Function PathExist(pname) As Boolean
        Dim x As String
        On Error Resume Next
        x = GetAttr(pname) And 0
        If Err = 0 Then PathExist = True _
          Else PathExist = False
    End Function

     

    展开全文
  • VBA打开PDF文件

    2021-10-12 11:14:43
    Shell "RUNDLL32.EXE URL.DLL,FileProtocolHandler " & myfile, vbMaximizedFocus ' myfile是PDF文件完整路径
    Shell "RUNDLL32.EXE URL.DLL,FileProtocolHandler " & myfile, vbMaximizedFocus '

    myfile是PDF文件完整路径

    展开全文
  • VBA两种打开文件窗口的方式

    千次阅读 2020-10-20 10:32:33
    VBA两种打开文件窗口的方式第一种第二种结语 第一种 获取文件夹路径,返回完整路径 Dim Fso, Fld '定义文件路径 Set Fso = CreateObject("Scripting.FileSystemObject") Set Fld = Fso.getfolder(CreateObject(...

    VBA两种打开文件窗口的方式

    第一种

    获取文件夹路径,返回完整路径

    	Dim	Fso, Fld	'定义文件路径
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set Fld = Fso.getfolder(CreateObject("Shell.Application").BrowseForFolder(0, "请选择路径", 0, "").Self.Path & "")
    
    

    效果如下
    在这里插入图片描述
    返回完整路径
    在这里插入图片描述

    第二种

    获取文件路径,返回文件完整路径

    	Dim Fld 
        Fld = Application.GetOpenFilename("Excel 文件,*.xls;*.xlsx;*.xlsm")
    
    

    效果如下
    在这里插入图片描述
    返回的是完整的路径
    在这里插入图片描述

    结语

    以上。
    目前我是用这两种方法,一种获取文件夹路径,一种获取Excel文件路径。

    展开全文
  • 主要介绍了VB使用shell函数打开外部exe程序的实现方法,是非常实用的一个功能,需要的朋友可以参考下
  • '因为自己昨天想不通,在路上想了一会儿,...'这个vba代码是后处理的代码,加载阶段未接触上进行修正 Dim wb As Workbook str = Dir("C:\Users\DELL\Desktop\保存\*.*") ' ActiveWindow.WindowState = xlNormal ...
  • EXCEL VBA PDF 文件

    2015-05-26 08:35:35
    EXCEL VBA PDF 1.使用CreateObject("Wscript.Shell").Run("pdf文件路径") 2.可以使用foxit Activex 或者 adobe 的activex workbookS.open("PDF的路径")
  • VBA打开TXT类文件读写相关操作代码

    千次阅读 2019-03-11 23:23:32
    Open 文件名 for 打开方式 as 文件编号 打开方式:Input :只能读,不能写Append:允许读也允许写,如果存在文件就追加记录,如果没有就新建文件Output:可以读,也可以写。但总会把原来的同名文件删除,再新建一个 ...
  • Excel VBA 打开超链接

    2021-05-12 11:14:39
    VBA打开超链接 文件超链接 Cells(x, y).Hyperlinks(1).Follow 网址超链接 URL = Cells(x, y).Hyperlinks(1).Address Set wshshell = CreateObject(“wscript.shell”) wshshell.Run hyper_link & URL
  • SHELL命令在VBA中的妙用 - Excel

    千次阅读 2014-06-24 14:17:35
    想要文件关闭的时候进行备份?想要把DOS命令加入到日常中的应用中...这样就可以在文件打开的时候自动把H:\ushare\MRP映射成X盘,有利于文件分发。 同理,也可以加入其它的如XCOPY命令来备份。 当然,你要是把DO...
  • 程序在一个EXCEL表中,设为SheetA,打开一个EXCEL文件后增加一个工作表,设为SheetB。还要用到一张基价表,设为SheetC,下面的代码展示了如何打开EXCEL文件,并进行三者之间的操作,希望给有此需求的人予帮助。对某...
  • Excel-VBA文件操作

    千次阅读 2018-10-05 02:16:29
    2、利用VBA文件处理语句来处理文件; 3、利用FileSystemObject对象来处理文件; 4、利用API函数来处理文件。 对于数据库文件,还可以利用ADO+SQL的方法操作,本文不讨论 利用Excel对象自带的方法来操作文件是最...
  • VBA解压压缩文件

    千次阅读 2018-08-20 22:14:52
    VBA解压压缩文件调用的是WinRAR的命令。我们可以参考WinRAR帮助。解压文件的命令以及例子如下图: vba里面使用shell运行命令。 代码很简单如下: Sub jieya() Shell "D:\Program Files\WinRAR\WinRAR.exe...
  • Excel VBA - 文件打开或关闭相关

    万次阅读 2011-11-01 13:00:26
    →实现标准的“打开”对话框,并获取用户文件名,而不必真正打开任何文件。获取文件的FullName 表达式.GetOpenFilename(FileFilter,FilterIndex,Title, ButtonText, MultiSelect) FileFilter:过滤文件Title:标题...
  • 学习资源:《Excel VBA从入门到进阶》第48集 by兰色幻想忘了之前老师有没有讲过Dir函数了,还是写一下吧,再开始正文吧:Dir函数:返回一个 String,它表示与指定路径下的文件、目录或文件夹的名称。语法:Dir ...
  • Application.GetOpenFilename(fileFilter, fileIndex, fileSelectTitle, ...例:"CSV文件(*.csv), *.csv, 所有的文件(*.*), *.*" 这里有一点需要注意,如果上面有n对的话,n>1时,该程式的返回值为一个数组;如...
  • 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....
  • 最近在做一个项目,项目的主体是基于Excel的VBA开发。项目的各个要求比较零碎,每一项要求之间互相独立,于是每一项要求就由一个Excel表格来单独实现,项目结果是产生了若干个零碎...借助于以下语句将Excel文件打开 P
  • 读取ZIP压缩包中的文件信息,通常思路需要先解压,然后再访问文件信息,其实大可不必这么麻烦,无需解压ZIP压缩包就可以提取相关信息。
  • VBA调用InternetExplorer操作IE浏览器,自动弹出文件选择对话框时,VBA会处于阻塞状态,你必须手工关闭文件选择对话框,VBA才能继续向后运行。 例如下面网址,就有一个文件浏览按钮: ... 我做了一个exe文件,可以在...
  • Excel-VBA操作文件四大方法

    万次阅读 2017-12-21 15:26:48
    Excel-VBA操作文件四大方法之一 在我们日常使用Excel的时候,不仅会用到当前Excel文件的数据,还经常需要访问其他的数据文件。这些数据文件可能是Excel文件、文本文 件或数据库文件等。经常有朋友会问如何在vba...
  • VBA 读取/写入文本文件

    千次阅读 2014-08-28 16:44:55
    VBA 读取/写入文本文件  2011-06-28 10:53:58| 分类: Excel自动化 | 标签:读入 文本  |举报 |字号 订阅 1、Open 语句  打开方式有  Input:以读取方式打开。 Output:以写入方式...
  • (两种方法) 外部打開文件ActiveWorkbook.FollowHyperlink Address:=strOutPath, NewWindow:=False, AddHistory:=True‘ 外部打開文件Call Shell("NOTEPAD.EXE " & strOutPath, vbNormalFocus)内部打开文本文件代码...
  • vba显示图片文件

    2020-03-30 08:13:26
    Sub Button1_Click() Dim sht As Worksheet, rng As Range, picPath As String Set sht = ActiveSheet Set rng = ActiveCell If sht.Cells(1, rng.Column) <... "文件" Then Exit Sub picPa...
  • excel使用vba语言实现宏,虽然没学过 但是大致的代码可以看懂 就搞了一个打开excel自动运行宏 在ftp服务器上下载文件到本地的小脚本 0x01 配置 首先需要打开excel的宏,在excel的 开始-》选项-》信任中心 -》宏...
  • Excel VBA表中添加打开文件夹按钮

    千次阅读 2019-07-13 07:58:47
    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....
  • 一、access vba代码直接创建网络盘符 Z盘(带用户名、密码) 例1: Shell "net use Z: \\192.168.1.244\umvData /user:Administrator Hnerpserver123"  End Sub 例2:Shell ...
  • vba 压缩文件 使用方便 (Ease of use) There are many uses for zip folders. Previously, saving disk space was the primary purpose, but today that often isn't very important; more the option for ...
  • strPath = "D:\Test\test.docx" docName = Right(strPath, Len(strPath) - InStrRev(strPath, "\"))

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,523
精华内容 609
关键字:

shell打开文件vba