0

我有一个 Excel 文件,其中包含 20k+ 图像的元数据信息。我正在尝试编写一个宏,该宏在 Windows Shell 上使用 exiftool.exe(一种用于批量编辑元数据的工具)执行命令,其中包含与每一行相关的变量。

例如,我想遍历从 B 列(“作者”)获取信息的 exiftool 命令,例如:

C:\exiftool\exiftool.exe -Author="CELL B1 CONTENT"
C:\exiftool\exiftool.exe -Author="CELL B2 CONTENT"

……无限重复。

这是我迄今为止尝试过的:

    Sub EnterMetadata()
    For Each Cell In Range("C1:C20000")
    Shell("c:\Exiftool\exiftool.exe -o I:/Photos/ & ActiveCell.Offset(0, -2).Value) & " -Author=" & ActiveCell.Offset(0, -1).Value) 
    Next
    End Sub

请注意,该列A包含原始文件的路径。列B包含作者姓名。我正在尝试从列中检索信息AB在宏中使用。

4

2 回答 2

1

未经测试:

Sub EnterMetadata()
    Const CMD As String = "c:\Exiftool\exiftool.exe -o ""I:/Photos/{fn}"" -Author=""{auth}"""
    Dim Cell as Range, s as String

    For Each Cell In Range("C1:C20000")
        s = Replace(CMD, "{fn}", Cell.Offset(0, -2).Value)
        s = Replace(s, "{auth}", Cell.Offset(0, -1).Value)

        Debug.Print s


        Shell s
    Next
End Sub

如果您的任何命令行参数可能包含空格,那么您应该引用它们(引号在 VBA 字符串中通过加倍来转义)

于 2014-07-15T23:27:54.827 回答
1

怎么用ShellExecute

这是您需要在宏中声明的内容,以便您可以使用它:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hWnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long

您可以将参数作为 String( lpParameters) 传递给它,获取返回值以帮助了解如果出现问题会发生什么,并且通常比使用更通用Shell

你可以做类似的事情(没有经过测试,因为我没有exiftool):

ShellExecute 0, vbNullString, "C:\exiftool\exiftool.exe", "-Author=""CELL B1 CONTENT""", vbNullString, 10 ' 10=SW_SHOWDEFAULT

我会让你根据你的要求填充作者。

有关 的完整信息ShellExecute请单击此处查看 MSDN。

于 2014-07-16T00:51:48.777 回答