ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8320|回复: 12

如何判断局域网上另外一台计算机中的某个Excel文件是否已经打开?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2002-6-26 09:48 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:文件操作和FSO
如何判断局域网上另外一台计算机中的某个Excel文件是否已经打开?

TA的精华主题

TA的得分主题

 楼主| 发表于 2002-6-26 18:27 | 显示全部楼层
版主,能不能答复希望都能给个答复 在下谢了先

TA的精华主题

TA的得分主题

发表于 2002-6-26 23:58 | 显示全部楼层
如果本地同时打开应该就会有提示, 共享与只读否, 那位在网里, 试一试.

TA的精华主题

TA的得分主题

发表于 2002-6-27 10:52 | 显示全部楼层
嗯,會說文件已經某人在用,請選擇只讀還是通知

TA的精华主题

TA的得分主题

 楼主| 发表于 2002-6-27 13:28 | 显示全部楼层
我的意思是能在VBA中判断吗? 因为我想将局域网中的文件改名,如果已经被另外一个用户打开就提示当前用户要保存的文件已被打开。 各位大虾,多谢了。

TA的精华主题

TA的得分主题

发表于 2002-6-27 19:48 | 显示全部楼层
Option Explicit Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long Sub TellMeTheFileAlreadyOpenOrNot() Dim strFileName As String strFileName = "C:\Book1.xls" ' 你的文件 If IsFileAlreadyOpen(strFileName) Then _ MsgBox "指定文件已打开" Else _ MsgBox "指定文件未打开" End Sub ' 判断某文件是否在使用中 Public Function IsFileAlreadyOpen(FileName As String) As Boolean Dim hFile As Long Dim lastErr As Long hFile = -1 ' 初始化文件句柄. lastErr = 0 hFile = lOpen(FileName, &H10) If hFile = -1 Then ' 文件是否能正确打开并可共享 lastErr = Err.LastDllError Else lClose (hFile) End If IsFileAlreadyOpen = (hFile = -1) And (lastErr = 32) End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2002-6-27 23:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2002-7-14 13:56 | 显示全部楼层
版主,谢谢你的程序。我是个初学者,虽然知道你的程序运行没有问题,可是我对于这个程序的原理一窍不通。能不能请你花的时间具体解释一下呢? 以下这两个定义的函数,具体指什么意思? Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long 平常我看到的函数定义中都不存在 Lib "kernel32" Alias "_lclose"这样的一些文字,他们在这个例子里所指的是什么? 另外,这两个定义的函数,为什么没有函数体? 可能是不明白上面函数的定义吧,因此这几句也没有看懂,请指教 hFile = lOpen(FileName, &H10), lClose (hFile),lastErr = Err.LastDllError 真对不起,一下子问了一大通,希望你能耐心讲讲,或是介绍一些专门讲这些知识的贴子看看。 谢谢啦!

TA的精华主题

TA的得分主题

