2013-06-10 3 views
1

Я довольно новичок в vba и пытаюсь написать фрагмент кода, который найдет дубликат в столбце, а затем переименует дубликат соответственно, выполнит поиск образца кода, но не может найти еще что-нибудь подходящее! :(Excel VBA (Duplicates/Increment)

Может кто-нибудь помочь, пожалуйста? Выборочные данные

Column ...

SAPR1945/1 
SAPR1945/1 
SAPR1945/1 
SAPR1945/1 
SAPR1934/3 
SAPR1934/3 
SAPR1342/2 
SAPR1342/2 

Мне нужно, чтобы это выглядело, как показано ниже, где, если дубликаты найдены то последний символ первой ячейки, повторяющиеся изменяется на 1 и последующие дубликаты для этой ячейки увеличенными ...

SAPR1945/1 
SAPR1945/2 
SAPR1945/3 
SAPR1945/4 
SAPR1934/1 
SAPR1934/2 
SAPR1342/1 
SAPR1342/2 

Надежда, что имеет смысл и кто-то может помочь?

Благодаря в ожидании :)

+3

Чистый код написания запросов по теме на Stackoverflow. Попробуйте написать код, и если он не работает должным образом, задайте конкретный вопрос, показывающий ваш ввод, ожидаемый вывод, фактический вывод и код, и вам следует получить лучшую помощь. – assylias

ответ

1

Сначала код итерацию по колонке А (начиная со строки 1) и изменяет все числа мимо / к 1. Затем он снова итерации через столбец и, если находит дубликат, затем увеличивает счетчик числа, следующего за знаком /. Довольно прямо вперед я думаю

Option Explicit 

Sub Main() 

    Dim ws As Worksheet 
    Set ws = Sheets(1) 

    Dim i&, j&, cnt&, tmp 
    For i = 1 To ws.Range("A" & Rows.Count).End(xlUp).Row 
     tmp = Split(ws.Range("A" & i).Value, "/") 
     ws.Range("A" & i).Value = tmp(0) & "/" & "1" 
    Next i 
    For i = 1 To ws.Range("A" & Rows.Count).End(xlUp).Row 
     For j = 1 To ws.Range("A" & Rows.Count).End(xlUp).Row 
      If i <> j Then 
       If ws.Range("A" & i).Value = ws.Range("A" & j).Value Then 
        tmp = Split(ws.Range("A" & i).Value, "/") 
        cnt = tmp(1) + 1 
        ws.Range("A" & j).Value = tmp(0) & "/" & cnt 
       End If 
      End If 
     Next j 
     cnt = 0 
    Next i 

End Sub 
+0

+1 проверено, и это делает работу. – brettdj

+0

Это замечательно, спасибо, очень простая логика итерации и перехода на меня прошла мимо! ... ваш быстрый ответ был также оценен ... Top Dog, спасибо еще раз. – user2470367

1

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

Если данные в A1:A10 затем:

руководство

  • В B1 поставил =LEFT(A1,FIND("/",A1)) & COUNTIF($A$1:A1,A1) и скопируйте в B10
  • При необходимости, копировать и вставить результаты обратно на A

код

Sub QuickDupes() 
Dim rng1 As Range 
Set rng1 = Range([a1], Cells(Rows.Count, "A").End(xlUp)) 
With rng1 
.Offset(0, 1).Insert 
.Offset(0, 1).FormulaR1C1 = "=LEFT(RC[-1],FIND(""/"",RC[-1])) & COUNTIF(R1C1:RC[-1],RC[-1])" 
.Value = .Offset(0, 1).Value 
.Offset(0, 1).Delete 
End With 
End Sub 
+0

+1 хорошая альтернатива. im не слишком хорош с формулами, поэтому его приятно тоже изучить альтернативу VBA –

+0

Это также очень полезно, спасибо за информацию и быстрый ответ, очень ценится. – user2470367