Как создать функцию Excel VBA, которая работает при повторном открытии документа? - PullRequest
1 голос
/ 28 июля 2011

ОК, я только что написал очень простой сценарий VBA, который отключается и захватывает размер файла, найденного в указанном месте ( edit код обновления с dscarr ):

Public Function FileSize(path As String) As Variant 
    On Error GoTo Err_FileSize:
    Dim retVal As Variant 
    Dim filesys As Object 
    Dim file As Object 
    retVal = "" 
    Set filesys = CreateObject("Scripting.FileSystemObject") 
    Set file = filesys.GetFile(path) 
    retVal = file.Size 

    Exit_FileSize: On Error Resume Next 
    FileSize = retVal 
    Exit Function 

    Err_FileSize: retVal = "Error: " & Err.Description 
    Resume Exit_FileSize 
End Function

Если я импортирую это в новую рабочую книгу, сохраните документ как «книгу с поддержкой макросов Excel» вместе с пустым файлом с именем readme.txt, а затем поместите «./readme.txt» в A1 и «= FileSize (A1 ) "в A2, A2 правильно оценивает размер файла readme.txt, 0 байт. Отлично. Если я затем сохраню документ, закрою и снова открою его, меня предупреждают, что макросы отключены. Если я включу их, содержимое A2 изменится на #VALUE!, и я ничего не сделаю, чтобы функция снова заработала. Кто-нибудь видел это раньше, кто-нибудь может указать на ошибку, которую я здесь делаю?

edit : похоже, проблема вызвана тем, что я использовал относительные пути. Я не могу объяснить, почему он работает для новой книги, но не один раз сохранен и открыт, но использование абсолютных путей решает проблему, которая, как определил dscarr, была проблемой «Файл не найден».

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Я продублировал ваш код в книге Excel 2007 Macro Enabled и обнаружил, что она прекрасно работает со следующими предостережениями

  1. Он не обновляет значение автоматически (например, запускает функцию FileSize) при открытии книги.Это можно компенсировать добавлением некоторого кода в обработчик событий Worrkbook_Open, который вычисляет рабочую книгу.

  2. Я получаю ошибку #VALUE, когда не удается найти указанный файл.Действительно, если файл отсутствует или имеет неправильное имя, строка «Set file = filesys.GetFile (path)» выдает ошибку 53 «Файл не найден».В этом случае возвращаемое значение никогда не устанавливается, потому что строка кода, которая его устанавливает, никогда не вызывается.Вы можете попробовать установить значение по умолчанию «Файл не найден», прежде чем пытаться получить размер файла.

0 голосов
/ 28 июля 2011

В Excel 2010 выберите «Файл» -> «Параметры» -> «Центр управления безопасностью» -> «Параметры макроса» и убедитесь, что выбрана кнопка «Включить».

...