代码之家  ›  专栏  ›  技术社区  ›  DJCrowen

搜索xlsx以查找值,如果找到,请替换为其他值

  •  -2
  • DJCrowen  · 技术社区  · 7 年前

    所以我要么太具体了,要么搜索得不够好,因为我找不到任何答案。所以我来这里寻求帮助。情况如下:

    我有一个excel工作表,我们称之为“CustomerCodeReference”,它有一列(a)客户代码(即A2001、A2002、B3900、Q2838等,不一定按顺序排列),大约3000个,在(B)上的下一列中,我有代码所代表的组(即Accounts Primary、Accounts Secondary、Admin组、User组,只是不同的名称等等)

    现在,从我们公司的服务器上,我可以导出客户报告的电子表格,但问题是,他们用客户代码+报告序列号来标记。工作表导出为多个列,但其中一列(G)包含客户代码和序列号,每行是一个报告,有时根据设置的日期范围有数百个。因此,与此示例保持一致,假设它是来自“Accounts Primary”的报告,其标签为A2001234567(其中客户代码“A2001”后的所有内容都是报告序列号)。有时,报告可能来自多个客户,因此列中每行可能有多个代码+序号。

    鉴于我有数千个这样的代码和组,是否有一些宏可以创建,每次我导出报告电子表格时,我可以复制“CustomerCodeReference”表,让它自动搜索客户代码和SNs列,然后用实际名称替换代码,或将实际名称放在后面的另一行(空)。所以我基本上可以很容易地引用它是谁的报告,而不必每次都查找代码?

    我意识到我需要在VBA中完成这项工作,因为我想不出任何公式能够奏效。 我想我有一些职业球员:

    -我已经有了主代码列表,所以即使有数千个代码,它们都列在A列中,它们引用的组的实际名称在B列中。

    -代码是一致的,一个字母,后跟4个数字,所以总是5个字符长。

    -拉取报告时,它总是将工作表命名为“Customer Reports”,以便于参考

    这些是常量。因此,我需要实际的客户名称来替换代码(同时保持序列号不变),或者如果更简单,将实际名称添加到同一行的下一个空列中。我可能还需要与同事分享这一点,所以基本上只需向他们发送“CustomerCodeReference”表,当他们将其添加到所有拉入的电子表格中时,也会执行相同的操作。(将启用宏,因此无需担心)

    这是不是太复杂了?或者我能完成它吗?提前感谢您的帮助!

    编辑:很抱歉,我完全忘了附加任何类型的代码。这是我在VBA中想到的,但我不确定我是否走上了正确的道路,因为它并没有完成替换,而且我无法让它在下一个可用的空单元格中添加值。

    Sub replaceStringInCell()
    
        'declaring my sheet I want to change change customer codes in
        Dim CustomerCodes As Range
        'declaring strings I will be replacing and with what I will be                    replacing them
        Dim ReportNumbers As Range
        Dim CustomerNames As Range
    
        'identifying column I am working to replace, also trying to shoot for next empty column
        Set CustomerCodes = PulledReports.Worksheets("Customer Reports").Range("G:G")
    
        'specifying my strings
        ReportNumbers = PulledReports.Worksheets("Customer Reports").Range("G:G")
        myReplacementString = PulledReports.Worksheets("Customer Code Reference").Range("A:A")
    
        'replace string in cell
        CustomerCodes.Value = Replace(Expression:=CustomerCodes.Value, Find:=ReportNumbers, Replace:=CustomerNames)
    
    End Sub
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Alisson Bezerra    7 年前

    这应该可以做到:

    Sub stack_overflow()
    
    Dim cust As Worksheet
    Dim ref As Worksheet
    
    Set cust = ActiveWorkbook.Worksheets("Customer Reports")
    Set ref = ActiveWorkbook.Worksheets("Customer Code Reference")
    
    'Finding next empty column
    
    Dim column As Integer
    column = cust.UsedRange.Columns.column + 1
    
    'Filling this columns
    
    For Each cell In cust.Range("G2:G" & cust.Cells(Rows.Count, "G").End(xlUp).Row)
        cust.Cells(cell.Row, column).Value = Application.WorksheetFunction.VLookup(Left(cell.Value, 5), _
            ref.Range("A2:B" & ref.Cells(Rows.Count, "B").End(xlUp).Row), 2, False)
    Next cell
    
    End Sub