从字符串

时间:2018-02-04 17:22:48

标签: excel string excel-vba numbers vba

我正在尝试使用Excel中的函数从字符串中提取所有数字。 在第二次,我想提取字符串中包含的最大值。

我的字符串看起来像: ATCG = 12.5,TTA = 2.5,TGC = 60.28

期望的输出: 60.28

第一次,我试图用我的功能提取所有数字,但它只在第一个数字上停止。

Function MyCode(ByVal txt As String) As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "\d.+"
        If .test(txt) Then MyCode = .Execute(txt)(0)
    End With
End Function

4 个答案:

答案 0 :(得分:1)

以下是一些 VBA (非vbscript),您可以根据自己的需要进行调整:

String

enter image description here

注:

这会产生Number而不是=MyCode(A1)

修改#1:

在Excel-VBA中,代码必须放在标准模块中。

用户定义函数(UDF)非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除UDF:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 从Excel使用UDF:

      private Date getDate(List<BrowseHistory> historyList, String subscribe, String cancelled) {
          return IntStream.range(0, historyList.size())
                  .filter(i -> isContainsStatus(historyList.get(i), subscribe) && isStatusExist(historyList, cancelled, i))
                  .mapToObj(historyList::get)
                  .map(BrowseHistory::getCreated)
                  .findFirst() // find first that got through those filters
                  .orElse(null);
      }
      

      要了解有关宏的更多信息,请参阅:

      http://www.mvps.org/dmcritchie/excel/getstarted.htm

      http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

      有关UDF的详细信息,请参阅:

      http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

      必须启用宏才能使其生效!

答案 1 :(得分:1)

如果你有一个包含AGGREGATE功能的Excel(2010+)版本,你真的不需要VBA,你可以使用工作表公式来实现:

=AGGREGATE(14,6,--TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,",",REPT(" ",99)),"=",REPT(" ",99)),seq_99,99)),1)

其中 seq_99 是引用的命名公式:

=IF(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))=1,1,(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))-1)*99)

该函数产生一个数组,其中一些值是数字; AGGREGATE函数返回数组中的最大值,忽略错误。

下面的公式适用于早期版本的Excel,必须输入为数组公式,方法是在按下 ctrl + shift 时按输入如果您正确执行此操作,Excel会在公式周围放置大括号{...}

如果您有2007,则可以使用IFERROR

=MAX(IFERROR(--TRIM(MID(SUBSTITUTE(SUBSTITUTE(A2,",",REPT(" ",99)),"=",REPT(" ",99)),seq_99,99)),0))

对于早期版本,您可以使用:

=MAX(IF(ISERROR(--TRIM(MID(SUBSTITUTE(SUBSTITUTE(A3,",",REPT(" ",99)),"=",REPT(" ",99)),seq_99,99))),0,--TRIM(MID(SUBSTITUTE(SUBSTITUTE(A3,",",REPT(" ",99)),"=",REPT(" ",99)),seq_99,99))))

答案 2 :(得分:0)

将所有混合数字收集为数组中的双精度数并返回最大值。

Option Explicit
Option Base 0    '<~~this is the default but I've included it because it has to be 0

Function maxNums(str As String)
    Dim n As Long, nums() As Variant
    Static rgx As Object, cmat As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    maxNums = vbNullString

    With rgx
        .Global = True
        .MultiLine = False
        .Pattern = "\d*\.\d*"
        If .Test(str) Then
            Set cmat = .Execute(str)
            'resize the nums array to accept the matches
            ReDim nums(cmat.Count - 1)
            'populate the nums array with the matches
            For n = LBound(nums) To UBound(nums)
                nums(n) = CDbl(cmat.Item(n))
            Next n
            'test array
            'Debug.Print Join(nums, ", ")
            'return the maximum value found
            maxNums = Application.Max(nums)
        End If
    End With
End Function

enter image description here

答案 3 :(得分:0)

您的小数点分隔符可能与美国小数点分隔符不同。

render() {
  return (
    <View>
      <Image source={remoteImage} style={styles.fullscreen}>
        <View style={styles.container}>
          <Image source={playIcon} style={styles.icon} />
          <Image source={volumeIcon} style={styles.icon} />
          <View style={styles.progress}>
            <View style={styles.progressBar} />
          </View>
          <Image source={hdIcon} style={styles.icon} />
          <Image source={fullScreenIcon} style={styles.icon} />
        </View>
      </Image>
    </View>
  );
}