Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6273|回复: 9

[已解决]如何添加附件而不是仅仅是超链接

[复制链接]
发表于 2015-6-8 13:43 | 显示全部楼层 |阅读模式

我有如下的附件 在地N列里面 我添加的是超链接,如果把文件给拷贝走了 那么就能打开,不知道可不可以不管什么时候都能打开文件。vba代码该如何修改。PS:我们主要是实用myexcel 系统 需要把证书更新到数据库当中 现在这样的情况更新到数据库的只是文件名而不是附件。

最佳答案
2015-6-9 15:34
toddbckele 发表于 2015-6-8 18:28
最后行号 = Sheets("sheet5").Range("T65536").End(xlUp).Row

    Dim sErr As String '定义接口变 ...

  • 如何更新数据库我并不关心。我只知道,Excel不支持OLE长二进制数据。如果非要导入到其它数据库(例如SQL Server、Access等等),请不要在Excel里处理。
    ——除非数据库保存的是路径。不过,话又说回来,如果路径相对固定的话,根本不必要去保存路径。

  • 当然,你也可以使用图片格式来保存。但是强制放在一个单元格内,好看吗? 搜狗截图20150609150058.png

  • 如果需要上传什么的,完全可以用FileCopy来完成文件的复制。

  • 给的这段代码我已经看了。



我想说的是,即便封装了其它自定义的类库,能够起到优化程序或者界面的作用,如果没有提供API示例,完全不必要去引用。就这段代码而言,除了免去逐个去引用库之外,我并不觉得用这个插件有什么优势。事实上,如果你了解引用内置库的好处,估计就不会去引用这些库了:
  • 绝大部分情况下,分发到客户端时,内置库不会丢失。——第三方的就难说了。
  • 内置库在帮助文件或网络上有相对完整的API接口程序示例。
  • 学习一个内置库,可以熟悉同一类的编程。例如Dim fso As New FileSystemObject在JavaScript中可以改为:CreateActiveXObject("Scripting.FileSystemObject")来使用(当然,前提是使用IE浏览器)。——如果改为其它库,可以吗?别的不说,你怎么引用这个库还是个问题。

你完全可以引用Microsoft Scripting runtime库来完成这部分操作。大体是:
Dim fso As New FileSystemObject
dim fl as File
fso.GetFold(你的路径)'获取文件夹路径。还可以加上files/subfolds集合获取文件夹下的文件/子文件夹。具体请参考以下帖子:
http://www.excelpx.com/forum.php?mod=viewthread&tid=365551

02.rar

13.65 KB, 下载次数: 11

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-6-8 15:36 | 显示全部楼层
Sub test()
Sheet1.OLEObjects.Add Filename:= _
        "C:\Users\Administrator\Desktop\刷单已审核.xlsx", Link:=False, DisplayAsIcon:= _
        True, IconFileName:= _
        "C:\Windows\Installer\{90140000-0011-0000-0000-0000000FF1CE}\xlicons.exe", _
        IconIndex:=0, IconLabel:="刷单审核"
End Sub
这里以Excel为例。
注意,不同的文件类型,如果显示为图标,类库应该是不一样的。即需要修改红色那部分:
C:\Windows\Installer\{90140000-0011-0000-0000-0000000FF1CE}\xlicons.exe
建议最好录制一下。
回复

使用道具 举报

 楼主| 发表于 2015-6-8 15:50 | 显示全部楼层
roych 发表于 2015-6-8 15:36
Sub test()
Sheet1.OLEObjects.Add Filename:= _
        "C:\Users\Administrator\Desktop\刷单已审核.x ...

这样做我不能做到全部提取呀 只能单个的提取。那样也不太好,太慢了呢。。不知道有没有其他办法 可以看看我的代码。求大神帮忙一下~~!!
回复

使用道具 举报

发表于 2015-6-8 17:01 | 显示全部楼层
toddbckele 发表于 2015-6-8 15:50
这样做我不能做到全部提取呀 只能单个的提取。那样也不太好,太慢了呢。。不知道有没有其他办法 可以看看 ...


修改为:
Sheets(1).OLEObjects.Add Filename:=dir_name & strfilename, Link:=False, _
        DisplayAsIcon:=True, IconFileName:="C:\Windows\system32\packager.dll", _
        IconIndex:=0, IconLabel:=Sheets(1).Cells(n, 14)

试试看。
  1. Sub add_link()
  2.     On Error GoTo err_exit

  3. '    Range("A3:A65535").ClearContents
  4.     Range("I3:I65535").ClearContents
  5.     Range("J3:K65535").ClearContents

  6.     Dim fd As FileDialog
  7.     Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  8.     Dim vritem As Variant
  9.     With fd
  10.         If .Show = -1 Then
  11.             i = 0
  12.             For Each vritem In .SelectedItems
  13.                 i = i + 1
  14.                 dname = vritem
  15.             Next vritem
  16.             If i >= 2 Then
  17.                 MsgBox ("不能够选择多个文件夹,请重新选择")
  18.                 Exit Sub
  19.             End If
  20.         End If
  21.     End With
  22.     Set fd = Nothing
  23.     dir_name = (dname & "")
  24.     strfilename = Dir(dir_name)
  25. '    Dim obj As Object
  26. '    Set obj = Application.COMAddIns.Item("prjAddin.Office_Addin").Object '获取myEXCEL.net的编程接口
  27.     J = 0
  28.     n = 3
  29.     Do While strfilename <> ""
  30.         Sheets(1).Cells(n, 15) = strfilename
  31.         Sheets(1).Cells(n, 14) = strfilename
  32.         'Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(n, 14), Address:=dir_name & strfilename
  33.         Sheets(1).OLEObjects.Add Filename:=dir_name & strfilename, Link:=False, _
  34.         DisplayAsIcon:=True, IconFileName:="C:\Windows\system32\packager.dll", _
  35.         IconIndex:=0, IconLabel:=Sheets(1).Cells(n, 14)
  36.         n = n + 1
  37.         J = J + 1
  38.         strfilename = Dir
  39.     Loop
  40. err_exit:
  41.     Exit Sub
  42. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-6-8 18:14 | 显示全部楼层
