Непоследовательная обработка гиперссылок в Excel - PullRequest
0 голосов
/ 06 августа 2020

Years a go, у меня был макрос Outlook, который архивировал электронные письма, используя книгу Excel в качестве индекса. Я потерял этот макрос и теперь пытаюсь воссоздать его как макрос Excel.

Мой макрос создает одну строку для каждого архивированного сообщения электронной почты, содержащую все свойства, которые меня интересуют. Кроме того, тело текста сохраняется как файл TXT, тело html сохраняется как файл HTML, а все вложения сохраняются как файлы соответствующего типа. Гиперссылки используются для привязки строки к этим файлам.

Макрос находится в папке, которую я буду называть X. X находится в папке OneDrive, что может иметь значение. Чтобы не было слишком много файлов в папке, я получаю по одной папке в год, когда приходит электронное письмо. В этой папке есть одна папка в месяц, когда приходило электронное письмо. Файлы имеют имена:

  • Текстовое тело: ddXXXX.txt
  • Html тело: ddXXXX. html
  • Приложение №: ddXXXXan.yyy

где:

  • dd - это день получения электронного письма
  • «XXXX» уникален для каждого электронного письма в течение месяца со значениями «AAAA», «AAAB. »,« AAAC »и т. Д.
  • « a »определяет файл как вложение.
  • n - номер вложения
  • « yyy »- подходящее расширение для вложение.

Все гиперссылки создаются с помощью:

With WshtInx
  .Hyperlinks.Add .Cells(Row, Col), PathFileName, , , TextToDisplay
End With

Для основного текста TextToDisplay - «Текст». Для тела html TextToDisplay - это «HTML». Для вложения TextToDisplay - это исходное имя вложения.

Все файлы вложения сохраняются с использованием Email.Attachment(n).SaveAsFile.

Текст и Html тела сохраняются с использованием Adodb Stream как файлы UTF8 без спецификации. Используемая процедура приведена ниже.

Если я открываю папку «X \ yyyy \ mm», все файлы присутствуют и регистрируются в правильной программе. Если я щелкну любой из файлов, он откроется правильной программой.

Если в таблице индекса я щелкну одну из гиперссылок вложения, вложение немедленно откроется с помощью правильной программы.

Если я нажму на гиперссылку Html в теле, меня предупредят, что это местоположение может быть небезопасным. Если я нажму «Продолжить», мой браузер откроет тело html.

Если я нажму на гиперссылку текстового тела, меня предупредят, что это местоположение может быть небезопасным. Если я нажму «Продолжить», меня спросят: «Как вы хотите открыть этот файл?» Мой текстовый редактор (Notepad ++) отображается по умолчанию, но я все равно должен нажать «Да», чтобы продолжить. Это не имеет значения для следующего текста, если я поставлю галочку «В любом случае используйте это приложение для открытия файлов .txt».

Файл OneDrive имеет два местоположения: мой жесткий диск c и сетевой адрес. Я зарегистрировал папку X на моем жестком диске c как безопасное место. Попытка зарегистрировать сетевое местоположение в качестве безопасного отклоняется, поскольку оно уже зарегистрировано.

Дополнительные шаги для доступа к тексту и html телам - это неприятность, но не более чем неприятность. Если мне снова понадобится электронное письмо, я не удаляю его из Outlook. В прошлом я главным образом использовал этот индекс для поиска писем, которые находились не в той папке.

Однако я бы предпочел избежать этих дополнительных шагов, если кто-то может предложить причину несоответствий и метод их устранения. избегая этого.

Моя процедура сохранения файлов UT8 без спецификации:

    Public Sub PutTextFileUtf8NoBom(ByVal PathFileName As String, ByVal FileBody As String)
    
      ' Outputs FileBody as a text file named PathFileName using
      ' UTF-8 encoding without leading BOM
      
      ' Needs reference to "Microsoft ActiveX Data Objects n.n Library"
      ' Addition to original code says version 2.5. Tested with version 6.1.
    
      '  1Nov16  Copied from http://stackoverflow.com/a/4461250/973283
      '          but replaced literals with constants.
      ' 15Aug17  Discovered routine was adding an LF to the end of the file.
      '          Added code to discard that LF.
      ' 11Oct17  Posted to StackOverflow
      '  9Aug18  Comment from rellampec suggested removal of adWriteLine from
      '          WriteTest statement would avoid adding LF.
      ' 30Sep18  Amended routine to remove adWriteLine from WriteTest statement
      '          and code to remove LF from file. Successfully tested new version.
    
      ' References: http://stackoverflow.com/a/4461250/973283
      '             https://www.w3schools.com/asp/ado_ref_stream.asp
    
      Dim BinaryStream As Object
      Dim UTFStream As Object
    
      Set UTFStream = CreateObject("adodb.stream")
    
      UTFStream.Type = adTypeText
      UTFStream.Mode = adModeReadWrite
      UTFStream.Charset = "UTF-8"
      UTFStream.Open
      UTFStream.WriteText FileBody
    
      UTFStream.Position = 3 'skip BOM
    
      Set BinaryStream = CreateObject("adodb.stream")
      BinaryStream.Type = adTypeBinary
      BinaryStream.Mode = adModeReadWrite
      BinaryStream.Open
    
      UTFStream.CopyTo BinaryStream
    
      UTFStream.Flush
      UTFStream.Close
      Set UTFStream = Nothing
    
      BinaryStream.SaveToFile PathFileName, adSaveCreateOverWrite
      BinaryStream.Flush
      BinaryStream.Close
      Set BinaryStream = Nothing
    
    End Sub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...