Vba 复制并重新排列包含字母和数字单元格的特定数据

Vba 复制并重新排列包含字母和数字单元格的特定数据,vba,excel,Vba,Excel,我有一张excel表格,其中的数据在B列和C列中以数字和字母随机排列。我还有一个位于单元格“O7”中的输入单元格和一个位于“P7”中的输出单元格,用户可以在其中输入任何值(1,1a、2,2b等),代码将使用这些值来查找和复制a列中的值 我的代码(如下)运行并根据“O7”中的值查找B中的值,并将A列中该行的相应值(2次)复制到“Sheet4”。然后它查找C列中的下一个单元格,并使用该值查找B列中具有该值的下一行。然后将A列中该行的值复制到上一列下的第4页 我的问题是,我的代码无法区分“1”和输入值

我有一张excel表格,其中的数据在B列和C列中以数字和字母随机排列。我还有一个位于单元格“O7”中的输入单元格和一个位于“P7”中的输出单元格,用户可以在其中输入任何值(1,1a、2,2b等),代码将使用这些值来查找和复制a列中的值

我的代码(如下)运行并根据“O7”中的值查找B中的值,并将A列中该行的相应值(2次)复制到“Sheet4”。然后它查找C列中的下一个单元格,并使用该值查找B列中具有该值的下一行。然后将A列中该行的值复制到上一列下的第4页

我的问题是,我的代码无法区分“1”和输入值或输出值中带有字母“1a”的值。它只是看到有一个“1”并复制a中的值。我相信我可能没有将NewStart变量设置为下一个要正确查找的值,或者我的函数可能缺少区分“1”和“1a”的内容

这是我用来使代码包含带有字母的单元格的函数。如果没有它,它将跳过带有字母的单元格:

Private Function GetSingleFromString(ByVal InString As String) As Single

    If Len(InString) <= -1 Then
        GetSingleFromString = -1
        Exit Function
    End If

    Dim X As Long
    Dim Temp1 As String
    Dim Output As String

    For X = 1 To Len(InString)
        Temp1 = Mid(InString, X, 1)
        If IsNumeric(Temp1) Or Temp1 = "." Then Output = Output & Temp1
    Next

    If Len(Output) > 0 Then
        GetSingleFromString = CSng(Output)
    Else
        GetSingleFromString = -1
    End If

End Function

提前感谢您的帮助。

不清楚您想做什么;我所能看到的是,您希望找到具有匹配值的单元格,该值可能是整个值,也可能只是值的数字部分

我所知道的是这个范围。Find没有你想象的那么有用:它有时会在搜索值或搜索范围是字符串时进行字符串比较,有时会根据单元格中的格式将数字值1与字符串“1”进行比较,从而确定它“不匹配”

如果您设置了LookAt:=xlWhole,它肯定会将“1”与“1a”视为“不匹配”,因为您指定了整个值,每个字符,都必须与搜索字符串完全匹配

大多数情况下,如果你想将“1”与“1a”视为“不匹配”,只将“1”与“1”以及“1a与”1a匹配,那么这很好

