英文:
When I try to run Excel VBA code, gives me error message: Runtime error '-2145320854 (8021006a)?
问题
以下是您要翻译的代码部分:
Sub ExtractPhotoData()
'声明变量
Dim FSO As Object
Dim SourceFolder As Object
Dim FileItem As Object
Dim Image As Object
Dim RowCounter As Integer
RowCounter = 1
'设置文件系统对象和源文件夹
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(Worksheets("Sheet2").Cells(2, 9).Value)
'循环遍历源文件夹中的每个文件
For Each FileItem In SourceFolder.Files
'加载图像
Set Image = CreateObject("WIA.ImageFile")
Image.LoadFile FileItem.Path
'提取经度、纬度和高度数据
Dim Longitude As Long
Dim Latitude As Long
Dim Altitude As Long
Longitude = Image.Properties("GPS Longitude").Value
Latitude = Image.Properties("GPS Latitude").Value
Altitude = Image.Properties("GPS Altitude").Value
'将数据粘贴到工作表
RowCounter = RowCounter + 1
Cells(RowCounter, 1).Value = FileItem.Name
Cells(RowCounter, 2).Value = Longitude
Cells(RowCounter, 3).Value = Latitude
Cells(RowCounter, 4).Value = Altitude
Next FileItem
End Sub
英文:
I've been trying to create this code using VBA to extract the GPS data from a set of image files in a folder and paste the data into a collection of rows in an excel table. I have no previous experience with VBA and am still a relative novice when it comes to the coding world in general so I have no clue what I'm doing but I made this code that I thought would work using random posts of similar things I found online. Now the issue I'm facing is the error code that is shown in the title of the post. I tried googling the issue but to no avail as the one link with a similar situation was never resolved. This project has taken up quite a bit of time and my boss, who I am terrified of, is starting to passive aggressively breath down my neck for it. I am asking for your assistance sharks, with an investment of giving me the solution, in exchange for 15% of my company, Save-Me-From-My-Scary-Boss Inc.
Here's the code I used:
Sub ExtractPhotoData()
'Declare variables
Dim FSO As Object
Dim SourceFolder As Object
Dim FileItem As Object
Dim Image As Object
Dim RowCounter As Integer
RowCounter = 1
'Set up the file system object and source folder
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(Worksheets("Sheet2").Cells(2, 9).Value)
'Loop through each file in the source folder
For Each FileItem In SourceFolder.Files
'Load the image
Set Image = CreateObject("WIA.ImageFile")
Image.LoadFile FileItem.Path
'Extract the longitude, latitude, and altitude data
Dim Longitude As Long
Dim Latitude As Long
Dim Altitude As Long
Longitude = Image.Properties("GPS Longitude").Value
Latitude = Image.Properties("GPS Latitude").Value
Altitude = Image.Properties("GPS Altitude").Value
'Paste the data into the worksheet
RowCounter = RowCounter + 1
Cells(RowCounter, 1).Value = FileItem.Name
Cells(RowCounter, 2).Value = Longitude
Cells(RowCounter, 3).Value = Latitude
Cells(RowCounter, 4).Value = Altitude
Next FileItem
End Sub
答案1
得分: 2
代码部分不翻译,以下是翻译好的内容:
"The error you get is 'Name not found'. You get it when you try to access a property that doesn't exist. Not all images have GPS information stored, so you should be prepared.
Also, as far as I know, the GPS-property names don't contain a space, and you need to be careful with the upper- vs lowercases. It should be Image.Properties("GpsLongitude")
(see here)
You can get a list of all properties of an image with
Dim p
For Each p In Image.Properties
Debug.Print FileItem.Name, p.Name
Next
Next issue is that the properties for longitude and latitude don't return simple values. I checked with an image file and got an object of type 'IVector' for the values, containing 3 single values that define degree, minute and second, and you need additionally the property 'GpsLongitudeRef' to get N/S resp E/W.
For the altitude, you can read the value as 'Long', however there is more: the property contains, for example, also the unit ('m') and the 'GpsAltitudeRef' defines the reference ('Sea level').
I ended up with some example code
On Error Resume Next
Dim longitude As String
longitude = getLongLat(Image.Properties("GpsLongitude").Value, Image.Properties("GpsLongitudeRef").Value)
Dim latitude As String
latitude = getLongLat(Image.Properties("GpsLatitude").Value, Image.Properties("GpsLatitudeRef").Value)
Dim altitude As Long
altitude = Image.Properties("GpsAltitude").Value
On Error Resume Next
Debug.Print FileItem.Name, longitude, latitude, altitude
and the helper function
Function getLongLat(vector As Object, ref As String)
On Error Resume Next
getLongLat = vector(1) & ":" & vector(2) & ":" & vector(3) & " " & ref
End Function
Of course, it's up to you to convert longitude and latitude into numbers.
英文:
The error you get is "Name not found". You get it when you try to access a property that doesn't exist. Not all images have GPS information stored, so you should be prepared.
Also, as far as I know, the GPS-property names doesn't contain a space, and you need to be careful with the upper- vs lowercases. It should be Image.Properties("GpsLongitude")
(see here)
You can get a list of all properties of an image with
Dim p
For Each p In Image.Properties
Debug.Print FileItem.Name, p.Name
Next
Next issue is that the properties for longitude and latitude doesn't return simple values. I checked with an image file and got and object of type IVector
for the values, containing 3 single values that define degree, minute and second, and you need additionally the property "GpsLongitudeRef" to get N/S resp E/W.
For the altitude, you can read the value as Long
, however there is more: the property contains for example also the unit ("m") and the "GpsAltitudeRef" defines the reference ("Sea level").
I ended up with some example code
On Error Resume Next
Dim longitude As String
longitude = getLongLat(Image.Properties("GpsLongitude").Value, Image.Properties("GpsLongitudeRef").Value)
Dim latitude As String
latitude = getLongLat(Image.Properties("GpsLatitude").Value, Image.Properties("GpsLatitudeRef").Value)
Dim altitude As Long
altitude = Image.Properties("GpsAltitude").Value
On Error Resume Next
Debug.Print FileItem.Name, longitude, latitude, altitude
and the helper function
Function getLongLat(vector As Object, ref As String)
On Error Resume Next
getLongLat = vector(1) & ":" & vector(2) & ":" & vector(3) & " " & ref
End Function
Of course it's up to you to convert longitude and latitude into numbers.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论