Excel VBA - 在表中选择,获取和设置数据

Ken*_*nes 2 excel vba excel-vba

我有一个包含很多表格的工作表,我只是开始使用表格,因为它们看起来非常方便.但我以前从未在Excel表格中操作内容.这些表基本上是带有Firstname和Lastname的列的列表.根据这些列的值,我想生成一个用户名.但我正在尝试编写一个带有参数的泛型Sub,例如工作表和表名.

以前我已经在数据没有出现在表格中时这样做了:

Cells(2, 2).Select

Do
    strFirstName = ActiveCell.Value
    strLastName = ActiveCell.Offset(0, 2).Value

    strFirstName = Left(strFirstName, 1)

    strUserName = strFirstName & strLastName
    strUserName = LCase(strUserName)

    ActiveCell.Offset(0, 5).Value = strUserName
    ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell)
Run Code Online (Sandbox Code Playgroud)

而现在我正在尝试做同样的事情,只有表中的数据.有任何想法吗?我添加了一个"ActiveSheet"手表,看看我是否可以找到它们ActiveSheet.ListObjects,但它们似乎已经存在,但我看不到任何.Select选项.也许我不需要选择表来操纵它的内容?

chr*_*sen 6

在循环范围内(无论是在表格中还是在范围内),将数据复制到变量数组,操作该数组,然后将结果复制回工作表通常会更快.

Sub zz()
    Dim oUsers As ListObject
    Dim v As Variant
    Dim vUserName() As Variant
    Dim i As Long
    Dim colFirst As Long
    Dim colLast As Long
    Dim colUser As Long

    Set oUsers = ActiveSheet.ListObjects(1)
    colFirst = oUsers.ListColumns("FirstName").Index
    colLast = oUsers.ListColumns("LastName").Index
    colUser = oUsers.ListColumns("UserName").Index

    v = oUsers.DataBodyRange
    ReDim vUserName(1 To UBound(v, 1), 1 To 1)
    For i = 1 To UBound(v, 1)
        vUserName(i, 1) = LCase(Left(v(i, colFirst), 1) & v(i, colLast))
    Next
    oUsers.ListColumns("UserName").DataBodyRange = vUserName


End Sub
Run Code Online (Sandbox Code Playgroud)

如果你真的想要遍历范围本身:

    For i = 1 To oUsers.ListRows.Count
        oUsers.ListColumns("UserName").DataBodyRange.Rows(i) = LCase(Left( _
         oUsers.ListColumns("FirstName").DataBodyRange.Rows(i), 1) & _
         oUsers.ListColumns("LastName").DataBodyRange.Rows(i))
    Next
Run Code Online (Sandbox Code Playgroud)

对于这种情况,您也可以在UserName列本身中使用公式,不需要vba

=LOWER(LEFT([@FirstName],1)&[@LastName])
Run Code Online (Sandbox Code Playgroud)

编辑

抱歉,不知道从字符串中删除任何字符列表的公式方法.您可能必须为此恢复为vba.这是用户定义的功能.你的配方将成为

=DeleteChars([@UserName],{"$","#"})
Run Code Online (Sandbox Code Playgroud)

删除字符替换为要删除的字符{"$","#"}数组列表(您可以根据需要创建列表)
替换字符,请使用{"$","#";"X","X"}列表中的列表; 是旧的人物,后; 新的.确保列表的长度相同.

UDF代码:

Function DeleteChars(r1 As Range, ParamArray c() As Variant) As Variant
    Dim i As Long
    Dim s As String

    s = r1
    If UBound(c(0), 1) = 1 Then
        For i = LBound(c(0), 2) To UBound(c(0), 2)
            s = Replace(s, c(0)(1, i), "")
        Next
    Else
        For i = LBound(c(0), 2) To UBound(c(0), 2)
            s = Replace(s, c(0)(1, i), c(0)(2, i))
        Next
    End If
    DeleteChars = s
End Function
Run Code Online (Sandbox Code Playgroud)