roych 发表于 2015-6-8 17:01
修改为:
Sheets(1).OLEObjects.Add Filename:=dir_name & strfilename, Link:=False, _
        Dis ...

嗯嗯 。。非常感谢啊。。我先试试
回复

使用道具 举报

 楼主| 发表于 2015-6-8 18:25 | 显示全部楼层
toddbckele 发表于 2015-6-8 18:14
嗯嗯 。。非常感谢啊。。我先试试

这样也不对的呢。。这样好像每个文件都产生一个小窗口了,我们用的是Myexcel程序开发 的我附上一份附件 我需要的是像附件一样链接到单元格当中去的 。。然后保存更新到数据库~~!!

02.rar

13.65 KB, 下载次数: 11

回复

使用道具 举报

 楼主| 发表于 2015-6-8 18:28 | 显示全部楼层
roych 发表于 2015-6-8 17:01
修改为:
Sheets(1).OLEObjects.Add Filename:=dir_name & strfilename, Link:=False, _
        Dis ...

   最后行号 = Sheets("sheet5").Range("T65536").End(xlUp).Row

    Dim sErr As String '定义接口变量
    Dim sResult As String
    Dim obj As Object
    Dim str_doc
    Set obj = Application.COMAddIns.Item("prjAddin.Office_Addin").Object '获取myEXCEL.net的编程接口
    For k = 3 To 最后行号
        str_doc = str & str_time & "\" & Cells(k, "T") & "\" & Cells(k, "T") & "\"
        Cells(k, "M").Select
        If Cells(k, "V") >= 1 Then
            obj.AddLinkFile str_doc & Cells(k, "L")
        Else
            l = CreateObject("scripting.FileSystemObject").GetFolder(str_doc & Cells(k, "T") & "\").Files.Count '判断包含文件个数
            Cells(k, "J") = l
            If l = 1 Then
                obj.AddLinkFile str_doc & Cells(k, "T") & "\000001.tif"
            Else
                obj.AddLinkFile str_doc & Cells(k, "T") & ".zip" '通过接口调用GetDefaultSysDataRuleValue
            End If
        End If
    Next k
    Set obj = Nothing '释放编程接口

回复

使用道具 举报

 楼主| 发表于 2015-6-8 18:28 | 显示全部楼层
toddbckele 发表于 2015-6-8 18:28
最后行号 = Sheets("sheet5").Range("T65536").End(xlUp).Row

    Dim sErr As String '定义接口变 ...

类似于这样用处的代码 如何给他加入到我的文档中去呢?
回复

使用道具 举报

发表于 2015-6-9 15:34 | 显示全部楼层    本楼为最佳答案   
toddbckele 发表于 2015-6-8 18:28
最后行号 = Sheets("sheet5").Range("T65536").End(xlUp).Row

    Dim sErr As String '定义接口变 ...

  • 如何更新数据库我并不关心。我只知道,Excel不支持OLE长二进制数据。如果非要导入到其它数据库(例如SQL Server、Access等等),请不要在Excel里处理。
    ——除非数据库保存的是路径。不过,话又说回来,如果路径相对固定的话,根本不必要去保存路径。

  • 当然,你也可以使用图片格式来保存。但是强制放在一个单元格内,好看吗? 搜狗截图20150609150058.png

  • 如果需要上传什么的,完全可以用FileCopy来完成文件的复制。

  • 给的这段代码我已经看了。



我想说的是,即便封装了其它自定义的类库,能够起到优化程序或者界面的作用,如果没有提供API示例,完全不必要去引用。就这段代码而言,除了免去逐个去引用库之外,我并不觉得用这个插件有什么优势。事实上,如果你了解引用内置库的好处,估计就不会去引用这些库了:
  • 绝大部分情况下,分发到客户端时,内置库不会丢失。——第三方的就难说了。
  • 内置库在帮助文件或网络上有相对完整的API接口程序示例。
  • 学习一个内置库,可以熟悉同一类的编程。例如Dim fso As New FileSystemObject在JavaScript中可以改为:CreateActiveXObject("Scripting.FileSystemObject")来使用(当然,前提是使用IE浏览器)。——如果改为其它库,可以吗?别的不说,你怎么引用这个库还是个问题。

你完全可以引用Microsoft Scripting runtime库来完成这部分操作。大体是:
Dim fso As New FileSystemObject
dim fl as File
fso.GetFold(你的路径)'获取文件夹路径。还可以加上files/subfolds集合获取文件夹下的文件/子文件夹。具体请参考以下帖子:
http://www.excelpx.com/forum.php?mod=viewthread&tid=365551

回复

使用道具 举报

 楼主| 发表于 2015-6-9 16:27 | 显示全部楼层
roych 发表于 2015-6-9 15:34
  • 如何更新数据库我并不关心。我只知道,Excel不支持OLE长二进制数据。如果非要导入到其它数据库(例如 ...

  • 非常感谢这么详细和专业的回答,但是我还是没怎么学会用 挺尴尬的。。。其实我就是想模仿那个把超链接的形式用 获取myexcel 接口形式 连接上文件。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

    GMT+8, 2024-5-11 04:23 , Processed in 0.850924 second(s), 10 queries , Gzip On, Yac On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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