Excel 在指定的工作表行中查找并返回.Text数据类型的第一个实例

Excel 在指定的工作表行中查找并返回.Text数据类型的第一个实例,excel,vba,Excel,Vba,我想搜索一个特定的行,并将该行中包含的文本字符串的第一个实例赋给一个变量。字符串可以是任何文本字符串;它只需要是数据类型。text。我试过这个: dim firstText as string dim rowNum as integer firstText = sheets("Sheet1").Rows(rowNum).Find(What:=Format(vbString)) 例如,如果行包含:123、“apple”、“pear”和-456,则函数将返回遇到的第一个文本字符串,在本例中为“a

我想搜索一个特定的行,并将该行中包含的文本字符串的第一个实例赋给一个变量。字符串可以是任何文本字符串;它只需要是数据类型。text。我试过这个:

dim firstText as string
dim rowNum as integer

firstText = sheets("Sheet1").Rows(rowNum).Find(What:=Format(vbString))
例如,如果行包含:123、“apple”、“pear”和-456,则函数将返回遇到的第一个文本字符串,在本例中为“apple”

使用循环的替代方法:

dim firstText as string
dim rowNum as integer
dim i as integer
const stopCol = 100

For i = 1 To stopCol
    If VarType(Cells(rowNum, i)) = vbString Then
        firstText = Cells(rowNum, i)
        GoTo TheEnd
    End If
Next

TheEnd:

这也不行。

我同意@Scott对你问题的评论;检查单元格是否格式化为文本很可能不是您想要的,因为您可以在单元格中键入“=5”,然后单击“格式化为文本”-您还可以键入“=”Hello“并格式化为数字

相反,您可能希望检查特定单元格的值是否为数字,如下所示:

Sub duplicateSheets()

    Dim rowNum As Integer
    Dim searchRange As Range
    Dim testCell As Range
    Dim firstText As String

    rowNum = 10
    Set searchRange = Intersect(Sheets(2).UsedRange, Sheets(2).Range(rowNum & ":" & rowNum))

    For Each testCell In searchRange
        If Not (IsNumeric(testCell.Value)) Then
            firstText = testCell.Value
            Exit For
        End If
    Next

End Sub

这基本上就是上面的内容(使用不同的方法确定范围和循环),但它不检查单元格的格式类型,而是检查单元格中的数据是否以数字形式传递。它将拾取第一个未作为数字传递的单元格的值。

在格式上搜索的问题是,它要求单元格实际格式为文本*,这可能会产生误导。您可能需要循环遍历数据集,对每个单元格进行测试,然后返回通过(或失败)测试的第一个单元格(取决于测试)。@Scott Holtzman,尝试了上述替代方法。还是不起作用。@ScottHoltzman,你关于使用循环的一般建议很好,thanks@Bacon,有效,谢谢。由于vbString的实现,我的版本不起作用,但当我使用您的IsNumeric建议时,我的版本起作用。这不是问题所在。使用以下命令:
ìf testcell.numberformat=“@”然后
,这意味着如果格式为文本,请查看microsoft numberformat的帮助。@PatrickLepelletier Hi Patrick-我知道这不是问题所在,但在我看来,OP最好用于检查单元格内的实际内容,而不是格式为什么[如我的回答所示]。例如,用户可能会选择整个工作簿并说“格式为记帐”(我经常自己这样做,以避免单独选择每个数字单元格块)。这会使单元格中的文本值显示为数字格式,这很可能(但不是100%)不是OP想要的格式。