Сохранение ячейки Форматирование текста после применения функции - PullRequest
1 голос
/ 14 февраля 2012

Я собираюсь показать немного надуманного примера, так что терпите его.

Наш продукт использует файлы CSV для переходных данных, данные, передаваемые между пользовательским интерфейсом Excel, Java-программу для манипулирования и передачи ее в бэкэнд SQL. У нас есть скрипт VBA, который обрабатывает всю работу Excel в следующем порядке:

Загрузка всех 8 файлов CSV на 8 листов в одном документе Excel. Затем выполните итерацию пакетов данных, выполнив следующие действия:

'Loop over data:
    Dim r As Range
    ...
    r.NumberFormat = "General"
    r.Formula = r.Formula
'End loop

Это приводит к тому, что весь лист заполняется данными из CSV, а числовые ячейки должны иметь внешний вид текста, а формулы Excel остаются без оценки. Запуск r.Formula = r.Formula запускает все функции для правильной оценки. Единственная проблема - форматирование чисел.

Файлы CSV иногда содержат вложенные файлы CSV. Например, одна ячейка может содержать «1,2,3,15,654». Эти ячейки всегда отображаются в виде текста. Тем не менее, существует крайний случай, когда ячейки могут быть симпатичными печатными числами, такими как «10 456 345». Excel преобразует эти числа в числовые ячейки после оценки всех функций и удаляет все запятые. Хотя примерно 20000 строк в документе являются правильными, 4 или около того строк, на которые это влияет, разрушают всю систему.

Есть ли способ запустить Excel для оценки функций из CSV, не меняя форматирование ячейки полностью из VBA? Смена форматов с CSV на SYLK не возможна, так как Java CSV Generator обрабатывается другим подразделением.

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

У меня есть альтернативный метод, который может подойти.

Я создал рабочий лист с 26 000 значений: строки, числа, даты, числа со встроенными запятыми и формулами.

Я запустил циклна приведенном выше листе, внутренний код которого был:

     ValueCell = .Cells(RowCrnt, ColCrnt).Formula
     If IsNumeric(Replace(ValueCell, ",", "")) Then
       .Cells(RowCrnt, ColCrnt).Formula = Replace(ValueCell, ",", "|")
     End If

.Cells(RowCrnt, ColCrnt).Formula, дает формулу, если ячейка содержит единицу, или значение, если ее нет.Если значение или формула с удаленными запятыми является числовым, я заменяю любые запятые трубами.

С 26 000 ячеек это заняло 59 секунд.Сравнивается ли это с вашими дополнительными 45 секундами на 500 строк?

Любые значения, например "1,2,3,15,654", теперь будут "1 | 2 | 3 | 15 | 654", но я предполагаю, что этоне проблема.Если у вас есть вложенные строки, такие как «ab, cd, ef», они все равно будут содержать запятые.Возможно, будет возможно проверить ведущий «=» для исключения формул и автоматически заменить запятые во всем остальном.

Следующий код занял 78 секунд для работы с 26 000 ячеек.

     ValueCell = .Cells(RowCrnt, ColCrnt).Formula
     If Left(ValueCell, 1) <> "=" Then
       .Cells(RowCrnt, ColCrnt).Formula = Replace(ValueCell, ",", "|")
     End If

Надеюсь, это поможет, если только даст вам новые идеи.

1 голос
/ 14 февраля 2012

Вы можете включить форматирование в текст во всех ячейках (Cells.NumberFormat = "@"), затем зациклить их и использовать свой код в ячейках, которые начинаются с '='. Если производительность является проблемой, вы должны поместить содержимое листа в массив, поработать с массивом и вернуть его обратно на лист. Если вы разместите больше кода и примеров данных, люди смогут поближе взглянуть.

EDIT

например, поместив следующие значения в столбец А (от А1 до А4) «Лист1» с форматированием текста:

13246
13564,4654,4565
654
=A1+A3

и используя следующий код:

Sub test()

    Dim a As Variant
    Dim result As Variant

    a = Sheets("Sheet1").UsedRange
    ReDim result(1 To UBound(a, 1), 1 To UBound(a, 2)) As Variant

    For i = 1 To UBound(a, 1)
      For j = 1 To UBound(a, 2)
        If Left(a(i, j), 1) = "=" Then
          result(i, j) = a(i, j)
        Else
          result(i, j) = "'" & a(i, j)
        End If
      Next j
    Next i

    Sheets("Sheet1").Cells(1, 2).Resize(UBound(result, 1), UBound(result, 2)) = result

End Sub

Результат помещается в столбец B и имеет вид:

13246
13564,4654,4565
654
13900
0 голосов
/ 15 февраля 2012

Я предлагаю альтернативный, более простой подход:

Рассматривали ли вы возможность записи в электронную таблицу Excel непосредственно из вашей программы Java, например, с помощью Apache POI ? Мне кажется, это было бы гораздо проще, менее надуманным и менее подверженным ошибкам, чем весь этот бизнес в области формул в CSV.

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