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

时间:2015-07-28 17:20:46

标签: excel vba excel-vba

我有一张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“?

Sub NewerFind()

Dim Startval As Long
Dim Endval As Long
Dim LastRow As Long
Dim Rng As range
Dim Output As Long
Dim NewStart As Long

Dim Val As Long
Dim Valnew As Long

LastRow = Sheets("Sheet3").range("B" & Rows.Count).End(xlUp).Row

Startval = GetSingleFromString(Sheets("Sheet3").Cells(7, "O").Value)

Output = 2

NewStart = Startval


For X = 7 To LastRow

    Val = GetSingleFromString(Sheets("Sheet3").Cells(X, 2).Value)       'if i set the variables equal to a string, do i need the GetSingleFromString function?
    Valnew = GetSingleFromString(Sheets("Sheet3").Cells(X, 3).Value)
    Endval = GetSingleFromString(Worksheets("Sheet3").Cells(7, "P").Value)

    If Val = Endval Then
    Exit Sub

    ElseIf Val = NewStart Then
            Sheets("Sheet4").Cells(Output, 1).Value = _
                 Sheets("Sheet3").Cells(X, 1).Value
            Output = Output + 1

            Sheets("Sheet4").Cells(Output, 1).Value = _
                 Sheets("Sheet3").Cells(X, 1).Value
            Output = Output + 1
            NewStart = Valnew
    End If
    'need line of code to set NewStart as the value of the cell to the right...???????

Next X
End Sub

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

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

这是我的Excel工作表:

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)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你要做什么;我只能看到你想要找到具有匹配值的单元格,这可能是整个值,或者只是值的数字部分。

我所知道的是Range.Find没有您想象的那么有用:如果搜索值或搜索范围是字符串,它有时会进行字符串比较,如果尝试,有时会确定它是“不匹配”字符串“1”的数值1,具体取决于单元格中的格式。

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

如果您想将“1”与“1a”视为“不匹配”,并且仅将“1”与“1”和“1a”与“1a”匹配,那么大多数时候都没问题。

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

  1. 通过设置在Range.Find中使用部分匹配选项 LookAt:=xlPart,希望它不会因格式化而混淆。而且大多数时候,它不会混淆;所以你可能没事。

  2. 使用“赞”搜索每个范围内的单元格,使用“赞”,可以指定部分匹配,单个数字和特定字符匹配,如[1234567890]

  3. 只是为了让你开始'喜欢':

    "1" = "1a" 返回False
    "1" LIKE "1a" 返回False
    "1" LIKE "1*" 返回True,虽然知道这不是一件非常有用的事情 "1a" LIKE "#*"返回True,这看起来更相关,因为您已经确定了一个以数字开头的值,并且您可以在包含更多逻辑的If ... Then块的顶部进行测试。匹配你真正想要的。

    “赞”运算符的完整文档在MSDN上:

    https://msdn.microsoft.com/en-us/library/office/gg251796.aspx

    使用其他语言的开发人员将使用正则表达式进行此类操作:但您需要为其导入外部Regex库,因为它不是Excel和VBA的原生。




    另外:字符串永远不会有小于零的LEN。您的测试If Len(InString) <= -1 Then必须为零或小于1.