C # Заменить ведущий апостроф Excel COM - PullRequest
0 голосов
/ 06 декабря 2018

Как удалить ведущий апостроф ячейки (или диапазона) в Excel?

, т. Е.

Cell value

Пробовалследующие значения, но все они не включают в себя ведущий апостроф:

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 возвращает "Общие "

1 Ответ

0 голосов
/ 06 декабря 2018

Цель ведущего апострофа с числовыми значениями в Excel - пометить содержимое как «текст», что также выровняет его по левому краю.Это можно увидеть, запросив содержимое ячейки в «Немедленном окне» редактора VBA (Ctrl + G):

?ActiveCell.Value

Если это выполняется для текста (с апострофом), результат будет сброшенным с левой стороныокна.При выполнении над числом перед результатом стоит пробел.

Преобразование содержимого ячейки в число удаляет апостроф.Попытка сделать это с нечисловым содержимым приводит к ошибке.Следующий код демонстрирует, как это можно сделать на языке VB:

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

В C # используйте 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's 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)
...