2009-08-26 7 views
9

Estoy escribiendo una herramienta que sincroniza una base de datos simple con hojas de Excel. Cada elemento en una tabla en la base de datos corresponde a una fila en la hoja de trabajo. Leí la hoja de Excel en la herramienta usando C# y la interfaz de interoperabilidad de Excel, luego comparé los valores de los elementos (es decir, una de las columnas en la hoja de Excel) después de la sincronización solo para asegurarme de que son iguales.Cómo hacer que Excel ignore el apóstrofo al principio de la celda

Ayer me encontré con un caso en el que la comparación no era cierto:

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

El segundo es el que yo he leído desde Excel y como se puede ver que ha saltado el primer apóstrofe. ¿Hay alguna manera de decirle a Excel que trate la celda como solo texto (no, solo establecer el formato de la celda no ayuda)?

Incluso he intentado copiar el valor ('hola') de una celda en VBA así:

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 

El resultado fue que el valor de la celda objetivo es siempre hola'

Si no hay manera, voy a tener que hacer algo feo como

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

Respuesta

9

Me temo que el apóstrofe ' es un carácter especial para Excel cuando aparece como el primer carácter en una celda que has encontrado. Le dice a Excel que trate el resto de la cadena como texto, para que pueda ingresar algo como '34.2 en la celda, y lo tratará como la cadena en lugar del número (para formatear, etc.).

Te sugiero que hagas algo similar a lo que has sugerido, excepto que cuando lo estés colocando en Excel, verifica el primer carácter y agrega un ' adicional si ya hay alguno.

Como alternativa, podría anteponer un apóstrofo a todos los valores, si lo desea como texto. De esta forma no necesita la verificación adicional del primer carácter.

1

tratar targetcell.Value en su lugar. .Formula es la fórmula que se ve en la barra de fórmulas, mientras que .Value es el valor evaluado de la celda.

Por lo tanto, supongo que también habría usado .Formula en su código original. Cambiar eso debería funcionar.

EDITAR: Ok, no funcionó (avergonzado).

Excel trata especialmente la cita individual inicial, de modo que incluso las propiedades oscuras de celdas/rango no tienen acceso. La única solución que pude encontrar es esencialmente la misma que pensaste inicialmente. Aquí va:

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

No, eso no ayuda, pruébelo usted mismo. Ver mi función actualizada de VBA. – Srekel

4

ver la propiedad PrefixCharacter del objeto Range que corresponde a esa celda

De la ayuda:

Si la propiedad TransitionNavigKeys es False, este carácter prefijo se ' para un texto etiqueta, o en blanco.Si la propiedad TransitionNavigKeys es True, este personaje será "para una etiqueta justificado a la izquierda," para una etiqueta justificado a la derecha,^para una etiqueta centrada, \ para un etiqueta repetida, o en blanco.

La parte TransitionNavigKeys se refiere a la compatibilidad de 1-2-3 por lo que es más que probable que va a ser False

respuesta basada en el artículo en:

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

(advertencia: puede aparecer un poco molesto pop-up)


edición: en realidad esto probablemente no va a ser cualquier uso, ya PrefixCharacter es de sólo lectura :(

edit2: estaba en lo cierto la primera vez. PrefixCharacter solo se llena si el valor agregado a la celda comenzó con 'tan solo read PrefixCharacter más Value y concatenate. Mientras TransitionNavigKeys es False, es decir

0

Usted puede tratar de dejar pendiente con anterioridad una comilla simple a los campos de texto ('' '' + dbField) en su consulta de modo que para los campos con comillas simples incrustadas su consulta devolvería :

"''stuff in single quotes'" 

que cuando se coloca en una celda de Excel se convertiría en:

"'stuff in single quotes'" 

de personajes que no estaban en las cotizaciones que se obtendría:

"'stuff that wasn't in quotes" 

que cuando se coloca en una celda de Excel se convertiría en:

"stuff that wasn't in quotes" 

la pena intentarlo. :-)

Cuestiones relacionadas