Как удалить ведущий апостроф ячейки (или диапазона) в Excel?
то есть:
Пробовали следующие значения, но все они не включают в себя ведущий апостроф:
xlRange.Value
xlRange.Value2
xlRange.get_Value(Type.Missing)
Также попытался использовать код замены ниже, но не работал:
xlRange.Replace("'", "", Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByRows, true, Type.Missing, Type.Missing, Type.Missing);
xlRange.NumberFormat возвращает "General"
Цель ведущего апострофа с числовыми значениями в Excel заключается в том, чтобы пометить контент как "текст", который также выравнивает его влево. Это можно увидеть, запросив содержимое ячейки в окне Immediate окна редактора VBA (Ctrl + G):
?ActiveCell.Value
Если это выполняется в тексте (с апострофом), результат будет скрыт в левой части окна. При выполнении над номером перед результатом предшествует пробел.
Преобразование содержимого ячейки в число удаляет апостроф. Попытка сделать это для нечислового содержимого приводит к ошибке. Следующий код демонстрирует, как это можно сделать в VB-talk:
Sub ConvertLeftAlignedNumber()
Dim rng As Excel.Range
Dim rngVal As Variant
Set rng = xlApp.ActiveCell
rngVal = rng.Value
If IsNumeric(rngVal) Then
rng.Value = Val(rngVal)
End If
End Sub
В С# используйте Double.TryParse()
вместо IsNumeric
Если проблема заключается в том, чтобы удалить ведущие апострофы из текста, а также числа, это можно сделать для текстовых значений, указав текстовое содержимое на переменную, очистив ячейку, а затем вернув значение обратно.
//test data
Excel.Range rngString = ws.get_Range("B12", missing);
Excel.Range rngLeftValue = ws.get_Range("D14", missing);
Excel.Range rngValue = ws.get_Range("A15", missing);
rngString.Value2 = "'test";
rngLeftValue.Value2 = "'10";
rngValue.Value2 = 10;
//Is numeric?
Double val;
if (Double.TryParse(rngString.Value2.ToString(), out val))
{
System.Diagnostics.Debug.Print(val.ToString());
}
else //it a string
{
string sString = rngString.Text.ToString();
rngString.Clear();
string sStringx = sString.Substring(0);
rngString.Value2 = sStringx;
System.Diagnostics.Debug.Print(rngString.Value2.ToString());
}
if (Double.TryParse(rngLeftValue.Value2.ToString(), out val))
{
System.Diagnostics.Debug.Print(val.ToString());
}
if (Double.TryParse(rngValue.Value2.ToString(), out val))
{
System.Diagnostics.Debug.Print(val.ToString());
}
В VB (A) можно использовать функцию Right
:
Dim s As String
s = CStr(ActiveCell.Value2)
ActiveCell.Clear
ActiveCell.Value2 = Right(s, 1)