Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA基于Excel中选定文本的自定义排序_Excel_Vba_Sorting_Split - Fatal编程技术网

使用VBA基于Excel中选定文本的自定义排序

使用VBA基于Excel中选定文本的自定义排序,excel,vba,sorting,split,Excel,Vba,Sorting,Split,背景: 我有一个Excel表格,有四列(标题、URL、状态、类型)。 该表混合了来自不同用户的文本,这些用户在列标题中使用不同的分隔符: 连字符(地面空气温度) 下划线(潜热通量) 加号和空白(+陆面高程+) 直接和空白(,总云量) 问题: 内置的自定义排序在一定程度上起作用。不幸的是,它没有针对每个条目的结尾(上面的示例) 所需解决方案: 我想选择一个特定的文本作为排序的标准 之前: 之后: 可能的方法: 我一直在考虑把这两行分开。很遗憾,我无法指定/自定义拆分。是否可以编写一个脚本,

背景:
我有一个Excel表格,有四列(标题、URL、状态、类型)。 该表混合了来自不同用户的文本,这些用户在列标题中使用不同的分隔符:

  • 连字符(地面空气温度)
  • 下划线(潜热通量)
  • 加号和空白(+陆面高程+)
  • 直接和空白(,总云量)
问题:
内置的自定义排序在一定程度上起作用。不幸的是,它没有针对每个条目的结尾(上面的示例)

所需解决方案:
我想选择一个特定的文本作为排序的标准

之前:

之后:

可能的方法:
我一直在考虑把这两行分开。很遗憾,我无法指定/自定义拆分。是否可以编写一个脚本,允许在指定点“剪切”文本(例如-平均海平面压力与其余部分分离并显示在另一列中)?
CLIM-PRO-CMIP-SINGLE-XXXX-M-HISTORICAL-mean-sea-level-pressure
另一个障碍可能是使用了不同的分离器

拆分前:

拆分后:
试试这个功能

Function EXTRACT_SORT_KEYWORDS(INPUT_TEXT As String) As String
  
  Application.Volatile
  
  Dim vSeparators As Variant
  Dim vKeywords As Variant
  Dim v As Variant
  
  EXTRACT_SORT_KEYWORDS = ""
  If Len(INPUT_TEXT) = 0 Then Exit Function
  
  ' Add more separators here
  vSeparators = Array(" ", ";", ",", "-", "_")
  
  ' Add more keywords here. Note the line continuations
  vKeywords = Array("mean sea level pressure", _
                    "surface air temperature", _
                    "latent heat flux", _
                    "land surface elevation", _
                    "land surface elevation", _
                    "total cloud cover", _
                    "cloud cover", _
                    "mean precipitation flux" _
              )

  For Each v In vSeparators
    If v <> " " And InStr(1, INPUT_TEXT, v, vbTextCompare) > 0 Then
      INPUT_TEXT = Replace(INPUT_TEXT, v, " ")
    End If
  Next v
  
  INPUT_TEXT = Trim$(INPUT_TEXT)
  
  
  For Each v In vKeywords
    If InStr(1, INPUT_TEXT, v, vbTextCompare) > 0 Then
      EXTRACT_SORT_KEYWORDS = v
      Exit Function
    End If
  Next v
  
End Function
函数提取\排序\关键字(输入\文本作为字符串)作为字符串
应用程序。挥发性
作为变型的Dim vSeparators
将关键字作为变量
Dim v作为变体
EXTRACT_SORT_KEYWORDS=“”
如果Len(INPUT_TEXT)=0,则退出函数
'在此处添加更多分隔符
vSeparators=数组(“,”;“,”,“,”,“-”和“”)
'在此处添加更多关键字。注意行的延续
vKeywords=数组(“平均海平面压力”_
“地面空气温度”_
“潜热通量”_
“地表高程”_
“地表高程”_
“总云量”_
“云量”_
“平均降水通量”_
)
对于v分离器中的每个v
如果v“”和InStr(1,输入_TEXT,v,vbTextCompare)>0,则
输入文本=替换(输入文本,v,“”)
如果结束
下一个v
输入文本=修剪$(输入文本)
对于vv中的每个v关键字
如果InStr(1,输入_TEXT,v,vbTextCompare)>0,则
提取\排序\关键字=v
退出功能
如果结束
下一个v
端函数
随着数据的增长,在工作表中使用许多用户定义的函数不是一个好主意,因为它们会大大降低应用程序的速度。更好的解决方案是让代码动态生成此列,执行排序,然后删除该列


希望这有帮助。

您好,请提供样品前后的图像。您可以手动完成此操作,并且示例不需要超过2或3行。请拍摄一张截图并上传。希望现在它更清晰。:)是的,这更清楚了,非常感谢。这当然是可以实现的,但您需要两件事:1是所有可能的分离器的完整列表,2是所有可能的排序关键字的完整列表(例如“平均海平面压力”、“版本5.1cds”等)。这些列表可以根据需要增长/收缩,但您有这样定义的列表吗?嗯,手头没有,但我可以生成它们。嗨,非常感谢。很抱歉我回复晚了,我正试着让它运行。不幸的是,它产生了一条错误消息(#Name),我无法找出原因。我可以想到可能发生这种情况的两个原因:要么是公式中有一个拼写错误(请检查您为函数输入的名称),要么是您没有将代码复制到正确的模块中。确保将其复制到常规vba模块(即,不是类模块)中。希望对你有用