Апостроф Excel VBA исчезает при копировании - PullRequest
1 голос
/ 13 марта 2019

Я переделываю макрос, работающий с длинными целыми числами, которые нельзя привести в научную нотацию (например, номера продуктов). В обычном мире я бы просто превратил их в строку, но Excel, похоже, все еще видит строку чисел в виде числа, даже если классифицируется как текст.

По этой причине я должен добавить апостроф ко всему столбцу, прежде чем что-либо менять с помощью следующего кода:

Function CleanColumn(Col As String, ws As Worksheet, Optional wb As Workbook)
    If wb Is Nothing Then Set wb = ThisWorkbook
    With ws
        arr = .Range(.Cells(2, Col), .Cells(.Rows.Count, Col).End(xlUp)).Value2
        For i = LBound(arr, 1) To UBound(arr, 1)
            arr(i, 1) = Chr(39) & Replace(arr(i, 1), Chr(45), vbNullString)
        Next i
        .Cells(2, Col).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    End With
End Function

Это работает хорошо, однако теперь мне нужно взять набор данных и разделить его на отдельные таблицы на основе значения одного столбца. Для этого я использовал следующее:

Function CopyByCriteria(Criteria As String, FilterRange As Range, SourceSheet As Worksheet, DestinationSheet As Worksheet)
    Dim pasteRow As Integer
    Dim c As Range

    pasteRow = 1

    For Each c In FilterRange
        If c = Criteria Then
            DestinationSheet.Rows(pasteRow) = SourceSheet.Rows(c.Row).Value2
            pasteRow = pasteRow + 1
        End If
    Next c
End Function

Проблема в том, что когда я использую функцию CopyByCriteria, добавленный мною апостроф отсутствует на новом рабочем листе, а цифры попадают в научную нотацию.

Какое решение для этого?

1 Ответ

1 голос
/ 13 марта 2019

Редактировать: Апостроф на самом деле не является частью формулы / значения ячейки. Он хранится в свойстве PrefixCharacter (доступ к нему можно получить с помощью ?ActiveCell.PrefixCharacter в вашем окне Immediate). Источник: https://www.ozgrid.com/forum/forum/help-forums/excel-general/136277-apostrophe-in-front-of-text

Чтобы быть на 100% уверенным, что вы копируете этот символ, вам придется скопировать значение / формулу И PrefixCharacter. Но это невозможно для всего ряда сразу.

Код ниже МОЖЕТ работать, но может и не работать (для меня это сработало, но вскоре перестало работать без особой причины).

Function CopyByCriteria(Criteria As String, FilterRange As Range, SourceSheet As 
Worksheet, DestinationSheet As Worksheet)
    Dim pasteRow As Integer
    Dim c As Range

    pasteRow = 1

    For Each c In FilterRange
        If c = Criteria Then
            DestinationSheet.Rows(pasteRow).formula = SourceSheet.Rows(c.Row).formula
            pasteRow = pasteRow + 1
        End If
    Next c
End Function

Чтобы быть на 100% уверенным, я бы предложил использовать либо метод Range.Copy, либо вручную скопировать (как это сделал OP со значением) обе формулы и PrefixCharacter каждой ячейки в строке по отдельности. Может быть, я предоставлю код для этого, когда у меня будет время.

...