精华内容
下载资源
问答
  • 学习Excel技术,关注微信公众号:...本文主要总结了调用Function过程的4种方式:从另一个过程中调用Function过程在VBE的“立即窗口”中调用Function过程在工作表公式中调用Function过程在设置条件格式时所使...

    学习Excel技术,关注微信公众号:

    excelperfect

    前面的几篇文章讲解了Function过程的语法以及Function过程的优势和一些细节,也穿插使用了调用Function过程的不同方式。本文主要总结了调用Function过程的4种方式:

    • 从另一个过程中调用Function过程

    • VBE的“立即窗口”中调用Function过程

    • 在工作表公式中调用Function过程

    • 在设置条件格式时所使用的公式中调用Function过程

    从另一个过程中调用Function过程

    在组织程序代码时,通常将重复使用的代码或通用的功能放置在单独的过程中,供其他过程调用。同样,可以从其他过程中调用Function过程,调用方式与调用内置函数相同。

    例如,在编写代码时,我们经常要判断工作簿中是否存在特定的工作表,可以编写一个自定义函数来判断:

    '检查工作簿中是否存在指定名称的工作表

    '参数strName: 要检查的工作表名称

    '参数wb: 可选,包含工作表的工作簿名称

    Function HasSheet(strName AsString, _

      Optional wb As Workbook) As Boolean

       Dim wks As Worksheet

       If wb Is Nothing Then

            Set wb = ActiveWorkbook

       End If

       On Error Resume Next

       HasSheet = CBool(Not wb.Sheets(strName) Is Nothing)

       On Error GoTo 0

    End Function

    在另一过程test中,可以先调用HasSheet函数判断指定的工作表是否存在,然后再进行相应的操作,如下代码所示:

    Sub test()

       Dim strSheetName As String

       strSheetName = "Sheet1"

        '判断工作表是否存在

       If HasSheet(strSheetName) Then

            '操作代码

       Else

            MsgBox "工作表" & strSheetName &"不存在!"

       End If

    End Sub

    除了直接使用自定义函数名调用该函数外,还可以使用Application对象的Run方法来调用,如下面的代码所示

    Sub test()

       Dim strSheetName As String

       Dim SheetExists As Boolean

       strSheetName = "Sheet9"

        '判断工作表是否存在

       SheetExists = Application.Run("HasSheet","strSheetName")

       If SheetExists Then

            '操作代码

       Else

            MsgBox "工作表" & strSheetName &"不存在!"

       End If

    End Sub

    注意,Run方法的第一个参数是要调用的函数的名称,后面的参数为自定义函数的参数。

    在VBE的“立即窗口”中调用Function过程

    可以使用“立即窗口”,方便地进行Function过程代码测试,如下图1所示。

    edd43b731df8a36be67d9ff3fad03285.png

    1

    在工作表公式中调用Function过程

    通常,可以像内置工作表函数一样,在工作表公式中调用Function过程。例如,下面的代码用来获取所传递的参数中的数字:

    '获取文本字符串中的数字

    Function GetNum(rng As String)

       Dim lngLen As Long

       Dim i As Long, result

       lngLen = Len(rng)

       For i = 1 To lngLen

            If IsNumeric(Mid(rng, i, 1)) Then

                result = result & Mid(rng, i,1)

            End If

       Next i

       GetNum = result

    End Function

    在工作表中使用GetNum函数获取单元格中所含的数字,如下图2所示。

    b45e654cc5710049003dff0d9e2d1706.png

    2

    然而,如果这个自定义函数不在当前工作簿中,并且自定义函数所在的工作簿是打开的,则可以使用:

    =工作簿名!GetNum(单元格)

    来调用该自定义函数。

    如果自定义函数所在的工作簿没有打开,则需要在VBE的“工具——引用”中来引用自定义函数所在的工作簿,这样才能使用该自定义函数。此外,还可以创建加载项。

    在设置条件格式时所使用的公式中调用Function过程

    可以在设置条件格式时使用自定义函数。例如,下面的自定义函数判断参数单元格中是否包含公式:

    Function FormulaExists(rng) AsBoolean

       FormulaExists = rng.HasFormula

    End Function

    这样,如果要突出显示工作表中包含公式的单元格,可以先选择所需要设置条件格式的单元格区域,然后创建条件格式规则,如下图3所示。

    1fd339dab745b95601b5aff6977be1ba.png

    3

    正如上图3所示,在设置条件格式的公式中包含了自定义函数FormulaExists

    2ff2b390cd5cc1ee076846ee23317dd7.png

    展开全文
  • VBA调用javascript

    万次阅读 2014-07-28 19:50:02
    函数接口 ...Function execJSFunc(filePath, funcName)  Dim code  Open filePath For Input As #1  Do While Not EOF(1)  Line Input #1, tmpCode  code = code & tmpCode & Chr(13)  Lo

    函数接口

    Function execJSFunc(filePath, funcName)
        Dim code
        Open filePath For Input As #1
        Do While Not EOF(1)
            Line Input #1, tmpCode
            code = code & tmpCode & Chr(13)
        Loop
        Close #1
    
        Set JS = CreateObject("ScriptControl")
        JS.Language = "JScript"
        JS.AddCode code
        Dim result
        result = JS.run(funcName, ThisWorkbook)
        execJSFunc = result
    End Function


    调用封装

    Sub run(funcName)
        Dim path, fileName, pos, result
        path = ThisWorkbook.path
        pos = InStr(4, ThisWorkbook.Name, ".", 1)
        pos = Len(ThisWorkbook.Name) - 4
        fileName = Mid(ThisWorkbook.Name, 1, pos - 1)
        path = path + "\" + fileName + ".js"
        result = execJSFunc(path, funcName)
        Debug.Print result
    End Sub



    调用示例

    Sub 按钮1_Click()
        run("hello")
    End Sub

    test.js源码

    function hello(workbook) {
    	var sheets = workbook.sheets;
    	sheets("Sheet1").range("a3").value = 55555;
    	return workbook.sheets.count;
    }


    展开全文
  • VBA调用C/C++ DLL

    千次阅读 2011-08-08 15:04:54
    在VBA开发过程中,为了能够使用系统已经提供的函数,或已经用C++语言开发的功能,本文对VBA调用C++ DLL进行了总结。 1. 函数声明 Function prototype: DWORD WINAPI GetCurrentDirectory(  __i

    在VBA开发过程中,为了能够使用系统已经提供的函数,或已经用C++语言开发的功能,本文对VBA调用C++ DLL进行了总结。

    1.        函数声明

    Function prototype:

    DWORD WINAPI GetCurrentDirectory(

     __in   DWORD nBufferLength,

     __out  LPTSTR lpBuffer

    );

    函数声明如下:

    Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

    Public  用于声明对所有模块中的所有其它过程都可以使用的函数。  Private   用于声明只能在包含该声明的模块中使用的函数。 

    Lib包含所声明函数的动态链接库名或代码资源名。    

    Alias 表示将被调用的函数在动态链接库(DLL)   中还有另外的名称。

     

    2.        DLL的位置

    DLL文件必须位于以下三个目录之一:

    (1)Windows的系统目录:\Windows\system32

    (2)DOS中path所指出的任何目录

    (3)Windows XP系统下:C:\Documentsand Settings\%USERNAME%\My Documents

    为了VBA可以调用DLL中的函数,必须把DLL放在以上三个位置中的任何一个。

    有两种办法可以解决这个问题:

    1.      在调用DLL 函数之前,把DLL copy到以上三个目录中的任何一个。

    Dim fso AsObject

    Dim dllFileNameAs String

    dllFileName = Environ("SYSTEMROOT")+ “\system32\LicenseVerify.dll”

    Set fso =CreateObject("Scripting.FileSystemObject")

    Iffso.FileExists(dllFileName) = False Then

    fso. CopyFile ThisWorkbook.Path + “\ LicenseVerify.dll”,dllFileName

    End If

     

    2.      改变当前进程的当前路径。

    例如,DLL与当前EXCEL文件放在同一个目录下,这个时候当前进程的当前路径设置如下:

    Public Declare Function SetCurrentDirectoryLib "kernel32" Alias "SetCurrentDirectoryA" (ByVallpPathName As String) As Long ‘ function declaration

    SetCurrentDirectory (ThisWorkbook.Path) ‘set the current directory to Thisworkbook.Path

    OK,这样设置后,就可以访问DLL了。这样方便程序的发布,不需要用户把DLL复制到系统目录下。

     

    3.        返回值

    如果返回值是字符串,需要在函数调用前为字符串分配内存空间。

    Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

    其中,lpBuffer 是输出参数。

    例子:

    Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

     

    Private Sub DoVerify()

        Dimresult As Integer

        Dim retValue AsString

     

        retValue = String(1024, vbNullChar) 'allocate the buffer for out parameter.

        result= GetCurrentDirectory(1024, retValue)   

    End Sub


    展开全文
  • VBA调用doc命令,doc窗口关闭之后,继续执行代码 Option Explicit 'Docワィンドワ閉じるした後、後続けの処理実施 Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandel As Long, ByVal...

    VBA调用doc命令,doc窗口关闭之后,继续执行代码

     

    Option Explicit
    
    'Docワィンドワ閉じるした後、後続けの処理実施
    Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandel As Long, ByVal dwMilliseconds As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandel As Long, ByVal dwProcessld As Long) As Long

    注:

    如果你在程序中指定了Option Explicit,那么所有的变量都必须用Dim显式声明才可以使用。

     

    '* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * ** *
    '*                                                 *
    '* Out対象ファイル作成(Tempフォルダー作成)                *
    '* 作成日:2016/12/22                              *
    '* 作成者:                               *
    '* 更新日:                                        *
    '* 更新者:                               *
    '*                                                 *
    '* * * * * * * * * * * * * * * * * * * ** * * * * * * * * ** * *

     

    Public Sub createTempFolder()
    
    On Error GoTo errl
             
        '■バッチ対象
        Dim BAT_CREATE_TEMP_TOOL As String: BAT_CREATE_TEMP_TOOL = _
                    BAT_FILE_URL & "\" & BAT_CREATE_TEMP_TOOL_FILE_NAME
            
        'bat命令
        Dim cmdStr
        cmdStr = """" & BAT_CREATE_TEMP_TOOL & """" & " " & """" & OUT_FILE_PATH & """"
        'MsgBox cmdStr
    
        'バッチを実行する
        RetVal = Shell(cmdStr)
        
        processId = OpenProcess(&H100000, False, RetVal)
        r = WaitForSingleObject(processId, -1&)
        r = CloseHandle(processId)
        
        TEMP_FOLDER_EIXST_FLG = "1"
        
        
    GoTo endok
    
    errl:
        '異常処理
        ERROR_FLG = "1"
         
        ERROR_INFO_LIST.Add ("関数:「createTempFolder」で、エラー発生しました。")
        ERROR_INFO_LIST.Add ("エラー詳細:" & Err.Number & " : " & Err.Description)
            
    endok:
    
    End Sub

     

    变量定义

     'バッチファイルの保存場所
     BAT_FILE_URL = Mid(OUT_FILE_PATH, 1, indexOfOut - 1) & "Tool" & "\bat"
    
     BAT_CREATE_TEMP_TOOL_FILE_NAME = "CreateTempTool.bat"

     

    CreateTempTool.bat

     

    @echo off
    set outDir=%1
    
    cd /d %~d0
    cd %outDir%
    mkdir Temp


    http://blog.csdn.net/sxzlc/article/details/53749868

    bat中的[%~dp0]使用

     

    扩展:

    %0:表示批处理本身 

    %~sdp0:
    这里面的
    d:表示扩展到批处理文件所在的盘符;
    p表示扩展到批处理文件所在的路径.


    假如批处理文件在c盘的123文件下的test文件夹下:
     c:\123\test\批处理文件:

    d:表示c:\;
    p表示123\test\
    s:表示路径中含有短名 


    cd /d %~sdp0:就表示进入批处理文件所在的文件夹中
    cd /d %~d0:就表示进入批处理文件的盘符

     

    其他方式调用bat

    http://blog.csdn.net/sxzlc/article/details/53750128

     

    ■让工具更简洁 (不使用bat文件)

        'bat命令
        Dim cmdStr
        cmdStr = "c\AAAA\BBB\xxx.exe param1 param2"
        'MsgBox cmdStr
    
        'バッチを実行する
        RetVal = Shell(cmdStr)
        
        processId = OpenProcess(&H100000, False, RetVal)
        r = WaitForSingleObject(processId, -1&)
        r = CloseHandle(processId)

    原来的bat中,有多行命令时,可以多次执行,这样,就不用单独建立一个bat文件了。

    ===

     

     

     

    
    
    
    
    展开全文
  • 函数接口Function execJSFunc(filePath, funcName)Dim codeOpen filePath For Input As #1Do While Not EOF(1)Line Input #1, tmpCodecode = code & tmpCode & Chr(13)LoopClose #1Set JS = CreateObject(...
  • 调用 Sub 和 Function 过程Calling Sub and Function procedures08/14/2019本文内容若要从其他过程中调用某个 参数值。To call a procedure, type the name of the procedure and include values for any required ...
  • vba调用javascript函数封装

    千次阅读 2014-09-01 09:23:12
    function filter(sheet, rangeStr, col, value) { sheet.range(rangeStr).AutoFilter(col, value); } //取消过滤 function filterCancel(sheet, rangeStr) { sheet.range(rangeStr).AutoFilter; }
  • 学习Excel技术,关注微信公众号:...本文主要总结了调用Function过程的4种方式:从另一个过程中调用Function过程在VBE的“立即窗口”中调用Function过程在工作表公式中调用Function过程在设置条件格式时所使...
  • 在使用vba的时候,出现使用 sub test() shell "1.exe" end sub 程序界面一闪而过,通过查询,应该是,在调用动态连接的时候,没有调用,导致产品异常报错,使用API也可以解决,但是本人小白,只能复制网络的代码,...
  • 本附件用excel自带的VBA调用windowsAPI 用 mouse_event 实现了对前台程序发送按键和鼠标动作 用 sendmessege 实现了对后台程序发送鼠标动作 做法是 先人手打开画图程序,切换回excel点击按钮 就可以在画图程序画出...
  • 基本方法是公开.NET对象通过COM Interop,然后就可以调用.net 对象方法并传递参数了,但是参数如果包含double数组,VBA将出现如下错误信息"Function or interface marked as restricted, or the function uses an ...
  • 2 sub /function 调用时需要注意 不能让sub名赋值,但是 functionname可以的 没有赋值的变量可以直接表达式运算,但默认为0值 Public a, b这种语句不能写在sub内,只能放在模块脚本最前面,只能定义,赋值只能在...
  • Function 随机试题() '产生随机数代码,40个随机数字从1~100中取'1、声明变量Dim dx As Integer '随机单选题数值Dim dxjh As New Collection '随机单选题数值集合,不重复Dim dxzsl As Integer '单选题库总数量Dim ...
  • I need to by pass an IE confirm 'OK'/'Cancel' pop-up ... I have a problem running a JavaScript function in my VBA script. My JavaScript:function ConfirmSave(){var Ok = confirm('Are you sure all D...
  • i 找了win32的返回值为字符串的win32 api的VBA接口调用 =》 测试成功,方法这里就不说了 i 找了win32通过参数返回字符串的win32 api的VBA接口调用 =》测试成功,方法这里就不说了 i 找了通过参数返回字符串数组...
  • VBA中API函数调用问题

    2021-04-14 23:40:32
    <p>Private Declare PtrSafe Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long Private Declare...
  • vba中API函数调用问题

    2021-04-08 20:33:19
    <p>Private Declare Function OpenPrinter Lib 'winspool. drv' Alias 'OpenPrinterA' (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long  Private Declare ...
  • 这篇教程将教会你使用 CorelDRAW VBA代码来调用默认浏览器打开指定的网址(URL),并可同时指定打开后的浏览器的焦点模式。 注意:在32位和64位的Windows系统中,具体调用的方法有所不同。请看详细代码: 一、...
  • C++ Dll 供 vba 和 R调用

    千次阅读 2013-07-30 16:17:50
    1、 vba 调用 C++ Dll  1.1 code blocks 建立DLL  1.1.1 将 def 文件拷贝到 项目根目录下,改为:  EXPORTS  SomeFunction  1.1.2 ".h": DLL_
  • VBA可以调用很多windows的API,但是需要提前声明 64位的聲明要多加一個關鍵字的 Declare PtrSafe Function 增加PtrSafe即可 #...
  • VBA具有四种过程:Sub过程、Function函数、Property属性过程和Event事件过程。一.Sub 过程Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。如下例:Sub password (ByVal x as integer, ByRef y...
  • Today I have met some problems on specifying a relative path into a excel vba header, linking a dll.You must specify a absolute one instead of the relative path. For example: Declare Function LoadPr...
  • 上一章给大家分享了过程的作用域,什么是公有过程,什么是私有过程,有哪些注意事项,今天给大家分享一下另外一个Function过程,该过程怎么使用,需要注意什么?其实这个Function过程也是常说的函数过程,我们接下...
  • 1 VBA里sub和function的3种调用方式 1.1 调用函数的多种写法 function() call function() 1.2 执行过程的多种写法 sub 1个参数 sub 参数1 参数2(错误) call sub (1个参数) call sub (参数1,参数2) ...
  • 2 调用其他函数(VBA若只调用函数,并不会直接返回函数返回值) func1 call function() 3 调用其他函数并使用函数返回值 Debug.Print func1(1, 3) a = func1(100, 99) 4 如何关闭其他sub,用传递参数的方法 ...
  • VBA的过程(Procedure) VBA中的过程(Procedure)...一种叫函数(Function) '可调用代码block 一种叫子程序(Subroutine) '可执行代码block 一 函数和过程的相同点 1.1 sub 和 function的相同点 sub和func...
  • excel vba调用SQLConfigDataSource函数时返回值总是FALSE,是哪里出错了?请高手指教! 代码如下: Private Const ODBC_ADD_SYS_DSN = 4 Private Declare PtrSafe Function SQLConfigDataSource Lib "odbccp32....

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 138
精华内容 55
关键字:

functionvba调用