我有一个excel文件,其中包含20k +图像的元数据信息。我正在尝试编写一个宏来执行exiftool.exe(一种用于批量编辑元数据的工具),并使用相对于每一行的变量重复执行。
例如,我想运行重复的exiftool命令,这些命令从B列(“作者”)获取信息,例如:
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列包含作者姓名。我正在尝试使用宏中A列和B列中单元格的相对信息。
提前致谢!
答案 0 :(得分: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字符串中通过加倍来转义)
答案 1 :(得分: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
您可以将参数作为字符串(lpParameters
)传递给它,获取返回值以帮助理解出现问题时发生的情况,并且通常比使用Shell
更通用。
你可以做类似的事情(这是不测试,因为我没有exiftool
。):
ShellExecute 0, vbNullString, "C:\exiftool\exiftool.exe", "-Author=""CELL B1 CONTENT""", vbNullString, 10 ' 10=SW_SHOWDEFAULT
我会根据您的要求填写作者。
有关ShellExecute
,click here的详细信息,请查看MSDN。