关于生成Excel图片对象,VBA与VB的编写不同

本文探讨了将日本人编写的VBA二维码生成工具移植到VB6.0的过程中,如何在VB6中创建COM组件,并展示了VBA原始代码与VB6正常调用的代码示例,强调了在VB6中需在模块申明公共变量Public excelapp As Excel.Application。

日本人VBA写的二维码生成工具,想移植到vb6.0,写com组件,不废话,直接上代码

vba原代码

Private m_fs As Object

Public Function QR(ByVal s As String, _
                   Optional ByVal charsetName As String = "Shift_JIS") As Variant
    If m_fs Is Nothing Then
        Set m_fs = CreateObject("Scripting.FileSystemObject")
    End If

On Error GoTo Catch
    If Not (TypeOf Application.Caller Is Range) Then Exit Function

    Dim rng As Range
    Set rng = Application.Caller.MergeArea
    Call DeleteShape(rng)

    If Len(s) = 0 Then Exit Function

    Dim sbls As Symbols
    Set sbls = CreateSymbols(charsetName:=charsetName)
    Call sbls.AppendText(s)

    Dim filePath As String
    filePath =  "D:\test.jpg" 
  
    Dim shp As Shape
    Set shp = AddPicture(filePath, rng)
    Call FillShape(shp, vbWhite)

    QR = ""

Finally:
On Error GoTo 0
    Exit Function
Catch:
    QR = CVErr(xlErrValue)
    Resume Finally
End Function

Private Function DeleteShape(ByVal Target As Range)
    Dim ws As Worksheet
    Set ws = Target.Parent

    Dim shps As Shapes
    Set shps = ws.Shapes

    Dim shp As Shape
    Dim rng As Range
    Dim i As Long
    For i = shps.Count To 1 Step -1
        Set shp = shps(i)
        If shp.Type = msoPicture Then
            Set rng = ws.Range(shp.TopLeftCell, shp.BottomRightCell)
            If Not (Intersect(Target, rng) Is Nothing) Then shp.Delete
        End If
    Next
End Function

Private Function AddPicture(ByVal filePath As String, ByVal Target As Range) As Shape
    Dim shps As Shapes
    Set shps = Target.Parent.Shapes

    Dim shp As Shape
    Set shp = shps.AddPicture(filePath, msoFalse, msoTrue, Target.Left, Target.Top, 0, 0)

    With shp
        Call .ScaleHeight(1, msoTrue)
        Call .ScaleWidth(1, msoTrue)
        .LockAspectRatio = msoTrue
        .Placement = xlMoveAndSize
    End With

    If Target.Height * shp.Width <= Target.Width * shp.Height Then
        shp.Height = Target.Height - 10
    Else
        shp.Width = Target.Width - 10
    End If

    shp.Left = Target.Left + Target.Width / 2 - shp.Width / 2
    shp.Top = Target.Top + Target.Height / 2 - shp.Height / 2

    Set AddPicture = shp
End Function

Private Sub FillShape(ByVal shp As Shape, ByVal colorRgb)
    With shp.Fill
        .ForeColor.RGB = colorRgb
        .Transparency = 0
        .Solid
    End With
End Sub

vb6.0下正常调用的代码:

需要在模块申明公共变量Public excelapp As Excel.Application

Private m_fs As Object
Public Function QR(ByVal s As String, _
                   Optional ByVal charsetName As String = "Shift_JIS") As Variant
    If m_fs Is Nothing Then
        Set m_fs = CreateObject("Scripting.FileSystemObject")
    End If

On Error GoTo Catch
    If Not (TypeOf excelapp.Caller Is Excel.Range) Then Exit Function

    Dim rng As Range
    Set rng = excelapp.Caller.MergeArea
    Call DeleteShape(rng)

     If Len(s) = 0 Then Exit Function

    'Dim sbls As Symbols
    'Set sbls = CreateSymbols(charsetName:=charsetName)
    'Call sbls.AppendText(s)

    Dim filePath As String
    filePath = "G:\迅雷下载\pic\pics5.jpg"

    'If m_fs.FileExists(filePath) Then Call m_fs.DeleteFile(filePath)
   ' Call sbls(0).SaveAs(filePath, fmt:=fmtEMF)

    Dim shp As Excel.Shape
    Set shp = AddPicture(filePath, rng)
    Call FillShape(shp, vbWhite)

    QR = ""

Finally:
On Error GoTo 0
   ' If m_fs.FileExists(filePath) Then Call m_fs.DeleteFile(filePath)
    Exit Function
Catch:
    QR = CVErr(xlErrValue)
    Resume Finally
End Function

Private Function DeleteShape(ByVal Target As Range)
    Dim ws As Worksheet
    Set ws = Target.Parent

    Dim shps As Excel.Shapes
    Set shps = ws.Shapes

    Dim shp As Excel.Shape
    Dim rng As Range
    Dim i As Long
    For i = shps.Count To 1 Step -1
        Set shp = shps(i)
        If shp.Type = msoPicture Then
            Set rng = ws.Range(shp.TopLeftCell, shp.BottomRightCell)
            If Not (Intersect(Target, rng) Is Nothing) Then shp.Delete
        End If
    Next
End Function

Private Function AddPicture(ByVal filePath As String, ByVal Target As Range) As Excel.Shape
    Dim shps As Excel.Shapes
    Set shps = Target.Parent.Shapes
    'MsgBox Target.Parent.Name
    Dim shp As Excel.Shape
    Set shp = Target.Parent.Shapes.AddPicture(filePath, True, True, Target.Left, Target.Top, 10, 10)

     With shp
        Call .ScaleHeight(1, msoTrue)
        Call .ScaleWidth(1, msoTrue)
        .LockAspectRatio = msoTrue
        .Placement = xlMoveAndSize
    End With

    If Target.Height * shp.Width <= Target.Width * shp.Height Then
        shp.Height = Target.Height - 10
    Else
        shp.Width = Target.Width - 10
    End If

    shp.Left = Target.Left + Target.Width / 2 - shp.Width / 2
    shp.Top = Target.Top + Target.Height / 2 - shp.Height / 2

    Set AddPicture = shp
End Function

Private Sub FillShape(ByVal shp As Excel.Shape, ByVal colorRgb)
    With shp.Fill
        .ForeColor.RGB = colorRgb
        .Transparency = 0
        .Solid
    End With
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值