Как запретить Excel искажать формулу, вставленную моим скриптом VBA - PullRequest
1 голос
/ 29 мая 2020

У меня есть сценарий VBA в книге Excel, который собирает результаты из всех книг в определенной папке.

Private Sub Workbook_Open()

    Dim path As String
    Dim fso As Object
    Dim folder As Object
    Dim file As Object

    Dim i As Integer

    Dim data As Object

    Set data = Worksheets("RawData")
    path = data.Range("A1").Value

    i = 3

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)   

    data.Rows("2:" & data.Rows.Count).ClearContents

    For Each file In folder.Files
        If Right(UCase(file.name), 5) = ".XLSX" And Left(file.name, 1) <> "~" Then
            data.Cells(i, 2) = "='" + path + "\[" + file.name + "]Summary'!A1:J1"
            i = i + 1
        End If
    Next file

End Sub

Идея состоит в том, что для каждого файла .xlsx в данной папке я добавляю ссылка на диапазон результатов в этом файле. Например, если есть файл Test1.xlsx в папке C:\Sheets, VBA помещает следующую формулу в некоторую строку на листе, содержащем скрипт:

='C:\Sheets\[Test1.xlsx]Summary'!A1:J1

Excel затем извлекает значения из Test1 и помещает их на лист RawData текущей книги.

Это работало до сегодняшнего дня, когда мои формулы начали заканчиваться @ сразу после знака =, например:

=@'C:\Sheets\[Test1.xlsx]Summary'!A1:J1

Это дает мне #VALUE?.

Excel любезно предоставил мне сообщение о том, что он только что начал вставлять @ в формулы из-за некоторых изменений синтаксиса, но это не повлияет расчеты. Я не могу заставить это сообщение появиться снова, но в этом была его суть. Очевидно, это влияет на расчеты. Если я вручную удаляю @ из формулы, все работает нормально.

У меня есть Office 365, и я полагаю, что недавно получил обновление, в котором была добавлена ​​эта «функция», потому что раньше все это работало нормально.

Если я изменю сценарий VBA для ссылки только на одну ячейку, @ не будет вставлен. Но использование именованного диапазона для результатов (а не A1:J1) по-прежнему вызывает проблему.

У кого-нибудь есть идеи по обходному пути?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Чтобы избежать вставки @, используйте свойство .Formula2 объекта диапазона. Это изменение связано с функцией массива Dynami c в Excel O365

0 голосов
/ 29 мая 2020

Вы можете присвоить формулу переменной, а затем удалить @ из строки с помощью функции Right() ...

Поскольку длина строки будет динамической c в зависимости от длину имени файла, я использовал функцию Len(), чтобы получить полную длину строки, затем минус 2 из нее, чтобы удалить = и @.

Обратите внимание на = объединяется с функцией Right() при присвоении значения ячейке.

Dim FormulaString as String
    For Each file In folder.Files
        If Right(UCase(file.name), 5) = ".XLSX" And Left(file.name, 1) <> "~" Then
            FormulaString = "='" + path + "\[" + file.name + "]Summary'!A1:J1"
            data.Cells(i, 2) = "=" & Right(FormulaString, Len(FormulaString) - 2)
            i = i + 1
        End If
    Next file

Вывод

='C:\Sheets\[Test1.xlsx]Summary'!A1:J1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...