2015-10-01 4 views
-1

Итак, у меня есть куча столбцов, которые нужно заменить буквой, это старый подписанный материал переполнения. Так что в основном я хочу заменить буквы цифрами, а затем умножить их на 0,02 для каждой ячейки.Заменить функцию в VBA excel

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

Так в основном, я буду иметь столбец как 1. 0000012C = 0000х 0,02 = 2,46 2. 0002927B = 29272 х 0,02 = 585,44

Private Sub CommandButton1_Click() 
Dim OriginalText As String 
Dim CorrectedText As String 

OriginalText = Range("A1:D15").Value 

CorrectedText = Replace(OriginalText, "A", "1") 
CorrectedText = Replace(OriginalText, "B", "2") 
CorrectedText = Replace(OriginalText, "C", "3") 
CorrectedText = Replace(OriginalText, "D", "4") 
CorrectedText = Replace(OriginalText, "E", "5") 
CorrectedText = Replace(OriginalText, "F", "6") 
CorrectedText = Replace(OriginalText, "G", "7") 
CorrectedText = Replace(OriginalText, "H", "8") 
CorrectedText = Replace(OriginalText, "I", "9") 
CorrectedText = Replace(OriginalText, "{", "0") 
CorrectedText = Replace(OriginalText, "}", "-0") 

Worksheets("Sheet1").Range("F1:I15").Value = CorrectedText 
End Sub 

Это то, что я до сих пор, но Я не думаю, что я делаю это правильно, может ли кто-нибудь с большим опытом работы с vb в excel взглянуть.

ответ

2

Несколько вещей.

  1. Вы хотите перебрать каждую ячейку по отдельности с For Each цикла.

  2. Нет необходимости корректировать текст. Просто сохраните значение в исходном тексте. То, как вы это сделали, заменило бы исправленный текст каждой новой строкой, так что единственное, что было бы показано, было бы последним, используя исходный текст, только он сохраняет изменения на каждой замене.

  3. Используйте смещение, чтобы поместить значение в правильную ячейку.

    Dim OriginalText As String 
    Dim cell As Range 
    Dim aws As Worksheet 
    Dim dws As Worksheet 
    
    Set aws = ActiveSheet 
    Set dws = ActiveWorkbook.Sheets("Sheet1") 
    For Each cel In aws.Range("A1:D15") 
        OriginalText = cel.value 
        OriginalText = Replace(OriginalText, "A", "1") 
        OriginalText = Replace(OriginalText, "B", "2") 
        OriginalText = Replace(OriginalText, "C", "3") 
        OriginalText = Replace(OriginalText, "D", "4") 
        OriginalText = Replace(OriginalText, "E", "5") 
        OriginalText = Replace(OriginalText, "F", "6") 
        OriginalText = Replace(OriginalText, "G", "7") 
        OriginalText = Replace(OriginalText, "H", "8") 
        OriginalText = Replace(OriginalText, "I", "9") 
        OriginalText = Replace(OriginalText, "{", "0") 
        OriginalText = Replace(OriginalText, "}", "-0") 
        dws.Range(cel.Address).Offset(, 5) = OriginalText 
    Next cel 
    

Если вы хотите сделать умножение каждого числа, когда вы поместите его в новую ячейку, измените эту строку:

 dws.Range(cel.Address).Offset(, 5) = OriginalText 

к:

 dws.Range(cel.Address).Offset(, 5) = OriginalText * .01 
+0

Ого, Круто, как делает cel.offset работу? что представляют собой 5? Как я могу умножить вывод на 0.01? –

+0

@SaadA Я пропустил, где вы хотели его на другом листе, я отредактировал ответ. Смещение принимает ячейку и перемещает ее в другую ячейку. Метод таков: 'Смещение (строки, столбцы)'. Поскольку строки равны 0, его можно пропустить для сокращения. То же самое со столбцами, если столбцы равны 0, это будет '.Offset (1)' означать одну строку вниз в том же столбце. –

+0

Спасибо, Скотт! Я ударился головой о стену, чтобы найти хороший день, пытаясь понять это сам! –

0

Саад ,

Ниже приведен код, который будет работать для вас.

Private Function DoReplace(Text As String) As String 
    Dim ReplacedValue As String 
    ReplacedValue = Text 

    ReplacedValue = Replace(ReplacedValue, "A", "1") 
    ReplacedValue = Replace(ReplacedValue, "B", "2") 
    ReplacedValue = Replace(ReplacedValue, "C", "3") 
    ReplacedValue = Replace(ReplacedValue, "D", "4") 
    ReplacedValue = Replace(ReplacedValue, "E", "5") 
    ReplacedValue = Replace(ReplacedValue, "F", "6") 
    ReplacedValue = Replace(ReplacedValue, "G", "7") 
    ReplacedValue = Replace(ReplacedValue, "H", "8") 
    ReplacedValue = Replace(ReplacedValue, "I", "9") 
    ReplacedValue = Replace(ReplacedValue, "{", "0") 
    ReplacedValue = Replace(ReplacedValue, "}", "-0") 

    DoReplace = ReplacedValue 
End Function 

Private Sub CommandButton1_Click() 
    Dim Text As String, CalculatedValue As Double 

    For Each cell In Worksheets("Sheet1").Range("A1:D15").Cells 
     If cell.Value <> "" Then 
      Text = DoReplace(cell.Value) 
      CalculatedValue = Val(Text) * 0.02 
      Worksheets("Sheet2").Cells(cell.Row, cell.Column).Value = CalculatedValue 
     End If 
    Next 

End Sub 

Приведенный выше код будет выполнять все заменяет и расчеты, и поместить окончательный вывод в Лист2 той же строке той же колонке.

+0

Спасибо, Шалвин, я тоже попробую! –

+0

@SaadA Я вижу в этом [сообщение] (http: // stackoverflow.com/questions/32914947/replace-function-and-negative-values ​​/ 32915540 # 32915540), что вы использовали этот метод. Вы должны изменить правильный ответ и дать кредит там, где он должен. –

0

Эта версия выполняет замену по всему диапазону:

Option Explicit 

Private Sub CommandButton1_Click() 

    replaceLetters Worksheets("Sheet1").Range("A1:D15") 

End Sub 

Private Sub replaceLetters(ByRef rng As Range, Optional ByVal offsetCol As Long = 1) 

    Const RELACEMENTS As String = "A1 B2 C3 D4 E5 F6 G7 H8 I9 {0 }-0" 
    Const TIMES   As String = " x 0.02" 

    Dim newRng As Range, replVals As Variant, rv As Variant 

    replVals = Split(RELACEMENTS) 

    Application.ScreenUpdating = False 

    Set newRng = rng.Offset(0, rng.Column + rng.Columns.Count + (offsetCol - 1)) 

    newRng.Value2 = rng.Value2 'copy values to the offset range 

    For Each rv In replVals 
     With newRng 
      .Replace What:=Left(rv, 1), Replacement:=Right(rv, Len(rv) - 1) & TIMES, _ 
        LookAt:=xlPart 
     End With 
    Next 

    newRng.EntireColumn.AutoFit 

    Application.ScreenUpdating = True 
End Sub 
+0

Таким образом, он автоматически заменит то, что находится между A1 и D15, я думаю, это было бы лучше, чем положить его в новый рабочий лист. Спасибо. –

Смежные вопросы