Excel VBA – select,获取和设置表中的数据

我有一个工作表,里面有很多表格,我刚刚开始使用表格,因为它们看起来非常方便。 但是我从来没有在Excel表格中操作过内容。 这些表基本上是名字和姓氏列的列表。 根据这些列上的值,我想生成一个用户名。 但是我正在尝试编写一个通用的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) 

而现在我正在试图做同样的事情,只是从表中的数据。 有任何想法吗? 我已经添加了一个“ActiveSheet”的手表,看看我能否find表,他们似乎是在ActiveSheet.ListObjects ,但我看不到任何.Select选项那里。 也许我不需要select表来操纵它的内容?

当循环遍历一个范围(无论是在表中还是在一个范围内),将数据复制到variables数组,操作该数组,然后将结果复制回工作表通常会更快。

 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 

如果你真的想循环范围本身:

  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 

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

 =LOWER(LEFT([@FirstName],1)&[@LastName]) 

编辑

对不起,不知道从string中删除任何字符列表的公式方式。 你可能必须恢复到这个vba。 这是一个用户定义的function来做到这一点。 你的公式会变成

 =DeleteChars([@UserName],{"$","#"}) 

删除字符用你想删除的字符数组列表replace{"$","#"} (你可以根据需要制作列表)
replace字符使用{"$","#";"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