Как заставить Excel игнорировать апостроф в начале ячейки

Я пишу инструмент, который синхронизирует простую базу данных с листами Excel. Каждый элемент в таблице в базе данных соответствует одной строке на рабочем листе. Я прочитал лист Excel в инструмент, используя C# и интерфейс взаимодействия Excel, а затем сравнил значения элементов (т. Е. Один из столбцов в листе Excel) после синхронизации, чтобы убедиться, что они равны.

Вчера я нашел случай, когда сравнение не соответствует действительности:

"'<MedalTitle>' Medal - <MedalDescription>"
"<MedalTitle>' Medal - <MedalDescription>"

Второй - тот, который я прочитал в Excel, и, как вы можете видеть, он пропустил первый апостроф. Есть ли способ заставить Excel воспринимать ячейку как просто текст (нет, просто настройка форматирования ячейки не помогает)?

Я даже пытался скопировать значение ('привет') ячейки в VBA следующим образом:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   Target.Offset(1, 0).Value = Target.Worksheet.Range("b2").Value
   Target.Offset(2, 0).Value = Target.Worksheet.Range("b2").Formula
   Target.Offset(3, 0).Formula = Target.Worksheet.Range("b2").Formula
   Target.Offset(4, 0).Formula = Target.Worksheet.Range("b2").Value
End Sub

Результатом было то, что значение целевой ячейки всегда привет

Если нет возможности, мне придется сделать что-то ужасное, как

if (dbitem.value[0] == ''' )
{
   // stuff
}
else
{
   // regular comparison
}

4 ответа

Решение

Боюсь апостроф ' является специальным символом для Excel, когда он появляется как первый символ в найденной ячейке. Он говорит Excel обрабатывать остальную часть строки как текст, так что вы можете ввести что-то вроде '34.2 в ячейке, и он будет обрабатывать ее как строку вместо числа (для форматирования и так далее).

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

В качестве альтернативы, вы можете добавить апостроф ко всем значениям - если вы хотите, чтобы все они были в виде текста. Таким образом, вам не нужна дополнительная проверка первого символа.

Посмотрите на PrefixCharacter собственность Range объект, который соответствует этой клетке

Из справки:

Если TransitionNavigKeys свойство False Этот префиксный символ будет 'для текстовой метки или пустым. Если TransitionNavigKeys свойство True, этот символ будет "для выровненной по левому краю метки", для выровненной по правому краю метки, "^" для центрированной метки, "\" для повторяющейся метки или пустым.

TransitionNavigKeys часть относится к совместимости с Lotus 1-2-3, так что, скорее всего, будет False

Ответ на основании статьи по адресу:

http://excel.tips.net/Pages/T003332_Searching_for_Leading_Apostrophes.html

(предупреждение: может появиться немного раздражающее всплывающее окно)


редактировать: на самом деле это, вероятно, не будет никакого смысла, потому что PrefixCharacter только для чтения:(

edit2: я был прав в первый раз. PrefixCharacter Заполняется, только если значение, добавленное в ячейку, начинается с ', поэтому просто прочитайте обратно PrefixCharacter плюс Value и объединить. Пока TransitionNavigKeys является False , то есть

Пытаться targetcell.Value вместо. .Formula формула, видимая в строке формул, в то время как .Value является оцененным значением ячейки.

Итак, я предполагаю, что вы бы использовали .Formula в исходном коде. Изменение, которое должно работать.

РЕДАКТИРОВАТЬ: Хорошо, это не сработало (смущенно).

Excel обрабатывает начальную одинарную кавычку особенно... так, что даже скрытые свойства ячейки / диапазона не имеют доступа. Единственный обходной путь, который я смог найти, по сути, такой же, как вы думали изначально. Вот оно:

If VarType(cell) = 8 And Not cell.HasFormula Then
 GetFormulaI = "'" & cell.Formula
Else
 GetFormulaI = cell.Formula
End If

Вы можете попробовать предварительно подвести одну кавычку к текстовым полям ( '''' + dbField) в вашем запросе, чтобы для полей со встроенными одинарными кавычками ваш запрос возвращал:

"''stuff in single quotes'"

который при помещении в ячейку Excel конвертируется в:

"'stuff in single quotes'"

за символы, которых не было в кавычках, вы получите:

"'stuff that wasn't in quotes"

который при помещении в ячейку Excel конвертируется в:

"stuff that wasn't in quotes"

Стоит выстрел.:-)

Другие вопросы по тегам