vba重复和部分字符串匹配

时间:2017-09-19 21:12:11

标签: vba excel-vba excel

如果有不同的位置,我有一个产品代码列表,我想在代码的末尾标记**。 为了详细说明,产品代码的一个例子是PFL512241-02,其中02是位置代码。所以如果我在列表中得到PFL512241-02和PFL512241-03,我想把我的结果标记为PFL512241-02 **;所以我的位置数量较少。如果PFL512241-02出现5次,结果应为PFL512241-02。如果PFL512241-02出现一次,那么我想忽略它,因为我只想要出现超过1次的产品。我也在计算每种产品的发生率。

现在我的代码只会在没有**的情况下获取产品代码,因此我需要帮助。

Option Explicit

Sub ProductNumT()

'Set up'
Dim LR1, LR2, LR3, LR4, LR5, LR6, LR7, LR8, LR9, i, j, k, l, m, n As Long
Dim Rng1, Rng2, Rng3, Rng4, cell As Range
Dim Selection, CBA, PNT As Worksheet

Set CBA = Worksheets("Master")
Set PNT = Worksheets("ProductNumT")
Set Selection = Worksheets("Selection")

LR1 = CBA.Cells(Rows.Count, "A").End(xlUp).Row


'Clear values
PNT.Columns("A:J").ClearContents



'Find products
   With CBA.Range("C2", "C" & LR1)
         .AutoFilter
         .AutoFilter Field:=14, Criteria1:=Selection.Range("B6").Value
         .Copy
        PNT.Range("B2").PasteSpecial Paste:=xlPasteValues
          .AutoFilter
    End With

 'Sort
PNT.Range("B2", "B" & LR1).Sort _
Key1:=Range("B1"), Order1:=xlAscending



'Product w/o location
    LR2 = PNT.Cells(Rows.Count, "B").End(xlUp).Row
        With PNT.Range("C2", "C" & LR2)
            .FormulaR1C1 = "=LEFT(RC[-1],9)"
            .Value = .Value
        End With

        For k = 2 To LR2
        PNT.Cells(k, 1).Value = 1
        Next k




'Find duplicates & extract unique values from the list

    PNT.Range("D2", "D" & LR2).Formula = "=SUMIFS(C1,C3,RC[-1])"
    PNT.Range("D2", "D" & LR2).Copy
    PNT.Range("D2").PasteSpecial Paste:=xlPasteValues

      For i = 2 To LR2
        If PNT.Cells(i, 4).Value <= 1 Then
            PNT.Rows(i).ClearContents
          End If

   Next i

     PNT.Range("B1").ClearContents
     PNT.Range("D2", "D" & LR2).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     PNT.Range("C2", "C" & LR1).Copy
     PNT.Range("E2").PasteSpecial Paste:=xlPasteValues
     PNT.Range("E2", "E" & LR1).RemoveDuplicates Columns:=1, Header:=xlNo



     'Main calculation
 LR4 = PNT.Cells(Rows.Count, "E").End(xlUp).Row
        With PNT.Range("F2", "F" & LR4)
            .FormulaR1C1 = "=INDEX(C2,MATCH(RC[-1],C3,0))"
            .Value = .Value
        End With

        With PNT.Range("G2", "G" & LR4)
            .FormulaR1C1 = "=INDEX(C4,MATCH(RC[-1],C2,0))"
            .Value = .Value
        End With

End Sub

第一张照片是我现在拥有的,第二张照片是我想要的结果。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为以下公式适用于F列

.FormulaR1C1 = "=INDEX(C2,MATCH(RC[-1],C3,0))&IF(COUNTIF(C2,INDEX(C2,MATCH(RC[-1],C3,0)))<COUNTIF(C3,RC[-1]),""**"","""")"

它计算B列中PFL180437-02(例如)的出现次数,如果小于C列中PFL180437的出现次数(因此还有其他一些) PFL180437-xx),它附加"**"

答案 1 :(得分:0)

不是答案,但是......

Dim LR1, LR2, LR3, LR4, LR5, LR6, LR7, LR8, LR9, i, j, k, l, m, n As Long
Dim Rng1, Rng2, Rng3, Rng4, cell As Range
Dim Selection, CBA, PNT As Worksheet

Selection是一个VBA对象。你不能拥有该名称的变量。

在第一行中,只有n是Long。所有其他都是未定义的,意思是变体。在第二行中,只有cell是一个范围,所有其他都是未定义的,因此是变体。在第三行中,只有PNT是工作表,所有其他都是未定义的,因此是变体。