Excel中使用VBA写个函数,包含什么文字就显示什么文字。

需求如下:

Excel 的 D列是包含文字,E列是显示文字,也即是对应表。也即是说,DE这两列是参数预设表。

B列是数据,C列写公式呈现结果。

若B列的文字包含了D列其中某个单元格的文字,同时若E列对应行有文字,就显示E列的对应文字,否则显示D列的对应文字。

(比如,若B列文字中出现了【汽油】C列就直接显示【汽油】,若B列文字包含了【住宿】C列就显示【差旅费】)

 

 

 

由于Excel的VBA年代久远,很少使用,因此决定使用AI来生成。

一开始用公式,不行,改用VBA。

本来以为是很简单的事情,结果我使用了ChatGPT4.0和其它多个大模型,花费大量时间,都无法解决问题。

最终参考了:在Excel中循环遍历区域的每一行  : https://cloud.tencent.com/developer/ask/sof/70391

轻松解决。

看来大语言模型还是长路漫漫啊。。。

代码如下:(写好后,Excel里按下F9来更新)

 

Function CheckProduct(CheckCell As Range, ProductRange As Range) As String

'excel,D列有很多产品名称,比如”国际货物“,“餐饮”,”标签“,等等。
'请在C1里写个excel公式,

'例如B1里是:¥99999.00-国际货物运输代理服-044032200211
'如果B1的文字里包含D列里的产品名称,比如”国际货物“,那么C1就显示“国际货物”,

'如果B1包含”餐饮“,那么C1就显示“餐饮”,
'如B1包含“标签”C1就显示”标签“,
'……直到不包含D列里的产品名称,其余就显示”其它“

'C2里写的公式是:=CheckProduct(B2,$D$2:$D$50)
'D列是:包含文字,国际货物,汽油,标签,机票,住宿,餐饮,餐费
'E列是:显示文字,,差旅费,差旅费,差旅费,差旅费

    Dim cell As Range
    Dim product As Variant
    CheckProduct = "其它" ' 默认返回值
 


'旧的方法,麻烦,必须写死Range在这里

    ' 循环遍历每个产品名称
    '注意不能直接使用 For Each cell In ProductRange,'更不能使用 Range(ProductRange),不知道为什么!
    
 '   For Each cell1 In Range("D1:D50") '必须把Range写死在这里!
  '      product = cell1.Value
  '      ' 如果单元格中包含产品名称,则返回该产品名称
  '      If InStr(1, CheckCell.Value, product) > 0 And product <> "" Then
   '         CheckProduct = product
  '          Exit Function
 '       End If
  '  Next cell1
  
   
 '新的方法,好用,解决了!
 Set rng = ProductRange ' Range("D1:D50")

For Each Row In rng.Rows
  For Each cell In Row.Cells
    'Do Something
    product = cell.Value '比如D列
    ShowDetail = cell.Offset(0, 1).Value '比如E列
    If InStr(1, CheckCell.Value, product) > 0 And product <> "" Then
        'Debug.Print (product & "," & ShowDetail)
        'MsgBox (product & "," & ShowDetail)
        If ShowDetail = "" Then
            CheckProduct = product
        Else
           CheckProduct = ShowDetail
        End If
     
        Exit Function
    End If
  Next cell
Next Row
End Function


 

 

posted @ 2024-01-15 11:28  zzgreg  阅读(441)  评论(0)    收藏  举报