2016-12-13 2 views
1

Я делаю некоторые обработки данных, и я использовал кодИспользование InStr для определения количества вхождений определенного символа?

If InStr(1, cell.Value, "/") > 1 Then 
    cell.Replace "/", ", " 
End If 

Теперь я понимаю, что было бы, если появились «/» больше, чем когда-то было бы тогда идти вперед и заменить его «». Однако кажется, что даже если есть только 1 "/", он все равно выполняет замену. Я не мастер кодирования, но кажется, что математика немного испорчена. Кто-нибудь знает, в чем проблема?

Edit: Полный код

Sub Title() 

Application.ScreenUpdating = False 
Dim rng As Range 
Dim ws As Worksheet 
Set ws = ActiveSheet 
Dim cell As Range 
Set rng = ws.Range(ws.Cells(2, 2), ws.Cells(ws.Rows.Count, 2).End(xlUp)) 

For Each cell In rng 
    If InStr(1, cell.Value, " ") > 0 Then 
     cell.Value = " " & cell.Value & " " 
    End If 
Next cell 
rng.Replace " ", " " 
'Data Breakdown 

'Remove phrases 
rng.Replace "at *", "" 
rng.Replace "We're *", "" 
rng.Replace "We are *", "" 
rng.Replace "we're *", "" 
rng.Replace "we are *", "" 

For Each cell In rng 

    If (Len(myCell) - Len(Replace(myCell, "/", ""))) > 1 Then 
    myCell = Replace(myCell.Text, "/", "") 
    End If 


If InStr(1, cell.Value, " Manager of ") > 0 Then 
    cell.Replace " Manager of ", " Manager, " 
End If 

Next cell 

rng.Replace " IT ", " IT, " 
rng.Replace " Manager ", " Manager, " 
Application.ScreenUpdating = True 
End Sub 
+1

Instr находит позицию в строке первого вхождения, а не количество вхождений. Вы спрашиваете, находится ли '/' в позиции 2 или выше, если существует более одного '/'. Замена заменит все вхождения. –

+1

Instr возвращает местоположение искомой строки, а не счет. –

+0

Просмотрите документацию [msdn documentation] (https://msdn.microsoft.com/en-us/library/office/gg264811.aspx) функции InStr. – dee

ответ

4

Если вы хотите заменить все «/», если есть больше чем два, то:

If (Len(myCell) - Len(Replace(myCell, "/", ""))) > 1 Then 
    myCell = Replace(myCell.Text, "/", "") 
End If 

Если вы хотите что-то еще, пожалуйста, конкретный.

+1

@ScottCraner Упс. Спасибо –

+0

@TimWilliams Спасибо –

+0

Я прошу прощения за то, что не яснее. Это именно то, что мне хотелось бы для выполнения чего-либо в предоставленном ответе не работает для меня. По какой-то причине, когда я смотрю шаг за шагом, он переходит к вашему оператору if, а затем подходит к концу, если он не соответствует перечисленным стандартам. –

0

Оператор Like делает его легче проверить, если значение содержит или начинается/заканчивается что-то:

For Each cell In rng 

    If cell Like "*/*/*" Then cell.Replace "/", ", " ' * matches 0 or more characters 

Next cell 

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

For Each cell In rng 

    a = Split(cell, "/") 

    If UBound(a) > 1 Then cell.Value = Join(a, ", ") 

Next cell 

Вы также можете сразу заменить все клетки без цикла с фильтром Excel Data:

Set rng = Columns("F")   ' the filter needs the first header cell 

rng.AutoFilter 1, "*/*/*"  ' add Excel Data Filter to the Range 
rng.Replace "/", ", ", xlPart ' ignores the filtered cells 
rng.AutoFilter     ' optional to remove the filter 
Смежные вопросы