发表于 2002-7-14 15:10 | 显示全部楼层
哈哈,这个问题问得。。。。。很好玩,您可难为Rowen了,这些是API函数,先申明我可不懂,这些不是vba的而是针对windows的,很打脑袋,有句术语:睡不着,拿本api的书立马见效!(备注:原创!我可不是打广告哦~),让Rowen几句话讲清确实太难,以下是missle斑竹的文章,你可学习一些: 关于API的文章 我还没有仔细看,呵呵: Visual Basic以友好易学的可视化开发环境闻名于 世,成为人们学习计算机 编程的首选语言。目前,全世界 大概有300多万人使用着Visual Basic语言。如果 您想在 这茫茫众生中出类拔萃,那么您就不得不学习API (Application Program lnterface,即Windows的应用程 序编程接口)编程。不懂API,那可成不了高手。 第一节:API基础 API说到底就是一系列的底层函数,是系统提供给 用户用于进入*作系统核心, 进行高级编程的途径。通 过在Visual Basic应用程序中声明外部过程就能够 访问 Windows API(以及其它的外部DLLs)。在声明 了过程之后,调用它的方法与调用Visu al Basic自 己的过程相同。要声明一个DLL过程,需要在代码窗 口的"声明"部分增加一 个 Declare语句,如果该过 程返回一个值,应将其声明为Function。例如: Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type 如果过程没有返回值,可将其声明为Sub。 缺省情况下,在标准模块中声明的DLL过程,可 以在应用程序的任何地方调用它。 在其他类型的模块中定义的DLL过程是模块私有的,必须在它们前面 加上Private 关键字,以示区分。特别提请注意的是,在32位的Visual Basic中过程名是区分大 小 写的。而在以前的16位版本中并不区分大小写,这是初学者容易出错的地方。 Declare语句中的Lib子句用来告诉Visual Basic如何找到包含该过程的dll文件。 如果引用的过 程属于Windows核心库(User32、Kernel32或 GDI32),则可以不包含 文件扩展名。例如: Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount"() As Lon g。 对于其它DLL, Lib子句须指定文件的路径及扩展名。 如果调用的Windows API过程要使用字符串,那 么在声明语句中必须增加一个Alias 子句,以指定正确的字符集。包含字符串的Windows API函数实 际有两种格武ANSI格 式Unicode格式。因此,在Windows头文件中,每个包含字符串的函数都同时有 ANSI版 本和Unicode版本。 例如,下面是SetWindowText函数的两种C语言描 述。可以看到, 第一个描述将函数定义为SetWindowTextA, 尾部的"A"表明它是一个ANSI函数: SetWindowTextA(HWND hWnd,LPCSTR lpString); 第二个描述将它定义为SetWindowTextW,尾部的 "w"表明它是一个Unicode函数: SetWindowTextW(HWND Hwnd,LPCWSTR lpString); 因为两个函数实际的名称都不是"SetWindow Text",要引用正确的函数就必须增加一 个Alias子句: Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Longg,ByVal lpString As String) As Long 请注意, Alias子句后面的字符串必须是过程的 真正名称,必须是区分大小写的。 事实上,您只需要 记住,只有Windows NT才支持Unicode格式,而 Windows 95只支 持ANSI格式就行了。至于两者的区 别,作一般的应用程序开发是不需要了解的。 VB5专业版在VB目录的\Winapi子目录下,用几 个文件提供了关于API的信息。 Win32api.txt文件中 包含了32位Windows API函数中用到的函数和类型的 结构声明 以及全局常量的值。用户可以用VB本身带的外 接程序"API浏览器"来方便地使用 Win32api.txt,如下 所示: 点击菜单文件项的"加载文本文件…"从VB目 录下的 WINAPI目录中选择"WIN32API.TXT",就可以 查看WINDOWS 95系统的API函数的声明、 常数定义和 数据类型了。例如,我们打算查看函数InverRect() 的声明。首先,点 击"搜索"按钮,输入字符串 "InverRect"。在"可选项"栏中,兰色的亮度条将移 动 到"InverRect"项上。再点按"添加"按钮,在"选 定项"中就出现"InverRect"在 Visual Basic中的 声明了。接下来自然是点按"复制"按钮,然后将窗 口切换到 Visual Basic开发环境中,在需要声明API 函数的地方Ctrl+V(粘贴)即可。 上面所讲的声明方法虽然简单,但只有使用WIN DOWS本身的API函数才能这样。对于 第三方提供的动态链接库(DLL)您只有用键盘老老实实地敲了。 第二节:牛刀小试 现在读者一定很想自己亲自试一下,下面举两个 实际应用的例子让大家体会一下API 的妙用吧! 1.使一个窗体始终保持在屏幕的最上面 我们知道VB本身自带的函数是难以完成此功能 的,我们可以通过调用Windows的API函 数: SetWindowPos达到我们的要求。*作步骤如下: (1)启动VB5建立一个新工程,在该工程中添加一 个模块(Moudel),在该模块中 用上述的"API例览器" 添加如下的该API函数的函数声明和常量声明部分: 'API函数声明 Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwn d As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByV al cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long '常量声明 Global Const SWP_HIDEWINDOW = &H80 Global Const SWP_NOACTIVATE = &H10 Global Const SWP_NOCOPYBITS = &H100 Global Const SWP_NOMOVE = &H2 Global Const SWP_NOOWNERZORDER = &H200 Global Const SWP_NOREDRAW = &H8 Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER Global Const SWP_NOSIZE = &H1 Global Const SWP_NOZORDER = &H4 Global Const SWP_SHOWWINDOW = &H40 Global Const HWND_BOTTOM = 1 Global Const HWND_BROADCAST = &HFFFF& Global Const HWND_DESKTOP = 0 Global Const HWND_NOTOPMOST = -2 Global Const HWND_TOPMOST = -1 Global Const HWND_TOP = 0 Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE 这里以"SWP_"开头的常量是表示窗体所具有的 风格,这些常量可以通过VB中的"OR" *作符组合在 一起。而以"HWND_"开头的常量表示窗体在桌面上的 位置。从这些常 量的英文单词的意义上读者应该很容 易理解他们所具有的风格了。所以笔者就不一 一去说 明了。至于为什么要添加这些常量而不是别的这就要 您去查看Windows SDK 关于该函数的帮助文档了。当 然这对于初学者来说有一定的难度,但不要畏惧,只 要您仔细看帮助就会慢慢搞懂的。因为这些API函数 是为C和C++的编程人员编写 的,所以如果您懂一点 C++的话会很容易理解的。 (2)现在只要在您想要此功能的地方调用该函数 就可以了,调用的方法如: Dim Success as Long SuccesS=SetwindowPos(me.HWnd. HWND_TOPMOST,0,0,0,0,FLAGS) 若Success返回的值不等于零则表示调用成功。 比如在某个窗体的Load事件中加入上述的两行代 码,就可以达到使该窗体始终位于 屏幕最上面的目的。 细心的读者可能已经发现上面的例子中的模块声 明中声明了好 几个常量,可为什么只用到三个呢?现在您可以试着改变一下API函数"SetWindowPos " 中 的第二个参数或常量FLAGS中的项,看看您的窗体会 出现什么样的效果? 2.VB5中如何屏蔽掉win95中的CTRL_ALT_DEL, CTRL_ESC, ALT_TAB三组热键通过调 用API函数"SystemParametersInfo"来实现。 首先创建一新工程;在此工程中添加一个窗体和 一个模块;在窗体上拖放两个按钮 分别命名为"cmdDisable","cmdEnable";Copy如下代码入模块中: Public Declare Function SystemParametersInfo Lib "user32" Ahias "SystemParametersInfoA" (ByVal uAction As Long,ByVal uParam As Long, lpvPa ram As Any,ByVal fuWinIni As Long)AS Long Public Const SPI_SCREENSAVERRUNNING=97 在窗体的代码编辑区Copy如下代码: '使三组热键失效 Private Sub cmdDisable_click() SystemParametersInfo SPI_SCREENSAVERRUNNING,True,byVal 1&,0 End Sub Private Sub Form_Unload(Cancel As Integer) '程序退出前是热键有效 CndEnable_Click End Sub 若将此功能和屏幕保护程序结合到一起,那您的屏幕 保护程序一定增色许多。 API函数的简单调用例子就是这么容易,相信现在您 对API的调用已不再感到神秘了, 接下来我们就看看一个 比较复杂的应用。 第三节:高手进阶 上面的关于API的调用的例子只是为了带您去Win dows API世界中去探索一下。相信 您已探索到了一点眉 目并想去实现一些更"好玩"的东西了。好!下面就向您 介绍一 个很"好玩"同时又会使您的程序看起来更专业化 的一个API调用。 相信您的机器上一定装有"金山词霸",试着启动它 您发现了什么?启动画面过后它 "不见了"。把鼠标移到 桌面的右下角,原来它以图标的形式"藏在" Windows 的托盘 中。用鼠标右击它还会弹出一个菜单功能项供您 选择。现在您一定想把自己的程序 也放到托? 下面是此功能的实现步骤: 1.这里我们调用的API函数是: "Shell_NotifyIcon",在您的模块中添加如下的函 数声明和常量声明: '以下常量告诉系统在托盘中您的图标上发生了什么 *作 '常量声明 Public Const WM_MOUSEMOVE = &H200 '在图标上移动鼠标 Public Const WM_LBUTTONDOWN = &H201 '鼠标左键按下 Public Const WM_LBUTTONUP = &H202 '鼠标左键释放 Public Const WM_LBUTTONDBLCLK = &H203 '双击鼠标左键 Public Const WM_RBUTTONDOWN = &H204 '鼠标右键按下 Public Const WM_RBUTTONUP = &H205 '鼠标右键释放 Public Const WM_RBUTTONDBLCLK = &H206 '双击鼠标右键 Public Const WM_SETHOTKEY = &H32 '响应您定义的热键 'API函数声明 Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long '自定义一个调用API Shell_NotifyIcon要用到的类 型"NOTIFYICONDATA" Public Type NOTIFYICONDATA cdSize As Long 'NOTIFYICONDATA类型的大小 hwnd As Long '你的应用程序窗体的名柄 uId As Long '应用程序图标资源的ID号 uFlags As Long '使那些参数有效它是以下枚举类型中的 'NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合 uCallbackMessage As Long '鼠标移动时把此消息发给该图标的窗体 hIcon As Long '图标名柄 szTip As String*64 '当鼠标在图标上时显示的Tip文本 End Type '这是一个枚举类型它告诉API Shell_NotifyIcon去做什么*作 Public Enum enm_NIM_Shell NIM_ADD=&H40 '在“金碟”中加一图标 NIM_MODIFY=&H1 '修改“金碟”中的图标 NIM_DELETE=&H2 '删除“金碟”中的图标 NIF_MESSAGE=&H1 '使类型"NOTIFYICONDATA"中的uCallbackMessage有效 NIF_ICON=&H2 '使类型"NOTIFYICONDATA"中的hIcon有效 NIF_TIP=&H4 '使类型"NOTIFYICONDATA"中的szTip有效 WM_MOUSEMOVE=&H200 '使鼠标移动消息有效 End Enum '定义一个"NOTIFYICONDATA"类型的变量 Public nidProgramData As NOTIFYICONDATA 以上是函数及常量声明和自定义的一个类型变量,下 面是此API函数的调用方法: 2. 在窗体上用菜单编辑一个具有如下信息的菜单项: 主菜单:无标题、名称(mainMenu) 子菜单:标题(API编程)、名称(submnul); 标题(退出)、名称(submnu2). 这里只是举个例子,具体的功能你可以根据你的具体需要来编辑此菜单项 3. 在窗体的Load事件中添加如下代码: Private Sub Form_Load() '隐藏窗体 With Me ..Top =-10000 ..Left = -10000 ..WindowState = vbMinimized End With '设置类型NOTIFYICONDATA所具有的特征 With nidprogramData ..cbSize = Len(nidProgramData) ..hwnd = Me.hwnd .uld = vbNull ..uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE '触发鼠标移动消息 ..uCallbackMessage = WM_MOUSEMOVE ..hIcon = Me.Icon '“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的 图标 ..szTip ="VB 的 Win32 API 编程" & vbNullChar End With '调用该函数 Shell_NotifyIcon NIM_ADD,nidprogramData End Sub '根据不同的鼠标消息做不同的*作 Private Sub Form_MouseMove(Button As inte ger, Shift As lnteger, x As Sing le, Y As Single) On Error GoTo Form_MouseMove_err: Dim Result As Long Dim msg As Long 'X的值依赖与显示模式的设置 If Me.ScaleMode = vbpixels Then msg = x Else msg = x/Screen.TwipsPerPixe1X End If Select Case msg Case WM_LBUTTONUP '在这里加入鼠标左键释放时你想做的*作 Case WM_LBUTTONDBLCLK '在这里加入双击鼠标左键时你想做的*作 Case WM_RBUTTONUP '通常这里弹出你的功能菜单 PopupMenu mainMenu Case WM_MOUSEISMOVING '在这里加入鼠标正在移动时你想做的*作 End Select Exit Sub Form_MouseMove_err: '在这里加入你的处理异常错误的代码 End Sub 4.Run你的程序,您是不是看到了象“金山词霸”一样的功能?相信你此时的感觉 一定特别“爽”! API的世界j是丰富多彩的,只要你肯细心地去探索它你一定会 获得许多意想不到的好东西。所以笔者觉得定值得每一个具有“好奇”精神的人

TA的精华主题

TA的得分主题

发表于 2002-7-15 13:04 | 显示全部楼层
谢谢你,这位朋友。 我也觉得奇怪,为什么我在VBA help中没有发现相应的帮助信息,原来是VBA中利用了外部的API 函数实现这一功能。 能在这里学到不少有用的知识,真是件幸事!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 00:13 , Processed in 0.047333 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表