VBA根据字符串名称从文件夹中获取图片。包含通配符

时间:2015-08-05 09:18:58

标签: vba

我有一个包含160行和2列数据的excel文件 - 文章名称,价格。 我还有一个文件夹,其中包含这些文章的照片。

问题是图片名称与我的Excel工作表中的文章名称不完全相同。

例如在我的表格中我有文章名称:“3714-012-P140”但在文件夹中它将是“3714-012-P140- - - ****”。

然而,在最初3个代码块(3714; 012;示例中为P140)之后,搜索中总会只显示1张图片。

如何选择带有通配符的图片呢?

此外,我如何将图片锁定到excel中的特定单元格?我的意思是,当我调整大小或删除某些行/列时,图片会沿着分配给它们的单元格移动。

Dim ws As Worksheet
Dim articleCode As String, _
    findStr     As String
Set ws = Workbooks(1).Worksheets(1)

For i = 1 to ws.UsedRange.Rows.Count
    articleCode = ws.Cells(i,1)
    findStr = 'some code
    ActiveSheet.Pictures.Insert( _
        "C:\...path...\" & findStr & ".jpg").Select
Next i

编辑:我需要将照片插入每行数据的第三列。

3 个答案:

答案 0 :(得分:1)

关于"锁定"将图片放入特定的单元格中。

有关如何将形状链接到单元格的信息,请参阅here

基本上你需要:

  1. 将图片放在单元格上。这可以通过设置图片(即形状)来实现.Top和.Left属性与您将图片链接到的单元格相同。

  2. 将形状的公式设置为等于单元格引用(这也会将形状的大小调整为与单元格大小相同,并且如果更改单元格大小,则会使其大小调整)。请参阅here

  3. 以下从here获取的代码将帮助您在与" findstring"匹配的文件夹中查找文件。 (需要进行调整!)

    Sub FindPatternMatchedFiles()
    
        Dim objFSO As Object
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    
        Dim objRegExp As Object
        Set objRegExp = CreateObject("VBScript.RegExp")
        objRegExp.pattern = ".*xlsx"
        objRegExp.IgnoreCase = True
    
        Dim colFiles As Collection
        Set colFiles = New Collection
    
        RecursiveFileSearch "C:\Path\To\Your\Directory", objRegExp, colFiles, objFSO
    
        For Each f In colFiles
            Debug.Print (f)
            'Insert code here to do something with the matched files
        Next
    
        'Garbage Collection
        Set objFSO = Nothing
        Set objRegExp = Nothing
    
    End Sub
    

答案 1 :(得分:0)

让您现有的代码调用一个接受文章名称(articleCode)的函数,并返回图像文件的路径:

strImage = FindImage(articleCode)
If Len(strImage) > 0 Then ActiveSheet.Pictures.Insert strImage

然后你可以像这样编写你的函数:

Function FindImage(strArticle As String) As String

    Dim objFile As Object
    With CreateObject("Scripting.FileSystemObject")
        For Each objFile In .GetFolder("c:\path\to\images").Files
            If StrComp(Left$(objFile.Name, Len(strArticle)), strArticle, vbTextCompare) = 0 Then

                ' Found an image file that begins with the article code.
                FindImage = objFile.Path
                Exit Function

            End If
        Next
    End With

End Function

答案 2 :(得分:0)

下面的函数使用articleCode,它是应该输入图片的图片,行和列的名称。

Function picInsert(articleCode As String, row As Integer, column As Integer)
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer
Dim ws As Worksheet
Set ws = Workbooks(1).Worksheets(2) 'your worksheet where the pictures will be put

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("...path...")

i = 1
For Each objFile In objFolder.Files
    If objFile.name Like (articleCode & "*") Then 'finds a picture with similar name to the one searched
        With ActiveSheet.Pictures.Insert(objFile.Path)
            With .ShapeRange
                .LockAspectRatio = msoTrue
                .Width = 5
                .Height = 15
            End With
            .Left = ActiveSheet.Cells(row, column).Left
            .Top = ActiveSheet.Cells(row, column).Top
            .Placement = 1 'locks the picture to a cell
        End With
    End If
    i = i + 1
Next objFile
End Function

这是一个测试子,我尝试了上面的功能。基本上是一个遍历行的简单循环,从第一列获取articleCode并使用上面的函数将图片输入第三列。

Public Sub test()
Dim ws As Worksheet
Dim i As Integer
Dim articleCode As String
Set ws = Workbooks(1).Worksheets(2)

For i = 1 To ws.UsedRange.Rows.Count
    articleCode = ws.Cells(i, 1)
    Call picInsert(articleCode, i, 3)
Next i
End Sub