2009-08-26 15 views
9

Piszę narzędzie, które synchronizuje prostą bazę danych z arkuszami Excel. Każda pozycja w tabeli w bazie danych odpowiada jednemu wierszowi w arkuszu roboczym. Przeczytałem arkusz Excela w narzędziu przy użyciu C# i interfejsu interopowego programu Excel, a następnie porównałem wartości elementów (tj. Jedną z kolumn w arkuszu Excela) po synchronizacji, aby upewnić się, że są równe.Jak uzyskać Excel ignorować apostrof na początku komórki

Wczoraj znalazłem przypadek, gdy porównanie nie było prawdą:

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

Drugi to jeden Czytałem z Excela, a jak widać to pominięty pierwszy apostrof. Czy istnieje sposób, aby powiedzieć programowi Excel, aby traktował komórkę jako zwykły tekst (nie, po prostu ustawienie formatowania komórki nie pomaga)?

Próbowałem nawet skopiować wartość ('hello') komórki w VBA tak:

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 

Rezultatem było to, że wartość komórki docelowej jest zawsze hello”

Jeśli nie ma sposobu, będę musiał zrobić coś brzydki jak

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

Odpowiedz

9

Obawiam apostrof ' jest specjalny znak dla programu Excel, gdy pojawi się jako pierwszy znak w komórce jako znalazłeś. Informuje program Excel, aby traktował pozostałą część ciągu jako tekst, aby można było wpisać w komórce coś w rodzaju '34.2, a potraktuje to jako ciąg zamiast numeru (w celu formatowania itd.).

Proponuję zrobić coś podobnego do tego, co zasugerowałeś, z wyjątkiem tego, że umieszczasz go w Excelu, sprawdź pierwszą postać i dodaj dodatkową ', jeśli już tam jest.

Ewentualnie możesz dodać apostrof do wszystkich wartości - jeśli chcesz je wszystkie jako tekst. W ten sposób nie potrzebujesz dodatkowej kontroli pierwszego znaku.

1

spróbować targetcell.Value zamiast tego. .Formula jest formułą widoczną na pasku formuły, a .Value jest wartością oszacowaną komórki.

Zgaduję, że użyłbyś również .Formula w oryginalnym kodzie. Zmiana tego powinna zadziałać.

EDYCJA: Ok, to nie działało (zawstydzało).

Program Excel traktuje początkową pojedynczą wycenę specjalnie .. tak specjalnie, że nawet niejasne właściwości komórki/zakresu nie mają dostępu. Jedyne obejście, jakie mogłem znaleźć, jest zasadniczo takie samo, jak początkowo sądziłeś. Tu idzie:

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

Nie, to nie pomaga - spróbuj sam. Zobacz moją zaktualizowaną funkcję VBA. – Srekel

4

Spójrz na właściwości obiektu Range która odpowiada tej komórki

Z pomocą PrefixCharacter:

Jeśli właściwość TransitionNavigKeys jest False, ta postać prefiks będzie " dla tekstu etykieta lub puste miejsce.Jeżeli nieruchomość TransitionNavigKeys jest True, postać ta będzie "na lewej uzasadnionego label" dla prawym uzasadnionego etykiecie^o środku etykiety \ dla powtarzającego etykiecie lub puste.

TransitionNavigKeys część dotyczy kompatybilności Lotus 1-2-3, więc jest to bardziej niż prawdopodobne będzie False

odpowiedzi na podstawie artykułu pod adresem:

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

(uwaga: może pojawić się nieco denerwujące pop-up)


edit: faktycznie to prawdopodobnie nie będzie Jakiekolwiek użycie ponieważ PrefixCharacter jest tylko do odczytu :(

edit2: Miałem rację za pierwszym razem. PrefixCharacter zostanie wypełnione tylko wtedy, gdy wartość dodana do komórki zaczyna się od ', po prostu odczytaj ponownie PrefixCharacter oraz Value i połącz. Dopóki TransitionNavigKeys jest False, to

0

Można spróbować wstawienie apostrof do swoich pól tekstowych („” „” + dbField) w zapytaniu tak, że dla pól z wbudowanych apostrofami zapytanie wróci :

"''stuff in single quotes'" 

który po umieszczeniu w komórce Excel będzie konwertować do:

"'stuff in single quotes'" 

dla znaków, które nie były w cudzysłowie, co można uzyskać:

"'stuff that wasn't in quotes" 

który po umieszczeniu w komórce Excel będzie konwertować do:

"stuff that wasn't in quotes" 

warto spróbować. :-)