Как заставить Excel игнорировать апостроф в начале ячейки - PullRequest
10 голосов
/ 26 августа 2009

Я пишу инструмент, который синхронизирует простую базу данных с листами 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 ]

10 голосов
/ 26 августа 2009

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

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

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

4 голосов
/ 27 августа 2009

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

Из справки:

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

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

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

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

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


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

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

1 голос
/ 26 августа 2009

вместо targetcell.Value. .Formula - это формула, отображаемая в строке формул, а .Value - это оцененное значение ячейки.

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

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

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

If VarType(cell) = 8 And Not cell.HasFormula Then
 GetFormulaI = "'" & cell.Formula
Else
 GetFormulaI = cell.Formula
End If
0 голосов
/ 27 августа 2009

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

"''stuff in single quotes'"

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

"'stuff in single quotes'"

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

"'stuff that wasn't in quotes"

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

"stuff that wasn't in quotes"

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

...