Замена запятых точками в скрипте Excel - PullRequest
4 голосов
/ 03 февраля 2011

Я хочу заменить запятую на точку и наоборот

Public Sub VirgulaPunct()
Dim oRow As Range
Dim cell As Range
Dim i As Long, j As Long
Dim MyString As String
Dim aux As String

    Application.ScreenUpdating = False

    For i = Selection(Selection.Count).Row To Selection.Cells(1, 1).Row Step -1

        For j = Selection(Selection.Count).Column To Selection.Cells(1, 1).Column Step -1
            MyString = Cells(i, j).Value
            For Counter = 1 To Len(MyString)
                aux = Mid(MyString, Counter, 1)
                If aux = "." Then

                  MyString = Replace(MyString, ".", ",", 1)

                ElseIf aux = "," Then

                  MyString = Replace(MyString, ",", ".", 1)

                End If
            Next
            Cells(i, j).Value = MyString
        Next j
    Next i
    Application.ScreenUpdating = True
End Sub

Ответы [ 5 ]

2 голосов
/ 04 января 2014

Основная проблема заключается в том, что если столбцы установлены как общие вместо текста, даже если мы изменили "," для "."Excell автоматически изменит его снова на «,».

Во избежание необходимости сначала установить столбец в текстовом формате, а затем выполнить функцию замены:

Thisу меня это работает:

Worksheets("Name").Activate
Worksheets("Name").Columns(1).Select 'or Worksheets("SheetName").Range("A:A").Select
Selection.NumberFormat = "@"

Dim OriginalText As String
Dim CorrectedText As String

LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

    For i = 1 To LastRow

    OriginalText = Worksheets("Name").Cells(i, 1).Value

    CorrectedText = Replace(OriginalText, ",", ".")

    Worksheets("Name").Cells(i, 1).Value = CorrectedText

    Next i
2 голосов
/ 03 февраля 2011

Вы можете использовать метод Replace объекта Range

Sub ReplacePunct()

    Const sTEMPCOMMA = "|comma|"
    Const sTEMPDOT = "|dot|"
    Const sCOMMA = ","
    Const sDOT = "."

    If TypeName(Selection) = "Range" Then
        With Selection
            .Replace sCOMMA, sTEMPCOMMA, xlPart
            .Replace sDOT, sTEMPDOT, xlPart
            .Replace sTEMPCOMMA, sDOT, xlPart
            .Replace sTEMPDOT, sCOMMA, xlPart
        End With
    End If

End Sub
0 голосов
/ 03 февраля 2011

Рассматривая его с точки зрения VB, а не VBA, я бы посмотрел на использование встроенной функции Replace, а не на цикл через нее.

Поэтому сначала я бы заменил все , на ; (или если в тексте может быть ;, я бы использовал что-то другое, возможно, комбинацию символов, например ;+;+ или аналогичную), затем замените все . на , и, наконец, замените все ; с ..
Возможно, не очень эффективно, но очень просто.

0 голосов
/ 03 февраля 2011

Это, кажется, продолжение моего ответа на ваш предыдущий вопрос, но если так, то я думаю, вы не поняли, что я имел в виду. Я взял ваш код и исправил его своим предложением, но я не проверял его:

Public Sub VirgulaPunct()
Dim oRow As Range
Dim cell As Range
Dim i As Long, j As Long
Dim MyString As String
Dim aux As String

    Application.ScreenUpdating = False

    For i = Selection(Selection.Count).Row To Selection.Cells(1, 1).Row Step -1

        For j = Selection(Selection.Count).Column To Selection.Cells(1, 1).Column Step -1
            MyString = Cells(i, j).Value
            MyString = Replace(MyString, ",", ";+;", 1)
            MyString = Replace(MyString, ".", ",", 1)
            MyString = Replace(MyString, ";+;", ".", 1)
            Cells(i, j).Value = MyString
        Next j
    Next i
    Application.ScreenUpdating = True
End Sub

Итак, как я сказал в своем предыдущем ответе, я делаю 3 вызова Replace, но я делаю их для всей строки, а не для каждого символа в строке.

Для дальнейшего использования, вероятно, было бы лучше, если бы вы обновили свой оригинальный вопрос, а не создали новый, и тогда вы могли бы оставить для меня комментарий под моим ответом, и я увидел, что вы это сделали.

0 голосов
/ 03 февраля 2011

Глядя на свои петли, вы не видите, что посещаете какую-либо клетку более одного раза.Разве простое утверждение не сработало бы здесь?

if(Cells(i,j).Value = ',')
  Cells(i,j).Value = '.'
Elsif(Cells(i,j).Value = '.')
  Cells(i,j).Value = ',')
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...