加载中…
个人资料
siliconxu
siliconxu
  • 博客等级:
  • 博客积分:0
  • 博客访问:19,641
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Excel用vba插入图片时,图片变成链接图片的问题

(2011-12-26 17:08:55)
标签:

pictures

insert

shapes

addpicture

excel

图片

链接

it

分类: Office
我自己设计了一个插入图片,并自动根据单元格的大小改变图片大小的vba。程序中使用的是:ActiveSheet.Pictures.Insert(stPicName).Select 这个语句。

这个程序在2003以及2007(我忘记是否2007有测试过了)时是没有问题的,也就是说,插入图片后的表格,即使保存到其它电脑(或者将原来的图片删掉),图片还是能够打开。
但是当运行在2010时,却发现插入的并不是图片本身,而只是图片的链接。换句话说,如果把原来的图片删掉,或者把表格保存到其它电脑,图片就无法显示。

经过不断的实践和google,终于比较完美的解决了问题。现将方法记录如下。

1. 如果一定要使用Pictures.Insert这个语句,就只能在插入图片后,使用cut把图片剪切,然后再使用paste粘贴图片。这样子,图片便嵌入到了excel表格中。但是,使用paste之后,可能需要重新定位图片的位置。

2. 使用Shapes.AddPicture这个方法。然而,使用这个方法有一个问题,就是必须同时指定图片插入后宽和高。这在事先不知道原始图片大小的情况下,显然会出现问题——插入的图片会比例失调。excel的帮助文档中对这个方法并没有做出很详细的说明,但是,其实这个方法是可以指定插入图片时,不改变原始图片的大小的。Shapes.AddPicture的语法是:
达式.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
只要把Width和Height的值设为-1,就能够在插入图片时不改变图片的大小。
达式.AddPicture(FilenameLinkToFileSaveWithDocumentLeftTop-1-1)
注意,为了使插入的图片与文档一起保存,必须把LinkToFile设为msoFalse,把SaveWithDoucument设为msoTrue。

下面是一个例子:
Sub ShapePic()
    Dim shpPic As Shape
    Dim picW As Single, picH As Single      '图片的宽和高
    Dim cellW As Single, cellH As Single    '单元格的宽和高
    Dim cellL As Single, cellT As Single    '单元格的左边和上边位置(左上角)
    Dim rtoW As Single, rtoH As Single      '单元格和图片的宽和高的比例
    If ActiveCell.MergeCells Then           '判断所选单元格是否是合并单元格
        cellW = ActiveCell.MergeArea.Width  '是的话,cellW和cellH分别等于合并单元格的宽和高
        cellH = ActiveCell.MergeArea.Height
    Else
        cellW = ActiveCell.Width            '不是的话,cellW和cellH分别等于单元格的宽和高
        cellH = ActiveCell.Height
    End If
    cellL = ActiveCell.Left
    cellT = ActiveCell.Top
    Set shpPic = ActiveSheet.Shapes.AddPicture("D:\IMG_4237.jpg", msoFalse, msoTrue, cellL, cellT, -1, -1)
    picW = shpPic.Width
    picH = shpPic.Height
    rtoW = cellW / picW * 0.98              '设置单元格和图片的比例。并设置最终比例为原始比例的98%;
    rtoH = cellH / picH * 0.98              '这样的目的在于不要让图片充满整个单元格,以便可以让人看到单元格的边线。
    shpPic.LockAspectRatio = msoTrue
    If rtoW < rtoH Then
        shpPic.ScaleHeight rtoW, msoTrue, msoScaleFromTopLeft
        'shpPic.ScaleWidth rtoW, msoTrue, msoScaleFromTopLeft
    Else
        shpPic.ScaleHeight rtoH, msoTrue, msoScaleFromTopLeft
        'shpPic.ScaleWidth rtoH, msoTrue, msoScaleFromTopLeft
    End If
    
    picW = shpPic.Width       '根据上面确认的比例,为图片的宽和高重新赋值
    picH = shpPic.Height
    shpPic.IncrementLeft (cellW - picW) / 2                       '移动单元格的图片,使图片位于单元格(宽和高)的中间。
    shpPic.IncrementTop (cellH - picH) / 2
    Set shpPic = Nothing
End Sub

注意,如果通过调用对话框来插入图片的话,则不会存在插入的是链接图片的问题。比如:
Application.Dialogs(xlDialogInsertPicture).Show

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有