Заменить метод и изменить формат? - PullRequest
0 голосов
/ 18 февраля 2019

Я использую метод vba Replace, и мне нужно поменять каждое " / " на ",".Это выглядит как простая задача, поэтому я использую:

ActiveWorkbook.Worksheets(2).Cells.Replace What:="_/_", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _
    ReplaceFormat:=True

Проблема в том, что одна из ячеек имеет значение, например:

04 _ / _ 2018

И результат:

4,2018

вместо:

04,2018

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

Я пытался обойти эту проблему, изменив параметры метода (ничего из этого не сработало) и изменив десятичный разделитель с "," на ".".Это помогло при использовании поиска и замены вручную из Excel, но когда я записываю его и пытаюсь использовать как макрос, это не работает.Что можно сделать, чтобы в этом случае Excel не обрезал нули?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Если вы хотите 04,2018, тогда используйте .Find/.FindNext, затем замените + восстановите значение перед помещением в ячейку.

Это то, что вы пытаетесь?

Sub Sample()
    Dim oRange As Range, aCell As Range, bCell As Range
    Dim ws As Worksheet
    Dim ExitLoop As Boolean
    Dim SearchString As String

    On Error GoTo Whoa

    Set ws = Worksheets("Sheet1")
    Set oRange = ws.UsedRange

    SearchString = "_/_"

    Set aCell = oRange.Find(What:=SearchString, LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)

    If Not aCell Is Nothing Then
        Set bCell = aCell

        If Left(aCell.Value, 1) = 0 Then
            aCell.Value = "'" & Replace(aCell.Value, SearchString, ",")
        Else
            aCell.Value = Replace(aCell.Value, SearchString, ",")
        End If

        Do While ExitLoop = False
            Set aCell = oRange.FindNext(After:=aCell)

            If Not aCell Is Nothing Then
                If aCell.Address = bCell.Address Then Exit Do
                If Left(aCell.Value, 1) = 0 Then
                    aCell.Value = "'" & Replace(aCell.Value, SearchString, ",")
                Else
                    aCell.Value = Replace(aCell.Value, SearchString, ",")
                End If
            Else
                ExitLoop = True
            End If
        Loop
    Else
        MsgBox SearchString & " not Found"
    End If

    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub

Снимок экрана

enter image description here

0 голосов
/ 18 февраля 2019

Ведущие нули автоматически удаляются в Excel по умолчанию.Таким образом, 04,2014 изменяется на 4,2014.Чтобы обойти эту проблему, нужно отформатировать ячейки как текст, добавив эту строку перед Replace():

ActiveWorkbook.Worksheets(2).Cells.NumberFormat = "@"

. Форматирование в текст имеет много неприятных изменений, например, текст перемещается влево иExcel не распознает даты / цифры по умолчанию.

Это простой пример кода, меняющий 1 ячейку:

Sub TestMe()
    ActiveWorkbook.Worksheets(1).Cells.NumberFormat = "General"
    Range("B5") = "05_2018"
    ActiveWorkbook.Worksheets(1).Cells.NumberFormat = "@"
    Range("B5") = Replace(Range("B5"), "_", ".")
End Sub

Форматирование в текст может работать следующим образом,для больших, неизвестных диапазонов:

Sub TestMe()

    Worksheets(1).Cells.NumberFormat = "General"
    Range("A1:B15") = "05_2018"

    Dim findRange As Range
    Set findRange = Worksheets(1).Cells.Find("_")
    Dim myCell As Range

    If Not findRange Is Nothing Then
        For Each myCell In findRange
            myCell.Replace "_", ","
        Next myCell
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...