2

Я использую VBA в Excel, чтобы просмотреть серию файлов и решить, какие из них импортировать. Я хотел бы решить, какие файлы импортировать, используя что-то вроде тегов файла, чтобы мне не нужно было открывать каждый файл. Я пытаюсь использовать метод GetDetailsOf чтобы получить их, но он терпит неудачу всякий раз, когда я пытаюсь использовать переменную для имени файла.

Этот код, использующий константу для имени файла, работает правильно:

Sub TestTags()
  Dim strPath As String
  Dim strFile As String

  strPath = "C:\Users\XXXX\Documents\Safe Space\MacroTest\"
  strFile = Dir(strPath & "*.xls*")
  Do While strFile <> ""
      Debug.Print GetTags()
      strFile = Dir()
  Loop
End Sub

Function GetTags()
  Const csFile As String = "MyTestFile.xlsx"

  With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
      GetTags = .GetDetailsOf(.Items.Item(csFile), 18)
  End With
End Function

Однако, когда я пытаюсь заменить константу переменной, переданной вызывающей подпрограммой, я получаю ошибку. Вот код ошибки:

Sub TestTags()
    Dim strPath As String
    Dim strFile As String

    strPath = "C:\Users\XXXX\Documents\Safe Space\MacroTest\"
    strFile = Dir(strPath & "*.xls*")
    Do While strFile <> ""
        Debug.Print GetTags(strFile)
        strFile = Dir()
    Loop
End Sub

Function GetTags(ByVal strFile As String)
    Const csFile As String = "MyTestFile.xlsx"
    Dim i As Integer

    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.Items.Item(strFile), 18)
    End With
End Function

Единственное, что я изменяю, это аргумент в .GetDetailsOf , переключающийся с постоянной на переменную. Всякий раз, когда он запускается, он останавливается на этой строке с «Ошибка 445: объект не поддерживает это действие»

Что я делаю неправильно?

3 ответа3

1

РЕДАКТИРОВАТЬ:

ХОРОШО. До сих пор не могу работать именно поэтому случай-не работает, но я обнаружил , что "правильный" способ получить объект FolderItem , соответствующий strFile (в соответствии с .GetDetailsOf()) должен использовать .ParseName() :

Function GetTags(ByVal strFile As String)
    Const csFile As String = "MyTestFile.xlsx"
    Dim i As Integer

    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.ParseName(strFile)), 18)
    End With
End Function

Я не могу объяснить, почему это не работает, но у меня есть три обходных пути.


1) Используйте CStr(strFile) вместо strFile при вызове .GetDetailsOf():

Function GetTags(ByVal strFile As String)
    Const csFile As String = "MyTestFile.xlsx"
    Dim i As Integer

    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.Items.Item(CStr(strFile)), 18)
    End With
End Function

или же

2) Измените тип параметра strFile на Variant:

Function GetTags(ByVal strFile As Variant)
    Const csFile As String = "MyTestFile.xlsx"
    Dim i As Integer

    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.Items.Item("" & strFile), 18)
    End With
End Function

или же

3) Конкатенация пустой строки в strFile при вызове .GetDetailsOf():

Function GetTags(ByVal strFile As Variant)
    Const csFile As String = "MyTestFile.xlsx"
    Dim i As Integer

    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.Items.Item("" & strFile), 18)
    End With
End Function
-1

Функция Dir() НЕ возвращает полный путь, она только возвращает имя файла и расширение. Поэтому, когда вы пытаетесь получить доступ к тегам, вы передаете только имя файла и расширение, если получаете результат Dir(). Вместо этого предварительно проложите путь, как показано ниже. Я изменил имя переданной переменной в GetTags, чтобы избежать путаницы.

Sub TestTags()
    Dim strPath As String
    Dim strFile As String

    strPath = "C:\Users\XXXX\Documents\Safe Space\MacroTest\"
    strFile = Dir(strPath & "*.xls*")
    Do While strFile <> ""
        Debug.Print GetTags(strPath & strFile)
        strFile = Dir()
    Loop
End Sub

Function GetTags(ByVal strFullPath As String)
    With CreateObject("Shell.Application").Namespace("C:\Users\XXXX\Documents\Safe Space\MacroTest\")
        GetTags = .GetDetailsOf(.Items.Item(strFullPath), 18)
    End With
End Function
-1

добавление + 0 или & vbnullstring & "" к переменной для передачи во многих случаях приводит к автоматическому преобразованию в требуемый тип. Какой-то добрый языковой дизайнер много лет назад, должно быть, положил рутину

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .