Апостроф Excel VBA исчезает при копировании

#excel #vba #long-integer

#excel #vba #длинное целое число

Вопрос:

Я перерабатываю макрос, имеющий дело с длинными целыми числами, которые не могут быть преобразованы в научную нотацию (например, идентификационные номера продукта). В обычном мире я бы просто преобразовал их в строку, но 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) amp; 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. DestinationSheet.Rows(pasteRow) = Chr(45) amp; SourceSheet.Rows(c.Row).Value2 Изменило бы это поведение?

2. Каково значение и тип SourceSheet.Rows(c.Row).Value2 ?

3. Если вы форматируете их как number с 0dp, они также переключаются на scientific?

4. @jsheeran — c.Сама строка — это просто номер строки, который нужно вставить. Каждая строка состоит из 45 столбцов, которые представляют собой комбинацию строк, процентов, валют и дат

5. После DestinationSheet.Rows(pasteRow) = SourceSheet.Rows(c.Row).Value2 вы могли бы попробовать DestinationSheet.Rows(pasteRow).numberformat= SourceSheet.Rows(c.Row).numberformat

Ответ №1:

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

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

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

 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%, я бы предложил использовать либо диапазон.Скопируйте метод или скопируйте вручную (как это сделал OP со значением) как формулу, так и префиксный символ каждой ячейки в строке отдельно. Возможно, я предоставлю код для этого, когда у меня будет немного времени.

Комментарии:

1. @MKaras- Это интересно в отношении апострофа; я понятия не имел, что он обрабатывается как функция, но это имеет большой смысл, учитывая, как он оценивается. Тем не менее, я получаю ошибку несоответствия типов в вашем решении. Я думаю, это потому, что я копирую строку, а не одну ячейку.

2. Моя ошибка. Исправлено. Идеальное решение. Спасибо!

3. У меня это перестало работать, поэтому я провел еще несколько исследований и отредактировал свой ответ с результатами.