如果您想将“1”与“1a”视为“发现”,您有两种选择:

  • 在范围中使用部分匹配选项。按设置查找 看看:=xlPart,希望它不会因为格式设置而混淆。而且大多数时候,它不会混淆;所以您可能没事

  • 使用VBA搜索每个区域中的单元格,使用“Like”,可以指定部分匹配、单个数字以及列表中特定字符的匹配,如[1234567890]

  • 只是想让你从“喜欢”开始:

    “1”=“1a”返回False
    “1”类似于“1a”返回False
    “1”如“1*”返回True,尽管知道这一点不是很有用
    “1a”像“#*”一样返回True,这看起来更相关,因为您已经识别了一个以数字开头的值,您可以在If…然后包含进一步逻辑的块顶部进行测试,以进行实际需要的匹配。

    “Like”操作员的完整文档位于MSDN上:

    使用其他语言的开发人员将使用正则表达式来实现这类功能:但您需要为此导入一个外部正则表达式库,因为它不是Excel和VBA的本机





    另外:一个字符串的LEN值永远不能小于零。如果LEN(InString)值小于零,则测试不清楚您要做什么;我所看到的是,您希望找到具有匹配值的单元格,该值可能是整个值,也可能只是值的数字部分

    我所知道的是这个范围。Find没有你想象的那么有用:它有时会在搜索值或搜索范围是字符串时进行字符串比较,有时会根据单元格中的格式将数字值1与字符串“1”进行比较,从而确定它“不匹配”

    如果您设置了LookAt:=xlWhole,它肯定会将“1”与“1a”视为“不匹配”,因为您指定了整个值,每个字符,都必须与搜索字符串完全匹配

    大多数情况下,如果你想将“1”与“1a”视为“不匹配”,只将“1”与“1”以及“1a与”1a匹配,那么这很好

    如果您想将“1”与“1a”视为“发现”,您有两种选择:

  • 在范围中使用部分匹配选项。按设置查找 LookAt:=xlPart,希望它不会因为格式设置而混淆。而且大多数时候,它不会感到困惑;所以你可能很好

  • 使用VBA搜索每个区域中的单元格,使用“Like”,可以指定部分匹配、单个数字以及列表中特定字符的匹配,如[1234567890]

  • 只是想让你从“喜欢”开始:

    “1”=“1a”返回False
    “1”类似于“1a”返回False
    “1”如“1*”返回True,尽管知道这一点不是很有用
    “1a”像“#*”返回True,这看起来更相关,因为您已经识别了一个以数字开头的值,您可以在If的顶部进行测试。。。然后包含进一步逻辑的块,以进行实际需要的匹配

    “Like”操作员的完整文档位于MSDN上:

    使用其他语言的开发人员将使用正则表达式来实现这类功能:但您需要为此导入一个外部正则表达式库,因为它不是Excel和VBA的本机





    另外:字符串的LEN值不能小于零。你的测试如果Len(InString)我拿出了开头部分,因为我不需要它。基本上,我有一个单元格指定为输入值(O7),另一个单元格指定为输出值(P7)。任何人都可以用在c中看到的任何数字编辑此单元格
    Private Function GetSingleFromString(ByVal InString As String) As Single
    
        If Len(InString) <= -1 Then
            GetSingleFromString = -1
            Exit Function
        End If
    
        Dim X As Long
        Dim Temp1 As String
        Dim Output As String
    
        For X = 1 To Len(InString)
            Temp1 = Mid(InString, X, 1)
            If IsNumeric(Temp1) Or Temp1 = "." Then Output = Output & Temp1
        Next
    
        If Len(Output) > 0 Then
            GetSingleFromString = CSng(Output)
        Else
            GetSingleFromString = -1
        End If
    
    End Function
    
    A   B    C    D       E                                   
    1   1   1a  78.15   77.68     (Row 7)      
    2   1a  2   77.18   76.92
    3   2   3   76.92   76.63
    4   3   4   76.13   75.78
    5   4   4a  75.78   75.21
    6   4a  5   75.11   74.87
    7   5   5a  74.87   74.69
    8   5a  6   73.94   73.6
    9   6   6a  73.1    72.71
    10  6a  6b  72.41   72.18
    11  6b  10  72.18   71.6
    12  10  11  71.3    70.89
    13  11  12  70.89   69.83
    14  12  13  69.83   68.68
    15  13  14  68.68   67.68
    16  14  15  67.63   66.46
    17  15  16  66.01   64.84
    18  16  16a 64.24   63.72
    19  16a 16b 56.82   56.37
    20  16b 16c 56.37   55.18
    21  16c OUT 47.28   47.27
    22  7   7a  83.12   76.07
    23  7a  8   76.17   75.99
    24  8   9   74.79   74.41
    25  9   6   74.51   74           (Row 31)